1 package com.reliable.service;
2
3 import com.csvreader.CsvReader;
4 import com.reliable.bean.FileDict;
5 import com.reliable.dao.ReadFile;
6 import com.reliable.util.JDBCUtil;
7 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
8 import org.apache.poi.ss.usermodel.Cell;
9 import org.apache.poi.ss.usermodel.Row;
10 import org.apache.poi.ss.usermodel.Sheet;
11 import org.apache.poi.ss.usermodel.Workbook;
12 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
13
14 import java.io.*;
15 import java.nio.charset.Charset;
16 import java.sql.Connection;
17 import java.sql.PreparedStatement;
18 import java.sql.SQLException;
19 import java.util.ArrayList;
20
21 public class ReadFileImpl implements ReadFile {
22 private int MAX_CELL_NUM; //文件中最长的一行具有的单元格数
23 private PreparedStatement preparedStatement=null;
24 private Connection conn =null;
25 //--------------------------------------------------
26 public ArrayList<ArrayList<String>> readExcelFile(String path) throws IOException, SQLException {
27 System.out.println("excel文件路径:"+path); //输出文件路径
28 ArrayList<String> tableName = new ArrayList<String>();
29 String tableName_1=""; //备份表名
30 String tableName_2=""; //操作表名
31 ArrayList<ArrayList<String>> tableValue = new ArrayList<ArrayList<String>>(); //数据表的值
32 File excel=new File(path);
33 String[] split = excel.getName().split("\\."); //.是特殊字符,需要转义!
34 System.out.println(split[0]+" "+split[1]);
35 tableName_1=split[0]; //给备份数据表名赋值
36 tableName_2=split[0]+"_"+split[1]; //给操作表名赋值
37 System.out.println("备份表名:" + tableName_1);
38 System.out.println("操作表名: " + tableName_2);
39 tableName.add(tableName_1);
40 tableName.add(tableName_2);
41 tableValue.add(tableName);
42 Workbook wb; //新建文件
43 FileInputStream fileStream = new FileInputStream(excel); //文件流对象
44 //根据文件后缀(xls/xlsx)进行判断
45 if ("xls".equals(split[1])){
46 //xls文件
47 wb = new HSSFWorkbook(fileStream);
48 }else{
49 //xlsx文件
50 wb = new XSSFWorkbook(fileStream);
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 if ((cell == null)) {
65 tempTableValue.add("NULL");
66 }else {
67 cell.setCellType(Cell.CELL_TYPE_STRING); //转换单元格数据格式为String
68 tempTableValue.add(cell.getStringCellValue());
69 }
70 }
71 tableValue.add(tempTableValue);
72 }
73 }
74 System.out.println("读出Excel文件的数据: "+tableValue); //输出表格的所有值
75 wb.close();
76 //---------------------------------------------------------------------
77 return tableValue;
78 }
79 //读CSV文件
80 public ArrayList<ArrayList<String>> readCsvFile(String path) throws SQLException, IOException {
81 System.out.println("CSV文件的路径: "+path);
82 //首先判断编码格式
83 String code=new String();
84 ArrayList<ArrayList<String>> WrongData=new ArrayList<ArrayList<String>>();
85 ArrayList<String> tableField = new ArrayList<String>(); //数据表字段名
86 ArrayList<ArrayList<String>> tableValue = new ArrayList<ArrayList<String>>(); //数据表的值
87 String tableName_1=""; //备份表名
88 String tableName_2=""; //操作表名
89 ArrayList<String> tableName = new ArrayList<String>(); //存放两个表名
90 File file = new File(path);
91 InputStream in= new FileInputStream(file);
92 byte[] b = new byte[3];
93 in.read(b);
94 in.close();
95 if (b[0] == -17 && b[1] == -69 && b[2] == -65)
96 {
97 code="UTF-8";
98 System.out.println(file.getName() + ":编码为UTF-8");
99 }
100 else
101 {
102 code="GBK";
103 System.out.println(file.getName() + ":可能是GBK,也可能是其他编码");
104 }
105 try {
106 // 创建CSV读对象
107 CsvReader csvReader = new CsvReader(path,',', Charset.forName(code));
108 String[] split1 = path.split("\\."); //.是特殊字符,需要转义!
109 // System.out.println(split1[0]+" "+split1[1]);
110 String[] split2 = split1[0].split("\\\\");
111 // System.out.println(split2[split2.length-1]);
112 tableName_1=split2[split2.length-1];
113 tableName_2=split2[split2.length-1]+"_"+split1[1];
114 System.out.println("备份表名:"+tableName_1);
115 System.out.println("操作表名:"+tableName_2);
116 tableName.add(tableName_1);
117 tableName.add(tableName_2);
118 tableValue.add(tableName);
119 WrongData.add(tableName);
120 int rIndex=0;
121 // 跳过表头
122 // csvReader.readHeaders();
123 boolean flag=true;
124 while (csvReader.readRecord()){
125 // 读一整行
126 String resString="";
127 resString = csvReader.getRawRecord();
128 resString=resString.replace(","," , "); //替换, 为,空格
129 System.out.println(resString);
130 if(flag==true){
131 tableField.add(resString);
132 tableValue.add(tableField);
133 WrongData.add(tableField);
134 flag=false;
135 continue; //存放表头数据
136 }else{
137
138 }
139 String[] resString_list=resString.split(",");
140 String[] tableField_list=tableField.get(0).split(",");
141 ArrayList<String> tempTableValue = new ArrayList<String>(); //暂存一行的值,之后放到tableValue
142 if(resString_list.length != tableField_list.length){ //判断这一行的长度和第一行是否一样
143 tempTableValue.add(resString);
144 WrongData.add(tempTableValue); //如果不一样那就是错误数据
145 }else {
146 tempTableValue.add(resString);
147 tableValue.add(tempTableValue);
148 }
149 rIndex++;
150 }
151 } catch (IOException e) {
152 e.printStackTrace();
153 }
154
155 //name1,sex1,age1
156 // System.out.println(tableValue.get(0).get(0));
157 if (WrongData.size()!=2){
158 System.out.println("CSV文件的错误数据: "+WrongData);
159 return WrongData;
160 }else {
161 System.out.println("CSV文件的数据: "+tableValue);
162 return tableValue;
163 }
164 }
165
166 //--------------------------------------------------
167 //插入数据库 xls和xlsx文件
168 public void insertExcelTable(ArrayList<ArrayList<String>> tableValue){
169 conn=JDBCUtil.getConnection();
170 ArrayList<String> tableName = tableValue.get(0);
171 tableValue.remove(0); //删除第一行的值,表头信息不需要插入数据库
172 tableValue.remove(0); //再次删除掉字段值
173 for(int j=0;j<tableName.size();j++)
174 {
175 for (ArrayList<String> item1 : tableValue){
176 String INSERT_TABLE_SQL="INSERT INTO "+tableName.get(j)+" VALUES(";
177 String tempString=new String(); //组装SQL语句
178 for (int i =0 ;i<item1.size();i++){
179 if(i!=item1.size()-1){
180 tempString=tempString+"\""+item1.get(i)+"\""+",";
181 }
182 else{
183 tempString=tempString+"\""+item1.get(i)+"\"";
184 }
185 }
186 INSERT_TABLE_SQL=INSERT_TABLE_SQL+tempString+");";
187 System.out.println(INSERT_TABLE_SQL);
188 try{
189 preparedStatement= conn.prepareStatement(INSERT_TABLE_SQL);
190 preparedStatement.executeUpdate();
191 conn.setAutoCommit(false);
192 conn.commit();
193 System.out.println("\n");
194 }catch(SQLException e){
195 e.printStackTrace();
196 }
197 }
198 }
199 }
200 public void insertCsvTable(ArrayList<ArrayList<String>> tableValue){
201 ArrayList<String> tableName = tableValue.get(0);
202 tableName=tableValue.get(0);
203 tableValue.remove(0);
204 tableValue.remove(0);
205 conn=JDBCUtil.getConnection();
206 System.out.println("数据表长度: " + tableValue.size());
207 //插入
208 for(int j=0;j<tableName.size();j++){
209 for (int i=0 ;i<tableValue.size();i++){
210 String INSERT_TABLE_SQL="INSERT INTO "+tableName.get(j)+" VALUES( ";
211 String tempString=new String();
212 String[] tempValue={};
213 tempValue=tableValue.get(i).get(0).split("\\,");
214 // System.out.println(tempValue[tempValue.length-1]);
215 for (int k=0 ; k<tempValue.length; k++)
216 {
217 if(k!=tempValue.length-1){
218 tempString=tempString +"\"" +tempValue[k]+"\"" +",";
219 }
220 else{
221 tempString=tempString+"\"" +tempValue[k]+"\"";
222 }
223 }
224 INSERT_TABLE_SQL=INSERT_TABLE_SQL+tempString+");";
225 System.out.println(INSERT_TABLE_SQL);
226 try{
227 preparedStatement= conn.prepareStatement(INSERT_TABLE_SQL);
228 preparedStatement.executeUpdate();
229 conn.setAutoCommit(false);
230 conn.commit();
231 }catch(SQLException e){
232 e.printStackTrace();
233 }finally{
234 //关闭数据库连接
235 }
236 }
237 }
238 }
239 //--------------------------------------------------
240 //获取excel表一行最大的单元格数目的方法
241 public int getMaxCellNumExcel(Sheet sheet){
242 int resNum=0;
243 int firstRowIndex = sheet.getFirstRowNum(); //获取第一行索引
244 int lastRowIndex = sheet.getLastRowNum(); //获取最后一行索引
245 for(int rIndex = firstRowIndex; rIndex <= lastRowIndex; rIndex++) { //遍历行
246 Row row = sheet.getRow(rIndex); //获取行索引
247 if(row.getLastCellNum()>resNum){
248 resNum=row.getLastCellNum();
249 }
250 }
251 return resNum;
252 }
253
254 //在DictServlet中被调用,同时调用read文件的方法给这个方法传参数
255 @Override
256 public FileDict getExcelDict(ArrayList<ArrayList<String>> ExcelValue) {
257 //根据传过来的字段名建立数据字典
258 //描述默认 ""
259 ArrayList<String> fieldDescribe=new ArrayList<>();
260 //字段类型默认text
261 ArrayList<String> fieldType=new ArrayList<>();
262 //大小默认显示 256
263 ArrayList<String> fieldSize=new ArrayList<>();
264 //单位默认 ""
265 ArrayList<String> fieldUnit=new ArrayList<>();
266 fieldSize.add("256");
267 fieldType.add("text");
268 fieldDescribe.add("无");
269 fieldUnit.add("无");
270 FileDict fileDict = new FileDict();
271 fileDict.setFieldDescribe(fieldDescribe);
272 fileDict.setFieldType(fieldType);
273 fileDict.setFieldSize(fieldSize);
274 fileDict.setTableName(ExcelValue.get(0));
275 fileDict.setNewFieldName(ExcelValue.get(1));
276 fileDict.setFieldName(ExcelValue.get(1));
277 fileDict.setFieldUnit(fieldUnit);
278 return fileDict;
279 }
280 @Override
281 public FileDict getCsvDict(ArrayList<ArrayList<String>> CsvValue) {
282 FileDict fileDict = new FileDict();
283 String[] fieldNameList=CsvValue.get(1).get(0).split("\\,");
284 String[] newFieldNameList=CsvValue.get(1).get(0).split("\\,");
285 ArrayList<String> fieldName=new ArrayList<>();
286 ArrayList<String> newFieldName=new ArrayList<>();
287 for (int i = 0;i<fieldNameList.length;i++)
288 {
289 fieldName.add(fieldNameList[i]);
290 }
291 for (int i = 0;i<newFieldNameList.length;i++)
292 {
293 newFieldName.add(newFieldNameList[i]);
294 }
295 //描述默认 ""
296 ArrayList<String> fieldDescribe=new ArrayList<>();
297 //字段类型默认text
298 ArrayList<String> fieldType=new ArrayList<>();
299 //大小默认显示 256
300 ArrayList<String> fieldSize=new ArrayList<>();
301 //单位默认 ""
302 ArrayList<String> fieldUnit=new ArrayList<>();
303 fieldSize.add("256");
304 fieldType.add("text");
305 fieldDescribe.add("无");
306 fieldUnit.add("无");
307 fileDict.setFieldDescribe(fieldDescribe);
308 fileDict.setFieldType(fieldType);
309 fileDict.setFieldSize(fieldSize);
310 fileDict.setFieldName(fieldName);
311 fileDict.setNewFieldName(newFieldName);
312 fileDict.setTableName(CsvValue.get(0));
313 fileDict.setFieldUnit(fieldUnit);
314 return fileDict;
315 }
316
317 @Override
318 public void createTable(ArrayList<String[]> tableInfo) {
319 //获取Sqlsession
320 String DROP_TABLE_1="";
321 String DROP_TABLE_2="";
322 String CREATE_TABLE_1_SQL="";
323 String CREATE_TABLE_2_SQL="";
324 DROP_TABLE_1="DROP TABLE IF EXISTS "+ tableInfo.get(0)[0] +";";
325 DROP_TABLE_2="DROP TABLE IF EXISTS "+tableInfo.get(0)[1] +";";
326 CREATE_TABLE_1_SQL="CREATE TABLE "+ tableInfo.get(0)[0] +"(" ;
327 CREATE_TABLE_2_SQL="CREATE TABLE "+ tableInfo.get(0)[1] +"(" ;
328 //生成备份表建表语句 (字段、描述、类型)
329 CREATE_TABLE_1_SQL=getTableSQL(CREATE_TABLE_1_SQL, tableInfo.get(1) , tableInfo.get(2),tableInfo.get(3),tableInfo.get(4));
330 //生成操作表建表语句
331 CREATE_TABLE_2_SQL=getTableSQL(CREATE_TABLE_2_SQL, tableInfo.get(1) , tableInfo.get(2),tableInfo.get(3),tableInfo.get(4));
332 System.out.println(CREATE_TABLE_1_SQL);
333 System.out.println(CREATE_TABLE_2_SQL);
334 try {
335 conn=JDBCUtil.getConnection();
336 preparedStatement = conn.prepareStatement(DROP_TABLE_1);
337 preparedStatement.executeUpdate();
338 preparedStatement= conn.prepareStatement(CREATE_TABLE_1_SQL);
339 preparedStatement.executeUpdate();
340 preparedStatement = conn.prepareStatement(DROP_TABLE_2);
341 preparedStatement.executeUpdate();
342 preparedStatement= conn.prepareStatement(CREATE_TABLE_2_SQL);
343 preparedStatement.executeUpdate();
344 conn.setAutoCommit(false);
345 conn.commit();
346 JDBCUtil.release(conn,preparedStatement);
347
348 } catch (SQLException e) {
349 e.printStackTrace();
350 System.out.println("出现问题!建表失败!");
351 }
352 }
353 //获取文件的建表sql语句
354 public String getTableSQL(String SQL,String[] tableField, String[]fieldDescribe,String[] fieldUnit, String[] fieldType ){
355 for (int i =0 ;i<tableField.length;i++)
356 {
357 String item= tableField[i];
358 if(i!=tableField.length-1){
359 SQL=SQL + "`" + item + "`" +" text COMMENT " +"\'" +fieldDescribe[i]+","+fieldUnit[i]+"\'" +" COLLATE utf8_general_ci,"+"\n";
360 }else{
361 SQL=SQL + "`" + item + "`" +" text COMMENT "+"\'" +fieldDescribe[i]+","+fieldUnit[i]+"\'" + " COLLATE utf8_general_ci "+"\n";
362 }
363 }
364 return SQL+") ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;";
365 }
366 }

Java读取excel文件(.xlsx/.xls)和.csv文件存入MySQL数据库的更多相关文章

  1. java 读取excel 2007 .xlsx文件 poi实现

    工作需要读取excel里面的行内容,使用java实现较为简单. 在最开始,尝试使用 jxl-2.6.12 来实现读取excel 的行内容.但是按照网上的方法,程序根本无法正确处理文件流.经过谷姐的一番 ...

  2. java读取excel文件内容

    1.导入依赖JAR包 <!-- jxl 操作excel --> <dependency> <groupId>org.jxls</groupId> < ...

  3. 关于解决java读取excel文件遇空行抛空指针的问题 !

    关于解决java读取excel文件遇空行抛空指针的问题 ! package exceRead; import java.io.File; import java.io.FileInputStream; ...

  4. Java读取Excel文件的几种方法

    Java读取 Excel 文件的常用开源免费方法有以下几种: 1. JDBC-ODBC Excel Driver 2. jxl.jar 3. jcom.jar 4. poi.jar 简单介绍: 百度文 ...

  5. java读取excel文件的代码

    如下内容段是关于java读取excel文件的内容,应该能对各朋友有所用途. package com.zsmj.utilit; import java.io.FileInputStream;import ...

  6. Java读取excel表格

    Java读取excel表格 一般都是用poi技术去读取excel表格的,但是这个技术又是什么呢 什么是Apache POI? Apache POI是一种流行的API,它允许程序员使用Java程序创建, ...

  7. Java读取Excel数据

    Java读取Excel数据,解析文本并格式化输出 Java读取Excel数据,解析文本并格式化输出 Java读取Excel数据,解析文本并格式化输出 下图是excel文件的路径和文件名 下图是exce ...

  8. Java列表分页查询结果导出到CSV文件,导入CSV文件并解析

    import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.Fi ...

  9. 怎么创建CSV文件和怎么打开CSV文件

    CSV(Comma Separated Values逗号分隔值). .csv是一种文件格式(如.txt..doc等),也可理解.csv文件就是一种特殊格式的纯文本文件.即是一组字符序列,字符之间已英文 ...

  10. 2. 假设当前文件夹中data.csv文件中存放了2020年某饭店营业额,第一列为日期(如2020-02-03),第二列为每天交易额(如3560),文件中第一行为表头,其余行为实 际数据。

    假设当前文件夹中data.csv文件中存放了2020年某饭店营业额,第一列为日期(如2020-02-03),第二列为每天交易额(如3560),文件中第一行为表头,其余行为实  际数据.编写程序,完成下 ...

随机推荐

  1. SpringBoot+Shiro+LayUI权限管理系统项目-4.实现部门管理

    1.说明 只讲解关键部分,详细看源码,文章下方捐赠或QQ联系捐赠获取. 2.功能展示 3.业务模型 @Data @EqualsAndHashCode(callSuper = false) @Acces ...

  2. 《深入理解Java虚拟机》(五) JVM调优案例

    目录 问题 排查问题经过了如下的过程: 排除是否数据库卡顿造成 任务管理器 与客户沟通 至此开始通过JVM排查问题: JVM参数介绍 第一次Full GC 第二次Full GC截图 第三次Full G ...

  3. java.lang.IllegalStateException: Failed to check the status of the service 的解决办法

    参考资料 java.lang.IllegalStateException: Failed to check the status of the service 的解决办法_Hello_World_QW ...

  4. Golang标准库——io

    原文:Golang标准库--io 1.io io包提供了对I/O原语的基本接口.本包的基本任务是包装这些原语已有的实现(如os包里的原语),使之成为共享的公共接口,这些公共接口抽象出了泛用的函数并附加 ...

  5. 【Azure Developer】在Azure Storage Account的两个Blob可以同步吗?可以跨订阅拷贝吗?

    问题描述 不同订阅下的Azure Storage Account中Blob资源可以同步吗? 解决方案 可以.通过Azure 官方推荐的Storage Account工具来完成 Copy/Paste 操 ...

  6. 【Azure 环境】自动化账号生成的时候怎么生成连接与证书

    问题描述 自动化账号生成的时候怎么生成连接与证书? 什么是自动化? Azure 自动化提供基于云的自动化和配置服务,用于支持 Azure 环境和非 Azure 环境之间的一致管理. Azure 自动化 ...

  7. STL-RBTree模拟实现

    #pragma once #include<assert.h> #include<iostream> using std::cout; using std::endl; usi ...

  8. vxe table columns 要用data里的值,用computed的值会导致排序部分不好用。

    vxe table columns 要用data里的值,用computed的值会导致排序部分不好用.

  9. WPF之事件

    目录 WPF的树形结构 事件 路由事件 使用WPF内置路由事件 自定义路由事件 ButtonBase类的Click路由事件 创建一个路由事件 RoutedEventArgs的Source与Origin ...

  10. stm32读写sd卡代码解析和调试总结

    一 前言   做程序员真是来不得半点偷懒,假如你对经常使用的代码不熟悉,早晚会让你付出沉重的代价.像认识自己的灵魂一样认识每行用到的代码,这才是一个合格的程序员,才不至于在出现问题的时候出现慌乱.   ...