接了一个任务,需要把Excel中的数据导入到数据库中,查阅了资料后,学习了POI和EasyExcel两个库。
在这之前,我们先来分析一下Excel,我们可以把Excel简单的理解成四部分,1、工作簿2、工作表3、行4、单元格
POI
Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。
有以下类实现了Workbook接口,区别如下:
- HSSFWorkbook是操作Excel2003以前(包括2003)的版本,扩展名是.xls;XSSFWorkbook,SXSSFWorkbook是操作Excel2007的版本,扩展名是.xlsx
- SXSSFWorkbook读写比XSSFWorkbook快
新建一个maven项目,导入jar包
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<!-- 03 xls -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
<!-- 07 xlsx -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.0</version>
</dependency>
</dependencies>
- 写入数据
public class writeTest {
public static void main(String[] args) {
String path = "D:\\project\\poidemo\\";
//创建工作簿
Workbook workbook = new HSSFWorkbook();
//工作表
Sheet sheet = workbook.createSheet("学生成绩表");
//创建行
Row row1 = sheet.createRow(0);//第1行
Row row2 = sheet.createRow(1);//第2行
//创建单元格
Cell cell11 = row1.createCell(0);//第1行第1列
Cell cell12 = row1.createCell(1);//第1行第2列
Cell cell13= row1.createCell(2);//第1行第2列
Cell cell14 = row1.createCell(3);//第1行第4列
Cell cell21 = row2.createCell(0);//第2行第1列
Cell cell22 = row2.createCell(1);//第2行第2列
Cell cell23= row2.createCell(2);//第2行第3列
Cell cell24 = row2.createCell(3);//第2行第4列
//写入值
cell11.setCellValue("学号");
cell12.setCellValue("姓名");
cell13.setCellValue("学科");
cell14.setCellValue("成绩");
cell21.setCellValue("1001");
cell22.setCellValue("张三");
cell23.setCellValue("语文");
cell24.setCellValue("85");
try {
//输出流生成xls文件
FileOutputStream fileOutputStream = new FileOutputStream(path+"学生成绩表03.xls");
workbook.write(fileOutputStream);
System.out.println("生成表成功");
} catch (IOException e) {
e.printStackTrace();
}
}
}
批量写入大量数据,SXSSFWorkbook比XSSFWorkbook效率高
相同的代码,一个是XSSFWorkbook,另一个是SXSSFWorkbook,向Excel中写入1000000行数据,一个用时18秒,一个用时3秒
public static void main(String[] args) throws Exception {
String path = "D:\\project\\poidemo\\";
long begin = System.currentTimeMillis();
//创建工作簿
Workbook workbook = new XSSFWorkbook();
//工作表
Sheet sheet = workbook.createSheet("学生成绩表");
//创建行
for(int i=0;i<1000000;i++){
Row row = sheet.createRow(i);
Cell cell = row.createCell(0);
cell.setCellValue(i);
}
//输出流生成xlsx文件
FileOutputStream fileOutputStream = new FileOutputStream(path+"07.xlsx");
workbook.write(fileOutputStream);
System.out.println("生成表成功");
Long end = System.currentTimeMillis();
System.out.println((double)(end-begin)/1000);
fileOutputStream.close();
}
- 读Excel中的数据
public static void main(String[] args) throws Exception {
String path = "D:\\project\\poidemo\\";
//获取Excel文件
FileInputStream fileInputStream = new FileInputStream(path+"学生成绩表03.xls");
//获取工作簿
Workbook workbook = new HSSFWorkbook(fileInputStream);
//获取工作表
Sheet sheet = workbook.getSheetAt(0);
//获取行数
int rowNum = sheet.getPhysicalNumberOfRows();
for (int i=0;i<rowNum;i++){
Row row = sheet.getRow(i);
//获取列数
int cellNum = row.getPhysicalNumberOfCells();
for(int j=0;j<cellNum;j++){
Cell cell = row.getCell(j);
String value = cell.getStringCellValue();
System.out.println("["+i+","+(j+1)+"]"+"("+value+")");
}
}
}
EasyExcel
EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。 EasyExcel的github地址
- 写Excel
public static void main(String[] args) {
String path = "D:\\project\\easyExceldemo\\";
List<DemoData> demoDataList = new ArrayList<>();
for (int i=1;i<=10;i++){
DemoData demoData = new DemoData();
demoData.setString("字符串"+i);
demoData.setDate(new Date());
demoData.setDoubleData(0.56d);
demoDataList.add(demoData);
}
String fileName = path+ "simpleWrite" + System.currentTimeMillis() + ".xlsx";
EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(demoDataList);
}