Java实现Excel数据批量导入数据库

概述:

这个小工具类是工作中的一个小插曲哦,因为提数的时候需要跨数据库导数... 有的是需要从oracle导入mysql ,有的是从mysql导入oracle

实践之后我们会发现 使用navicat工具连接mysql数据库, 从oracle数据库中导出数据为csv格式,再导入mysql是很快的,大概是分分钟的问题吧

但是当我们使用plsql连接oracle数据库,然后在mysql数据库中导出sql文件形式的数据想要插入oracle的时候,就很慢了.....  我一般是5万条的数据 6个字段,在开启命令窗口执行需要执行差不多2小时~  这个真的太可怕了 而且有时候工具有问题,还被迫中断....  又要重新开始... 效率太低了

所以有了以下导数工具类.

新建maven项目,项目名称可自定义哦

ExecuteDataExcelToOracle.java 类,使用的时候直接执行main方法即可

  需要替换你的Excel文件

  需要替换你的数据库连接信息

  需要替换你的表信息,以及字段 (这里字段还与内部了 Data相关哦,如果你需要导入的字段大于10个请自己继续添加哈~)

主要做了以下几件事:

1.解析Excel文件,将Excel文件中的数据逐条的放入对象中

2. 连接数据库,将数据插入数据库

通过此工具类导入数据,5万条数据大概只要2分钟吧,而且大部分时间都是花在解析excel上~,效率简直不是一般的高哈哈哈哈~

package com.imodule.dataImport.dataImport.main;

import java.io.File;
import java.io.FileInputStream;
import java.io.Serializable;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Date; import org.apache.commons.lang.StringUtils;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory; public class ExecuteDataExcelToOracle { public static void main(String[] args) { try {
List<Data> datas = loadExcel("C:/Users/xxxx/Desktop/aa.xlsx");//需要替换
batchInsert(datas); } catch (Exception e) {
e.printStackTrace();
} } /**
* 获取excel中的数据
* @param filepath
* @return
* @throws Exception
*/
public static List<Data> loadExcel(String filepath) throws Exception{
File file = new File(filepath);
Workbook wb = WorkbookFactory.create(new FileInputStream(file));
Sheet sheet = wb.getSheetAt(0);
List<Data> datas = new ArrayList<>();//将数据添加到数据一行一行的添加到集合中,作为插入数据的入参
Row row = null;
for (int i = 1; i <= sheet.getLastRowNum(); i++) {
System.out.println("i="+i);
row = sheet.getRow(i);
if(row == null || StringUtils.isEmpty(row.getCell(0).getStringCellValue())){
continue;
}
Data data = new ExecuteDataExcelToOracle().new Data();
data.setStr1(row.getCell(0) == null? "":row.getCell(0).getStringCellValue());
data.setStr2(row.getCell(1) == null? "":row.getCell(1).getStringCellValue());
data.setStr3(row.getCell(2) == null? "":row.getCell(2).getStringCellValue());
data.setStr4(row.getCell(3) == null? "":row.getCell(3).getStringCellValue());
data.setStr5(row.getCell(4) == null? "":row.getCell(4).getStringCellValue());
data.setStr6(row.getCell(5) == null? "":row.getCell(5).getStringCellValue()); // row.getCell(5).setCellType(CellType.STRING);
if(row.getCell(6) == null){
data.setStr7("");
}else{
Date d = (Date) row.getCell(6).getDateCellValue();
DateFormat formater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date = formater.format(d);
data.setStr7(date);
} data.setStr8(row.getCell(7) == null? "":row.getCell(7).getStringCellValue());
data.setStr9(row.getCell(8) == null? "":row.getCell(8).getStringCellValue());
data.setStr10(row.getCell(9) == null? "":row.getCell(9).getStringCellValue()); datas.add(data); }
return datas;
} /**
* 批量执行插入数据
* @param datas
*/
public static void batchInsert(List<Data> datas){
long startTime = System.currentTimeMillis(); Connection conn = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver"); //如果是oracle就不需要替换,如果是mysql就需要替换
conn=DriverManager.getConnection("jdbc:oracle:thin:@10.11.22.33:1521:demo", "root","111"); //需要替换
conn.setAutoCommit(false); PreparedStatement stmt = conn.prepareStatement("INSERT INTO temp_user_info VALUES (?,?,?,?,?,?,?,?,?,?)"); //需要替换 //System.out.println("数据大小:" + datas.size()); int num = 0;
for (Data v : datas) {
num++;
stmt.setString(1, v.getStr1());
stmt.setString(2, v.getStr2());
stmt.setString(3, v.getStr3());
stmt.setString(4, v.getStr4());
stmt.setString(5, v.getStr5());
// stmt.setString(6, v.getStr6());
stmt.setString(6, v.getStr6());
stmt.setString(7, v.getStr7());
stmt.setString(8, v.getStr8());
stmt.setString(9, v.getStr9());
stmt.setString(10, v.getStr10());
stmt.addBatch();
// 每5万,提交一次
if (num > 50000) {
stmt.executeBatch();
conn.commit();
num = 0;
}
}
stmt.executeBatch();
conn.commit();
} catch (Exception e) {
e.printStackTrace();
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
} finally {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
long endTime = System.currentTimeMillis();
System.out.println("方法执行时间:" + (endTime - startTime) + "ms");
}
} class Data implements Serializable{
private static final long serialVersionUID = 1L; private String str1;
private String str2;
private String str3;
private String str4;
private String str5;
private String str6;
private String str7;
private String str8;
private String str9;
private String str10;
public String getStr7() {
return str7;
}
public void setStr7(String str7) {
this.str7 = str7;
}
public String getStr8() {
return str8;
}
public void setStr8(String str8) {
this.str8 = str8;
}
public String getStr9() {
return str9;
}
public void setStr9(String str9) {
this.str9 = str9;
}
public String getStr10() {
return str10;
}
public void setStr10(String str10) {
this.str10 = str10;
}
public String getStr1() {
return str1;
}
public void setStr1(String str1) {
this.str1 = str1;
}
public String getStr2() {
return str2;
}
public void setStr2(String str2) {
this.str2 = str2;
}
public String getStr3() {
return str3;
}
public void setStr3(String str3) {
this.str3 = str3;
}
public String getStr4() {
return str4;
}
public void setStr4(String str4) {
this.str4 = str4;
}
public String getStr5() {
return str5;
}
public void setStr5(String str5) {
this.str5 = str5;
}
public String getStr6() {
return str6;
}
public void setStr6(String str6) {
this.str6 = str6;
} } }

  

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com.imodule.dataImport</groupId>
<artifactId>dataImport</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging> <name>dataImport</name>
<url>http://maven.apache.org</url> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties> <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency> <!-- poi 相关 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>4.0.1</version>
</dependency> <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency> <!-- https://mvnrepository.com/artifact/commons-lang/commons-lang -->
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.4</version>
</dependency> <!-- https://mvnrepository.com/artifact/com.oracle/ojdbc6 -->
<dependency>
<groupId>ojdbc</groupId>
<artifactId>ojdbc</artifactId>
<version>6</version>
</dependency> </dependencies>
</project>

  

这个pom里面需要主要这个包好像比较难拿到

 <dependency>
<groupId>ojdbc</groupId>
<artifactId>ojdbc</artifactId>
<version>6</version>
</dependency>

这个我看看啥时候有时间就把这个包传到我github上去,到时候会更新博客,提供下载地址的

==============20190107更新 有小伙伴在问我这个包的下载地址,今天就上传到github上了,感谢提醒哈哈哈哈 不然我都快要忘记自己还有这项事情未完成了==start====================

github下载地址:https://github.com/DFX339/odbcJar.git

 ==============20190107更新 有小伙伴在问我这个包的下载地址,今天就上传到github上了,感谢提醒哈哈哈哈 不然我都快要忘记自己还有这项事情未完成了==end====================

还有一个就是在导入数据的时候需要注意两个值
1.null
2.日期类型的值

关于null,我的处理方案是先判断是否为null,如果为null就赋值""

data.setStr1(row.getCell(0) == null? "":row.getCell(0).getStringCellValue());

关于日期,我的处理方案是手动转换 (这里不能直接用数据类型,会把日期自动计算为 49555.4类似的数据,到时候存到数据库也是这样的数据,所以我们还是用这个字符串吧~)

  if(row.getCell(6) == null){
data.setStr7("");
}else{
Date d = (Date) row.getCell(6).getDateCellValue();
DateFormat formater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date = formater.format(d);
data.setStr7(date);
}

  

Java实现Excel数据批量导入数据库的更多相关文章

  1. 关于Excel数据批量导入数据库的案例

    写这个案例主要是感觉这个功能挺实用,很多地方会用得到的,废话就不多说了,直接上对应的源码. 这个案例我运用的是Winform窗体程序实现数据的导入. 首先是数据库的登陆界面如下: 源码如下: usin ...

  2. 使用python,将excel数据批量导入数据库

    这是上一篇文章的优化版本,相较于一条一条的执行sql语句,本文中,将excel中所有的数据先写到list列表中 在通过函数 cursor.executemany(sql, list) 一次性写入到数据 ...

  3. 将Excle中的数据批量导入数据库

    namespace 将Excle中的数据批量导入数据库{    class Program    {        static void Main(string[] args)        { S ...

  4. 将execl里的数据批量导入数据库

    本文将采用NPOI插件来读取execl文件里的数据,将数据加载到内存中的DataTable中 /// <summary> /// 将Excel转换为DataTable /// </s ...

  5. Excel数据批量导入到数据库

    1.今天做批量导入网上找了个例子,改了改,运行起来了.用POI实现Excel的读取,需要jar包. 2.ReadExcel.java读取数据 /** * */ package com.b510.exc ...

  6. MySQL中load data infile将文件中的数据批量导入数据库

    有时候我们需要将文件中的数据直接导入到数据库中,那么我们就可以使用load data infile,下面具体介绍使用方法. dao中的方法 @Autowired private JdbcTemplat ...

  7. 将Excel中的数据批量导入数据库表

    private boolean import_to_database(String excel_path) throws BiffException, IOException, HsException ...

  8. Excel数据批量导入到数据库2

    1.导包(共3个) 2.jsp <s:form action="ReadExcel.action" method="post" enctype=" ...

  9. Excel数据批量导入到SqlServer的方法

    1,以Excel为数据源建立连接导入. 关键点在于Excel的数据要有表头,表头要和数据库表的列名一样.连接字符串中HDR=YES不能省略,也就是第一行是表头的意思.IMEX=1;是把数据都当作字符串 ...

随机推荐

  1. 浅谈python中的“ ==” 与“ is”、还有cmp

    总之,比较内容相等使用 ‘==’ 1.is" 是用来比较 a 和 b 是不是指向同一个内存单元,而"=="是用来比较 a 和 b指向的内存单元中的值是不是相等 2.pyt ...

  2. Activity调用isDestroyed()方法报出,java.lang.NoSuchMethodError

    在測试App的过程中,Activity调用了isDestroyed()方法,报出了java.lang.NoSuchMethodError错误. 自己手机MI 2S,版本号4.1.1. 事实上原因就是i ...

  3. Mac 使用smb协议连接FTPserver

    在Mac中,能够通过smb协议作为client连接到server,比如一个FTPserver,然后获取上面的共享文件. 方法: 1.在Finder菜单中点击前往 -- 连接server. 也能够Com ...

  4. API Copy Big FIles

    public class ApiCopyFile { private const int FO_COPY = 0x0002; private const int FOF_ALLOWUNDO = 0x0 ...

  5. Jenkins系列之-—01 简介&新建任务

    一.Jenkins 简介 Jenkins是一个可扩展的持续集成引擎. 主要用于: l 持续.自动地构建/测试软件项目.l 监控一些定时执行的任务. Jenkins拥有的特性包括: l 易于安装-只要把 ...

  6. AnkhSVN介绍

    AnkhSVN介绍 Posted on 2012-11-15 23:24 ArRan 阅读(3120) 评论(1) 编辑 收藏 AnkhSVN是一款在VS中管理Subversion的插件,您可以在VS ...

  7. OpenCV图像处理篇之图像平滑

    图像平滑算法 图像平滑与图像模糊是同一概念,主要用于图像的去噪.平滑要使用滤波器.为不改变图像的相位信息,一般使用线性滤波器,其统一形式例如以下: %20\Large%20g(i,j)=\sum_{k ...

  8. Python的调用程序

    任务 调用系统命令ping 判断局域网内有哪些主机存活 假设你用c语言写了一个算法,需要对该算法进行测试.测试的数据集几百个.这时可以使用过GCC生成test.exe,再使用python批量调用该ex ...

  9. Linux安全应用之防垃圾邮件server的构建

    Linux安全应用之防垃圾邮件server的构建 一.垃圾邮件产生的原因 垃圾邮件(SPAM) 也称作UCE(Unsoticited Commercial Email.未经许可的商业电子邮件)或UBE ...

  10. Linux Shell 条件测试

    1. 文件测试 -d 目录 -s 文件非空 -f 是正规文件 -w 有写权限 -r 有读权限 -x 有执行权限 -L 符号连接 -u 文件有suid位设置