使用POI、JavaCsv工具读取excel文件(*.xls , *.xlsx , *.csv)存入MySQL数据库
首先进行maven的配置:导入相关依赖
1 <dependency>
2 <groupId>org.apache.poi</groupId>
3 <artifactId>poi</artifactId>
4 <version>3.14</version>
5 </dependency>
6 <dependency>
7 <groupId>org.apache.poi</groupId>
8 <artifactId>poi-ooxml</artifactId>
9 <version>3.14</version>
10 </dependency>
11 <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml-schemas -->
12 <dependency>
13 <groupId>org.apache.poi</groupId>
14 <artifactId>poi-ooxml-schemas</artifactId>
15 <version>3.14</version>
16 </dependency>
17 <!-- https://mvnrepository.com/artifact/org.apache.xmlbeans/xmlbeans -->
18 <dependency>
19 <groupId>org.apache.xmlbeans</groupId>
20 <artifactId>xmlbeans</artifactId>
21 <version>3.0.0</version>
22 </dependency>
23 <dependency>
24 <groupId>junit</groupId>
25 <artifactId>junit</artifactId>
26 <version>4.12</version>
27 <scope>test</scope>
28 </dependency>
29 <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
30 <dependency>
31 <groupId>mysql</groupId>
32 <artifactId>mysql-connector-java</artifactId>
33 <version>5.1.47</version>
34 </dependency>
35
36 <!-- https://mvnrepository.com/artifact/net.sourceforge.javacsv/javacsv -->
37 <dependency>
38 <groupId>net.sourceforge.javacsv</groupId>
39 <artifactId>javacsv</artifactId>
40 <version>2.0</version>
41 </dependency>
42 <dependency>
43 <groupId>org.jetbrains</groupId>
44 <artifactId>annotations-java5</artifactId>
45 <version>RELEASE</version>
46 <scope>compile</scope>
47 </dependency>
完整源码:
1 public interface ReadFile {
2 //返回值是不包含表头的所有数据
3 public ArrayList<ArrayList<String>> readExcelFile(String path) throws IOException, SQLException;
4 //返回值是有错误的数据
5 public ArrayList<ArrayList<String>> readCsvFile(String path ,String code) throws IOException, SQLException;
6 }
1 import com.csvreader.CsvReader;
2 import com.reliable.dao.ReadFile;
3 import com.reliable.util.JDBCUtil;
4 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
5 import org.apache.poi.ss.usermodel.Cell;
6 import org.apache.poi.ss.usermodel.Row;
7 import org.apache.poi.ss.usermodel.Sheet;
8 import org.apache.poi.ss.usermodel.Workbook;
9 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
10 import java.io.File;
11 import java.io.FileInputStream;
12 import java.io.IOException;
13 import java.nio.charset.Charset;
14 import java.sql.Connection;
15 import java.sql.PreparedStatement;
16 import java.sql.SQLException;
17 import java.util.ArrayList;
18
19 public class ReadFileImpl implements ReadFile {
20 //相关变量
21 private int MAX_CELL_NUM; //excel文件的最大单元格数
22 private PreparedStatement preparedStatement=null;
23 private Connection conn =null;
24 //--------------------------------------------------
25 public ArrayList<ArrayList<String>> readExcelFile(String path) throws IOException, SQLException {
26 String DROP_TABLE_1=""; //删除源数据表sql语句
27 String DROP_TABLE_2=""; //删除备份表sql语句
28 String CREATE_TABLE_1_SQL=""; //创建源数据表语句
29 String CREATE_TABLE_2_SQL=""; //创建备份表语句
30 String tableName_1=""; //源数据表名
31 String tableName_2=""; //备份表名
32 ArrayList<String> tableField = new ArrayList<String>(); //数据表字段名
33 ArrayList<ArrayList<String>> tableValue = new ArrayList<ArrayList<String>>(); //数据表的值
34 System.out.println(path);
35 File excel=new File(path);
36 String[] split = excel.getName().split("\\."); //.是特殊字符,需要转义!
37 System.out.println(split[0]+" "+split[1]);
38 tableName_1=split[0]; //给源数据表名赋值
39 tableName_2=split[0]+split[1]; //给备份表名赋值
40 System.out.println("源数据表名:" + tableName_1);
41 System.out.println("备份表名: " + tableName_2);
42 Workbook wb; //新建文件
43 FileInputStream fileStream = new FileInputStream(excel); //文件流对象
44 //根据文件后缀(xls/xlsx)进行判断
45 if ( "xls".equals(split[1])){
46 //xls和csv文件
47 wb = new HSSFWorkbook(fileStream);
48 }else{
49 //xlsx文件
50 wb = new XSSFWorkbook(new FileInputStream(excel));
51 }
52 //开始解析
53 Sheet sheet = wb.getSheetAt(0); //读取sheet 0
54 MAX_CELL_NUM=getMaxCellNumExcel(sheet);
55 int firstRowIndex = sheet.getFirstRowNum(); //获取第一行索引
56 int lastRowIndex = sheet.getLastRowNum(); //获取最后一行索引
57 for(int rIndex = firstRowIndex; rIndex <= lastRowIndex; rIndex++) { //遍历行
58 Row row = sheet.getRow(rIndex); //获取行索引
59 ArrayList<String> tempTableValue = new ArrayList<String>(); //暂存一行的值,之后放到tableValue
60 if (row != null) {
61 int lastCellIndex = MAX_CELL_NUM; //行的最后一个单元格
62 for (int cIndex = 0; cIndex < lastCellIndex; cIndex++) { //遍历列(单元格)
63 Cell cell = row.getCell(cIndex,Row.RETURN_BLANK_AS_NULL);
64 cell.setCellType(Cell.CELL_TYPE_STRING);
65 if ((cell == null)) {
66 tempTableValue.add("NULL");
67 }else {
68 tempTableValue.add(cell.getStringCellValue());
69 }
70 }
71 System.out.println("第"+ String.valueOf(rIndex+1)+"行的值:"+ " "+tempTableValue);
72 tableValue.add(tempTableValue);
73 }
74 // System.out.println(tempTableValue);
75 System.out.println("-----------------------------");
76 }
77 System.out.println(tableValue); //输出表格的所有值
78 tableField= tableValue.get(0); //把表头信息放到tableFiled
79 tableValue.remove(0); //之后把所有值的这个list的第一行数据去掉
80 System.out.println("数据表字段: " + tableField);
81 wb.close();
82
83 //---------------------------------------------------------------------
84 //下面开始插入数据库:
85 //获取数据库连接
86 conn = JDBCUtil.getConnection();
87 if(conn!=null){
88 System.out.println("数据库连接成功!");
89 }else {
90 System.out.println("数据库连接失败!");
91 }
92 //根据表头和表名写SQL建表语句----------源数据表
93 DROP_TABLE_1="DROP TABLE IF EXISTS "+tableName_1 +";";
94 DROP_TABLE_2="DROP TABLE IF EXISTS "+tableName_2 +";";
95 CREATE_TABLE_1_SQL="CREATE TABLE " +"`" +tableName_1+"`"+ "(";
96 CREATE_TABLE_1_SQL = getExcelSQL(CREATE_TABLE_1_SQL,tableField);
97 // System.out.println(CREATE_TABLE_1_SQL);
98 //备份表语句
99 CREATE_TABLE_2_SQL= "CREATE TABLE " +"`" +tableName_2+"`"+ "(";
100 CREATE_TABLE_2_SQL = getExcelSQL(CREATE_TABLE_2_SQL,tableField);
101
102 System.out.println("源数据表的建表语句: "+"\n" + CREATE_TABLE_1_SQL);
103 System.out.println("备份表的建表语句: " +"\n" + CREATE_TABLE_2_SQL);
104 preparedStatement = conn.prepareStatement(DROP_TABLE_1);
105 preparedStatement.executeUpdate();
106 preparedStatement= conn.prepareStatement(CREATE_TABLE_1_SQL);
107 preparedStatement.executeUpdate();
108 preparedStatement = conn.prepareStatement(DROP_TABLE_2);
109 preparedStatement.executeUpdate();
110 preparedStatement= conn.prepareStatement(CREATE_TABLE_2_SQL);
111 preparedStatement.executeUpdate();
112 conn.setAutoCommit(false);
113 conn.commit();
114 JDBCUtil.release(conn,preparedStatement);
115 insertExcelTable(tableValue,tableName_1);
116 insertExcelTable(tableValue,tableName_2);
117 return tableValue;
118 }
119 //读CSV文件
120 public ArrayList<ArrayList<String>> readCsvFile(String path,String code) throws SQLException {
121 ArrayList<ArrayList<String>> WrongData=new ArrayList<ArrayList<String>>();
122 System.out.println(path);
123 String DROP_TABLE_1=""; //删除源数据表sql语句
124 String DROP_TABLE_2=""; //删除备份表sql语句
125 String CREATE_TABLE_1_SQL=""; //创建源数据表语句
126 String CREATE_TABLE_2_SQL=""; //创建备份表语句
127 ArrayList<String> tableField = new ArrayList<String>(); //数据表字段名
128 ArrayList<ArrayList<String>> tableValue = new ArrayList<ArrayList<String>>(); //数据表的值
129 String tableName_1=""; //源数据表名
130 String tableName_2=""; //备份表名
131 try {
132 // 创建CSV读对象
133 CsvReader csvReader = new CsvReader(path,',', Charset.forName(code));
134 String[] split1 = path.split("\\."); //.是特殊字符,需要转义!
135 // System.out.println(split1[0]+" "+split1[1]);
136 String[] split2 = split1[0].split("\\\\");
137 // System.out.println(split2[split2.length-1]);
138 tableName_1=split2[split2.length-1];
139 tableName_2=split2[split2.length-1]+split1[1];
140 System.out.println("输出源表名:"+tableName_1);
141 System.out.println("输出备份表名:"+tableName_2);
142 // 跳过表头
143 // csvReader.readHeaders();
144 boolean flag=true;
145 while (csvReader.readRecord()){
146 // 读一整行
147 String resString="";
148 resString = csvReader.getRawRecord();
149 resString=resString.replace(",",", ");
150 System.out.println(resString);
151 if(flag==true){
152 tableField.add(resString);
153 flag=false;
154 }
155 // System.out.println(resString);
156 String[] resString_list=resString.split(",");
157 String[] tableField_list=tableField.get(0).split(",");
158 ArrayList<String> tempTableValue = new ArrayList<String>(); //暂存一行的值,之后放到tableValue
159 if(resString_list.length != tableField_list.length){
160 tempTableValue.add(resString);
161 WrongData.add(tempTableValue);
162 }else {
163 tempTableValue.add(resString);
164 tableValue.add(tempTableValue);
165 }
166 }
167 } catch (IOException e) {
168 e.printStackTrace();
169 }
170 System.out.println(tableValue);
171 tableValue.remove(0); //之后把所有值的这个list的第一行数据去掉
172 System.out.println("数据表字段: " + tableField);
173 //name1,sex1,age1
174 // System.out.println(tableValue.get(0).get(0));
175 DROP_TABLE_1="DROP TABLE IF EXISTS "+tableName_1 +";";
176 DROP_TABLE_2="DROP TABLE IF EXISTS "+tableName_2 +";";
177 CREATE_TABLE_1_SQL="CREATE TABLE "+ tableName_1 +"(" ;
178 CREATE_TABLE_2_SQL="CREATE TABLE "+ tableName_2 +"(" ;
179 //生成源表建表语句
180 CREATE_TABLE_1_SQL=getCsvSQL(CREATE_TABLE_1_SQL,tableField);
181 //生成备份表建表语句
182 CREATE_TABLE_2_SQL=getCsvSQL(CREATE_TABLE_2_SQL,tableField);
183 System.out.println(CREATE_TABLE_1_SQL);
184 System.out.println(CREATE_TABLE_2_SQL);
185 conn=JDBCUtil.getConnection();
186 preparedStatement = conn.prepareStatement(DROP_TABLE_1);
187 preparedStatement.executeUpdate();
188 preparedStatement= conn.prepareStatement(CREATE_TABLE_1_SQL);
189 preparedStatement.executeUpdate();
190 preparedStatement = conn.prepareStatement(DROP_TABLE_2);
191 preparedStatement.executeUpdate();
192 preparedStatement= conn.prepareStatement(CREATE_TABLE_2_SQL);
193 preparedStatement.executeUpdate();
194 conn.setAutoCommit(false);
195 conn.commit();
196 JDBCUtil.release(conn,preparedStatement);
197 insertCsvTable(tableValue,tableName_1);
198 insertCsvTable(tableValue,tableName_2);
199 return WrongData;
200 }
201 //--------------------------------------------------
202 //获取excel文件建表SQL语句的方法
203 public String getExcelSQL(String SQL,ArrayList<String> tableField) {
204 for (int i =0 ;i<tableField.size();i++){
205 String item= tableField.get(i);
206 if(i!=tableField.size()-1){
207 SQL=SQL + "`" + item + "`" +" text COLLATE utf8_general_ci,"+"\n";
208 }else{
209 SQL=SQL + "`" + item + "`" +" text COLLATE utf8_general_ci "+"\n";
210 }
211 }
212 return SQL+") ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;";
213 }
214 //获取CSV文件的建表sql语句
215 public String getCsvSQL(String SQL,ArrayList<String> tableField){
216 // System.out.println(tableField);
217 String [] tempField=tableField.get(0).split("\\,");
218 for (int i =0 ;i<tempField.length;i++)
219 {
220 String item= tempField[i];
221 if(i!=tempField.length-1){
222 SQL=SQL + "`" + item + "`" +" text COLLATE utf8_general_ci,"+"\n";
223 }else{
224 SQL=SQL + "`" + item + "`" +" text COLLATE utf8_general_ci "+"\n";
225 }
226 }
227 return SQL+") ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;";
228 }
229 //--------------------------------------------------
230 //插入数据库 xls和xlsx文件
231 public void insertExcelTable(ArrayList<ArrayList<String>> tableValue, String tableName){
232 conn=JDBCUtil.getConnection();
233 String INSERT_TABLE_SQL="INSERT INTO "+tableName+" VALUES(";
234 for (ArrayList<String> item1 : tableValue){
235 String tempString=new String();
236 for (int i =0 ;i<item1.size();i++){
237 if(i!=item1.size()-1){
238 tempString=tempString+"\""+item1.get(i)+"\""+",";
239 }
240 else{
241 tempString=tempString+"\""+item1.get(i)+"\"";
242 }
243 }
244 INSERT_TABLE_SQL=INSERT_TABLE_SQL+tempString+");";
245 System.out.println(INSERT_TABLE_SQL);
246 try{
247 preparedStatement= conn.prepareStatement(INSERT_TABLE_SQL);
248 preparedStatement.executeUpdate();
249 conn.setAutoCommit(false);
250 conn.commit();
251 System.out.println("\n");
252 }catch(SQLException e){
253 e.printStackTrace();
254 }
255 INSERT_TABLE_SQL="INSERT INTO "+tableName+" VALUES(";
256 }
257 }
258 public void insertCsvTable(ArrayList<ArrayList<String>> tableValue , String tableName){
259 conn=JDBCUtil.getConnection();
260 System.out.println("数据表长度: " + tableValue.size());
261 for (int i=0 ;i<tableValue.size();i++){
262 String INSERT_TABLE_SQL="INSERT INTO "+tableName+" VALUES( ";
263 String tempString=new String();
264 String[] tempValue={};
265 tempValue=tableValue.get(i).get(0).split("\\,");
266 // System.out.println(tempValue[tempValue.length-1]);
267 for (int k=0 ; k<tempValue.length; k++)
268 {
269 if(k!=tempValue.length-1){
270 tempString=tempString +"\"" +tempValue[k]+"\"" +",";
271 }
272 else{
273 tempString=tempString+"\"" +tempValue[k]+"\"";
274 }
275 }
276 INSERT_TABLE_SQL=INSERT_TABLE_SQL+tempString+");";
277 System.out.println(INSERT_TABLE_SQL);
278 try{
279 preparedStatement= conn.prepareStatement(INSERT_TABLE_SQL);
280 preparedStatement.executeUpdate();
281 conn.setAutoCommit(false);
282 conn.commit();
283 }catch(SQLException e){
284 e.printStackTrace();
285 }finally{
286 //关闭数据库连接
287 }
288 }
289 }
290 //--------------------------------------------------
291 //获取excel表一行最大的单元格数目的方法
292 public int getMaxCellNumExcel(Sheet sheet){
293 int resNum=0;
294 int firstRowIndex = sheet.getFirstRowNum(); //获取第一行索引
295 int lastRowIndex = sheet.getLastRowNum(); //获取最后一行索引
296 for(int rIndex = firstRowIndex; rIndex <= lastRowIndex; rIndex++) { //遍历行
297 Row row = sheet.getRow(rIndex); //获取行索引
298
299 if(row.getLastCellNum()>resNum){
300 resNum=row.getLastCellNum();
301 }
302 }
303 return resNum;
304 }
305 //获取csv表一行最大的单元格数目的方法
306 public int getMaxCellNumCsv(ArrayList<String> tableField){
307 int resNum=0;
308 resNum=tableField.size();
309 return resNum;
310 }
311 }
使用POI、JavaCsv工具读取excel文件(*.xls , *.xlsx , *.csv)存入MySQL数据库的更多相关文章
- java读取excel文件(.xls,xlsx,csv)
前提,maven工程通过poi读写excel文件,需要在pom.xml中配置依赖关系: 在<dependencies>中添加如下代码 <dependency> <grou ...
- phpexcel读取excel的xls xlsx csv格式
我之前写过一篇PHP读取csv文件的内容 上代码index.php <?php /** * * @author XC * */ class Excel { public $currentShee ...
- (转)如何将 Excel 文件导入到 Navicat for MySQL 数据库
场景:工作中需要统计一段时间的加班时长,人工统计太过麻烦,就想到使用程序实现来统计 1 如何将 Excel 文件导入到 Navicat for MySQL 数据库 Navicat for MySQL ...
- 使用Apache下poi创建和读取excel文件
一:使用apache下poi创建excel文档 @Test /* * 使用Apache poi创建excel文件 */ public void testCreateExcel() { // 1:创建一 ...
- java使用poi.3.10读取excel 2003 (xls格式)
最近在做一个Excel导入数据库的案例,整理文档出来供大家参考. 1.下载 最新的 poi http://poi.apache.org/download.html 2.解压 把相关jar包引进项 ...
- Java实现POI读取Excel文件,兼容后缀名xls和xlsx
1.引入所需的jar包: maven管理项目的话直接添加以下坐标即可: <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -- ...
- 使用POI读取excel文件内容
1.前言 项目中要求读取excel文件内容,并将其转化为xml格式.常见读取excel文档一般使用POI和JExcelAPI这两个工具.这里我们介绍使用POI实现读取excel文档. 2.代码实例: ...
- 项目一:第四天 1、快递员的条件分页查询-noSession,条件查询 2、快递员删除(逻辑删除) 3、基于Apache POI实现批量导入区域数据 a)Jquery OCUpload上传文件插件使用 b)Apache POI读取excel文件数据
1. 快递员的条件分页查询-noSession,条件查询 2. 快递员删除(逻辑删除) 3. 基于Apache POI实现批量导入区域数据 a) Jquery OCUpload上传文件插件使用 b) ...
- 使用jxl,poi读取excel文件
作用:在java后台添加一个方法,读取导入的excel内容,根据需要返回相应的sql语句,以完成对临时表的插入操作. 使用jxl读取excel文件 package com.sixthf.bi.sapp ...
- JAVA使用POI读取EXCEL文件的简单model
一.JAVA使用POI读取EXCEL文件的简单model 1.所需要的jar commons-codec-1.10.jarcommons-logging-1.2.jarjunit-4.12.jarlo ...
随机推荐
- Java集合框架学习(十三) Collections类详解
Collections类介绍 这个类操作或返回集合的专有静态方法. 它包含多态算法,利用wrappers(封装器)返回指定集合类型的新集合,以及其他一些零散功能. 如果该类的方法引用的集合或类对象为n ...
- win32 - 以编程方式访问远程计算机上的文件
第一步,在一台计算机上将某个驱动器或者某个文件夹设为sharing模式.这是我们需要访问的共享文件夹.(不需要设置everyone权限) 第二步,我们需要为两台在同一domain下的计算机上建立连接. ...
- django从配置文件中读取数据库信息
创建配置文件my.cnf [client] database=django_db user=root password=123456 host=127.0.0.1 port=3306 settings ...
- 1-Django框架简介以及基本操作
安装 注意:安装的磁盘目录,以及后续通过Django创建目录的时候,不要出现中文,否则会出现预料之外的错误 建议:禁止套娃,即不要在A项目中创建B项目 # 如果不指定版本号,默认最新版 pip ins ...
- 【Azure Redis 缓存】Azure Cache for Redis 专用终结点, 虚拟网络, 公网访问链路
问题描述 为优化Redis访问链路,对下面三种方案进行对比: 1.Redis添加到虚拟网络 2.Redis添加专用终结点 3.Redis默认公共链路 问题分析 第三种:Redis默认公共链路,顾名思义 ...
- 【Azure 应用服务】Storage Queue触发Azure Function时报错 The input is not a valid Base-64 string
问题描述 创建一个PowerShell脚本的Azure Function,触发方式为 Storage Queue.但执行函数结果一直失败 (Failed). 错误消息为: Executed 'Func ...
- 三: MySQL的数据目录
# MySQL的数据目录 1. MySQL8的主要目录结构 1.1 数据库文件的存放路径 MySQL数据库文件的存放路径:/var/lib/mysql/ MySQL服务器程序在启动时会到文件系统的某个 ...
- HW学习笔记
栈库分离方法注意事项: 所有用户输入数据需要进行分离过滤,不能遗漏.选择安全的过滤函数 如 mysql_real_escape_string(),避免过滤不严格导致注入 SQL查询模板需要设计安全,米 ...
- 跨域测试代码 - console 里面直接就可以测试
跨域测试代码 - console 里面直接就可以测试 var xhr = new XMLHttpRequest(); xhr.open("GET", "https://w ...
- PyQt5 Ubuntu 16.04/14.04 环境配置
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文作为本人csdn blog的主站的备份.(Bl ...