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

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

时间2023-03-29 16:34:59发布访客分类数据库浏览930
导读:本篇内容介绍了“多个sheetExcel数据怎么导入数据库”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!多个sheet Excel 数据 导...
本篇内容介绍了“多个sheetExcel数据怎么导入数据库”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

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

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

  • 使用 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);
    

//遍历每个Sheet
for(intsheetIndex=0;
    sheetIndexworkbook.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;
    ititleRow.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;
    jrow.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;
    inumSheets;
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:
//Ignoreothercolumns
break;

}

}
    

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;
    inumSheets;
i++){
    
Sheetsheet=workbook.getSheet(i);
    
for(intj=1;
    jsheet.getRows();
j++){
    
Stringcol1=null;
    
Stringcol2=null;
    
intcol3=0;
    

for(intk=0;
    ksheet.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:
//Ignoreothercolumns
break;

}

}
    

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){
    
ListListObject>
    >
    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(ListObject>
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();

}

}
    

staticclassMyEventListenerextendsAnalysisEventListenerObject>
{
    
privateListObject>
    row=newArrayList>
    ();


@Override
publicvoidinvoke(Objectdata,AnalysisContextcontext){
    
row.add(data);

if(context.getCurrentRowNum()==0){
    
//Ignoretheheaderrow
row.clear();

}

}


@Override
publicvoiddoAfterAllAnalysed(AnalysisContextcontext){

//Ignore
}


@Override
publicvoiddoAfterAllAnalysed(AnalysisContextcontext){

//Ignore
}

}

}
    

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

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

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

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!

sheetexcel数据库

若转载请注明出处: 多个sheet Excel数据怎么导入数据库
本文地址: https://pptw.com/jishu/706.html
linux重启服务命令是哪个(linux重启服务命令是哪个命令) MySQL数据库连接方式及工具有哪些(mysql数据库连接方式及工具有哪些特点)

游客 回复需填写必要信息