多个sheet Excel数据怎么导入数据库

数据库   2024年01月12日 0:48  

本篇内容介绍了“多个sheetExcel数据怎么导入数据库”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

多个sheet 数据 导入数据库 如何实现?

将 Excel 文件中的多个 导入数据库,一般有以下几种实现方式:

使用 JDBC 直接插入。可以使用 Java 的 JDBC 接口直接连接数据库,然后读取 Excel 文件中的数据,并将数据插入到数据库中。这种方式比较直接,但需要编写大量的 JDBC 代码,对 Excel 文件格式的支持也比较有限。

使用第三方库。市面上有很多 Java 的第三方库可以用来读取 Excel 文件,如 Apache POI、JExcelAPI、EasyExcel 等。这些库通常都提供了比较简单易用的 API,可以方便地读取 Excel 文件中的数据,并将数据插入到数据库中。

先将 Excel 文件转换成 CSV 文件,再导入数据库。Excel 文件可以先转换成 CSV 文件,然后使用 JDBC 直接将数据插入到数据库中。CSV 文件相对于 Excel 文件来说,结构更加简单,处理起来也更加方便。

无论使用哪种方式,都需要注意以下几个问题:

Excel 文件格式的兼容性问题。不同版本的 Excel 文件可能存在格式差异,需要进行测试和兼容性处理。

数据的类型和格式问题。Excel 文件中的数据类型和格式可能需要进行转换和处理,以适配数据库中的数据类型和格式要求。

数据的一致性问题。如果 Excel 文件中的数据有重复或冲突,需要进行处理,以保证数据的一致性和完整性。

综上所述,将 Excel 文件中的多个 sheet 导入数据库的实现方式有多种,具体使用哪种方式,还需要根据实际情况进行评估和选择。

传统方式

处理 普通数据的 Excel 文件,需要考虑到内存和性能的问题,以下是一个基于流式读取和写入的示例代码:

//获取Excel文件输入流InputStreamis=newBufferedInputStream(newFileInputStream(filePath));Workbookworkbook=WorkbookFactory.create(is);//遍历每个Sheetfor(intsheetIndex=0;sheetIndex<workbook.getNumberOfSheets();sheetIndex++){Sheetsheet=workbook.getSheetAt(sheetIndex);StringsheetName=sheet.getSheetName();System.out.println("开始处理Sheet:"+sheetName);//准备写入的输出流OutputStreamos=newBufferedOutputStream(newFileOutputStream(outputDir+"/"+sheetName+".xlsx"));//设置写入的Sheet名称SXSSFWorkbookwriter=newSXSSFWorkbook(newXSSFWorkbook(),10000);SXSSFSheetoutSheet=writer.createSheet(sheetName);//读取并写入Sheet的行RowtitleRow=sheet.getRow(0);RowoutTitleRow=outSheet.createRow(0);for(inti=0;i<titleRow.getLastCellNum();i++){outTitleRow.createCell(i).setCellValue(titleRow.getCell(i).getStringCellValue());}//逐行读取并写入数据for(inti=1;i<=sheet.getLastRowNum();i++){Rowrow=sheet.getRow(i);RowoutRow=outSheet.createRow(i);for(intj=0;j<row.getLastCellNum();j++){Cellcell=row.getCell(j);if(cell!=null){switch(cell.getCellType()){caseBLANK:outRow.createCell(j,CellType.BLANK);break;caseBOOLEAN:outRow.createCell(j,CellType.BOOLEAN).setCellValue(cell.getBooleanCellValue());break;caseERROR:outRow.createCell(j,CellType.ERROR).setCellValue(cell.getErrorCellValue());break;caseFORMULA:outRow.createCell(j,CellType.FORMULA).setCellFormula(cell.getCellFormula());break;caseNUMERIC:if(DateUtil.isCellDateFormatted(cell)){outRow.createCell(j,CellType.NUMERIC).setCellValue(cell.getDateCellValue());}else{outRow.createCell(j,CellType.NUMERIC).setCellValue(cell.getNumericCellValue());}break;caseSTRING:outRow.createCell(j,CellType.STRING).setCellValue(cell.getStringCellValue());break;default:outRow.createCell(j,CellType.BLANK);break;}}}//每隔10000行进行一次缓存写入if(i%10000==0){((SXSSFSheet)outSheet).flushRows();}}//最后写入缓存的数据writer.write(os);os.flush();os.close();writer.dispose();System.out.println("处理Sheet:"+sheetName+"完成");}//关闭输入流is.close();

上述示例代码使用了 Apache POI 的流式读取和写入方式,可以有效地处理大量数据。为了避免内存溢出,采用了缓存写入的方式,每隔一定数量的行进行一次写入操作。

Apache POI

使用 Apache POI 实现将 Excel 文件中的多个 sheet 导入到数据库的 Java 代码:

importjava.io.FileInputStream;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.SQLException;importorg.apache.poi.ss.usermodel.Cell;importorg.apache.poi.ss.usermodel.Row;importorg.apache.poi.ss.usermodel.Sheet;importorg.apache.poi.ss.usermodel.Workbook;importorg.apache.poi.xssf.usermodel.XSSFWorkbook;publicclassExcelImporter{privatestaticfinalStringDB_URL="jdbc:mysql://localhost:3306/mydatabase";privatestaticfinalStringDB_USER="myuser";privatestaticfinalStringDB_PASSWORD="mypassword";privatestaticfinalStringINSERT_SQL="INSERTINTOmytable(col1,col2,col3)VALUES(?,?,?)";publicstaticvoidmain(String[]args){try(Connectionconn=DriverManager.getConnection(DB_URL,DB_USER,DB_PASSWORD)){FileInputStreamfile=newFileInputStream("myexcel.xlsx");Workbookworkbook=newXSSFWorkbook(file);intnumSheets=workbook.getNumberOfSheets();for(inti=0;i<numSheets;i++){Sheetsheet=workbook.getSheetAt(i);for(Rowrow:sheet){Stringcol1=null;Stringcol2=null;intcol3=0;for(Cellcell:row){intcolumnIndex=cell.getColumnIndex();switch(columnIndex){case0:col1=cell.getStringCellValue();break;case1:col2=cell.getStringCellValue();break;case2:col3=(int)cell.getNumericCellValue();break;default://Ignoreothercolumnsbreak;}}PreparedStatementstatement=conn.prepareStatement(INSERT_SQL);statement.setString(1,col1);statement.setString(2,col2);statement.setInt(3,col3);statement.executeUpdate();}}System.out.println("Importsuccessful");}catch(SQLExceptione){e.printStackTrace();}catch(Exceptione){e.printStackTrace();}}}

在上面的代码中,首先通过 FileInputStream 和 Workbook 对象读取 Excel 文件中的数据,然后通过 for 循环遍历每个 sheet 和每行数据,并将数据插入到数据库中。在读取单元格数据时,可以根据单元格的列索引和数据类型进行类型转换和赋值。最后通过 PreparedStatement 执行 SQL 插入语句,将数据插入到数据库中。

需要注意的是,上面的代码只是一个简单的示例,还需要根据实际情况进行修改和完善,比如加入异常处理、事务管理等功能。

JExcelAPI

使用 JExcelAPI 实现将 Excel 文件中的多个 sheet 导入到数据库的 Java 代码:

importjava.io.File;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.SQLException;importjxl.Cell;importjxl.Sheet;importjxl.Workbook;publicclassExcelImporter{privatestaticfinalStringDB_URL="jdbc:mysql://localhost:3306/mydatabase";privatestaticfinalStringDB_USER="myuser";privatestaticfinalStringDB_PASSWORD="mypassword";privatestaticfinalStringINSERT_SQL="INSERTINTOmytable(col1,col2,col3)VALUES(?,?,?)";publicstaticvoidmain(String[]args){try(Connectionconn=DriverManager.getConnection(DB_URL,DB_USER,DB_PASSWORD)){Workbookworkbook=Workbook.getWorkbook(newFile("myexcel.xls"));intnumSheets=workbook.getNumberOfSheets();for(inti=0;i<numSheets;i++){Sheetsheet=workbook.getSheet(i);for(intj=1;j<sheet.getRows();j++){Stringcol1=null;Stringcol2=null;intcol3=0;for(intk=0;k<sheet.getColumns();k++){Cellcell=sheet.getCell(k,j);switch(k){case0:col1=cell.getContents();break;case1:col2=cell.getContents();break;case2:col3=Integer.parseInt(cell.getContents());break;default://Ignoreothercolumnsbreak;}}PreparedStatementstatement=conn.prepareStatement(INSERT_SQL);statement.setString(1,col1);statement.setString(2,col2);statement.setInt(3,col3);statement.executeUpdate();}}System.out.println("Importsuccessful");}catch(SQLExceptione){e.printStackTrace();}catch(Exceptione){e.printStackTrace();}}}

在上面的代码中,首先通过 Workbook 对象读取 Excel 文件中的数据,然后通过 for 循环遍历每个 sheet 和每行数据,并将数据插入到数据库中。在读取单元格数据时,可以根据单元格的行索引、列索引和数据类型进行类型转换和赋值。最后通过 PreparedStatement 执行 SQL 插入语句,将数据插入到数据库中。

需要注意的是,上面的代码只是一个简单的示例,还需要根据实际情况进行修改和完善,比如加入异常处理、事务管理等功能。另外,JExcelAPI 只支持旧版的 .xls 格式,不支持 .xlsx 格式。

EasyExcel

使用 EasyExcel 实现将 Excel 文件中的多个 sheet 导入到数据库的 Java 代码:

importcom.alibaba.excel.EasyExcel;importcom.alibaba.excel.context.AnalysisContext;importcom.alibaba.excel.event.AnalysisEventListener;importcom.alibaba.excel.metadata.Sheet;importjava.util.ArrayList;importjava.util.List;publicclassExcelImporter{privatestaticfinalStringDB_URL="jdbc:mysql://localhost:3306/mydatabase";privatestaticfinalStringDB_USER="myuser";privatestaticfinalStringDB_PASSWORD="mypassword";privatestaticfinalStringINSERT_SQL="INSERTINTOmytable(col1,col2,col3)VALUES(?,?,?)";publicstaticvoidmain(String[]args){List<List<Object>>data=newArrayList<>();EasyExcel.read("myexcel.xlsx",newMyEventListener()).sheet().doRead();try(Connectionconn=DriverManager.getConnection(DB_URL,DB_USER,DB_PASSWORD)){PreparedStatementstatement=conn.prepareStatement(INSERT_SQL);for(List<Object>row:data){statement.setString(1,(String)row.get(0));statement.setString(2,(String)row.get(1));statement.setInt(3,(Integer)row.get(2));statement.addBatch();}statement.executeBatch();System.out.println("Importsuccessful");}catch(SQLExceptione){e.printStackTrace();}catch(Exceptione){e.printStackTrace();}}staticclassMyEventListenerextendsAnalysisEventListener<Object>{privateList<Object>row=newArrayList<>();@Overridepublicvoidinvoke(Objectdata,AnalysisContextcontext){row.add(data);if(context.getCurrentRowNum()==0){//Ignoretheheaderrowrow.clear();}}@OverridepublicvoiddoAfterAllAnalysed(AnalysisContextcontext){//Ignore}@OverridepublicvoiddoAfterAllAnalysed(AnalysisContextcontext){//Ignore}}}

在上面的代码中,首先通过 EasyExcel 对象读取 Excel 文件中的数据,然后通过 AnalysisEventListener 监听器将每行数据存储到一个 List 中,最后将 List 中的数据插入到数据库中。需要注意的是,在处理每行数据时,需要根据数据类型进行类型转换和赋值。此外,EasyExcel 支持 .xlsx 和 .xls 格式的 Excel 文件,但由于 .xlsx 格式的文件在读取时需要占用大量内存,因此建议在处理大量数据时使用 .xls 格式。

需要注意的是,上面的代码只是一个简单的示例,还需要根据实际情况进行修改和完善,比如加入异常处理、事务管理等功能。另外,EasyExcel 还提供了很多高级功能,比如读取大量数据时的分页读取、读取时的数据转换和验证等。可以根据实际需求进行使用。

“多个sheetExcel数据怎么导入数据库”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

域名注册
购买VPS主机

您或许对下面这些文章有兴趣:                    本月吐槽辛苦排行榜

看贴要回贴有N种理由!看帖不回贴的后果你懂得的!


评论内容 (*必填):
(Ctrl + Enter提交)   

部落快速搜索栏

各类专题梳理

网站导航栏

X
返回顶部