Java中操作Excel的3种⽅法,太好⽤了!
⼀、介绍
在平时的业务系统开发中,少不了需要⽤到导出、导⼊excel功能,今天我们就⼀起来总结⼀下,如果你正为此需求感到困惑,那么阅读完本⽂,你⼀定会有所收获!
⼆、poi
⼤概在很久很久以前,微软的电⼦表格软件 Excel 以操作简单、存储数据直观⽅便,还⽀持打印报表,在诞⽣之初,可谓深得办公室⾥的⽩领青睐,极⼤的提升了⼯作的效率,不久之后,便成了办公室⾥的必备⼯具。
随着更多的新语⾔的崛起,例如我们所熟悉的 java,后来便有⼀些团队开始开发⼀套能与 Excel 软件⽆缝切换的操作⼯具!
这其中就有我们所熟悉的 apache 的 poi,其前⾝是 Jakarta 的 POI Project项⽬,之后将其开源给 apache 基⾦会!
当然,在java⽣态体系⾥⾯,能与Excel⽆缝衔接的第三⽅⼯具还有很多,因为 apache poi 在业界使⽤的最⼴泛,因此其他的⼯具不做过多介绍!
话不多说,直接开撸!
2.1、⾸先引⼊apache poi的依赖
<dependencies>
<!--xls(03)-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
<!--xlsx(07)-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
<!--时间格式化⼯具-->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.10.6</version>
</dependency>
</dependencies>
2.2、导出excel
导出操作,即使⽤ Java 写出数据到 Excel 中,常见场景是将页⾯上的数据导出,这些数据可能是财务数据,也可能是商品数据,⽣成Excel 后返回给⽤户下载⽂件。
在 poi ⼯具库中,导出 api 可以分三种⽅式
HSSF⽅式:这种⽅式导出的⽂件格式为office 2003专⽤格式,即.xls,优点是导出数据速度快,但是最多65536⾏数据
XSSF⽅式:这种⽅式导出的⽂件格式为office 2007专⽤格式,即.xlsx,优点是导出的数据不受⾏数限制,缺点导出速度慢
SXSSF⽅式:SXSSF 是 XSSF API的兼容流式扩展,主要解决当使⽤ XSSF ⽅式导出⼤数据量时,内存溢出的问题,⽀持导出⼤批量的excel数据
2.2.1、HSSF⽅式导出
HSSF⽅式,最多只⽀持65536条数据导出,超过这个条数会报错!
public class ExcelWrite2003Test {
public static String PATH = "/Users/hello/Desktop/";
public static void main(String[] args) throws Exception {
//时间
long begin = System.currentTimeMillis();
//创建⼀个⼯作簿
Workbook workbook = new HSSFWorkbook();
//创建表
Sheet sheet = ateSheet();
//写⼊数据
for (int rowNumber = 0; rowNumber < 65536; rowNumber++) {
//创建⾏
Row row = ateRow(rowNumber);
for (int cellNumber = 0; cellNumber < 10; cellNumber++) {
//创建列
Cell cell = ateCell(cellNumber);
cell.setCellValue(cellNumber);
}
}
System.out.println("over");
FileOutputStream fileOutputStream = new FileOutputStream(PATH + "⽤户信息表2003BigData.xls"); workbook.write(fileOutputStream);
fileOutputStream.close();
long end = System.currentTimeMillis();
System.out.println((double) (end - begin) / 1000);//4.29s
}
}
2.2.2、XSSF⽅式导出
XSSF⽅式⽀持⼤批量数据导出,所有的数据先写⼊内存再导出,容易出现内存溢出!
public static void main(String[] args) throws Exception {
//时间
long begin = System.currentTimeMillis();
//创建⼀个⼯作簿
Workbook workbook = new XSSFWorkbook();
//创建表
Sheet sheet = ateSheet();
//写⼊数据
for (int rowNumber = 0; rowNumber < 65537; rowNumber++) {
Row row = ateRow(rowNumber);
for (int cellNumber = 0; cellNumber < 10; cellNumber++) {
Cell cell = ateCell(cellNumber);
cell.setCellValue(cellNumber);
}
}
System.out.println("over");
FileOutputStream fileOutputStream = new FileOutputStream(PATH + "⽤户信息表2007BigData.xlsx");
workbook.write(fileOutputStream);
fileOutputStream.close();
long end = System.currentTimeMillis();
System.out.println((double) (end - begin) / 1000);//15.87s
}
}
2.2.3、SXSSF⽅式导出
SXSSF⽅式是XSSF⽅式的⼀种延伸,主要特性是低内存,导出的时候,先将数据写⼊磁盘再导出,避免报内存不⾜,导致程序运⾏异常,缺点是运⾏很慢!
public static void main(String[] args) throws Exception {
//时间
long begin = System.currentTimeMillis();
//创建⼀个⼯作簿
Workbook workbook = new SXSSFWorkbook();
//创建表
Sheet sheet = ateSheet();
//写⼊数据
for (int rowNumber = 0; rowNumber < 100000; rowNumber++) {
Row row = ateRow(rowNumber);
for (int cellNumber = 0; cellNumber < 10; cellNumber++) {
Cell cell = ateCell(cellNumber);
cell.setCellValue(cellNumber);
}
}
System.out.println("over");
FileOutputStream fileOutputStream = new FileOutputStream(PATH + "⽤户信息表2007BigDataS.xlsx"); workbook.write(fileOutputStream);
fileOutputStream.close();
long end = System.currentTimeMillis();
System.out.println((double) (end - begin) / 1000);//6.39s
}
}
2.3、导⼊excel
导⼊操作,即将 excel 中的数据采⽤java⼯具库将其解析出来,进⽽将 excel 数据写⼊数据库!
同样,在 poi ⼯具库中,导⼊ api 也分三种⽅式,与上⾯的导出⼀⼀对应!
2.3.1、HSSF⽅式导⼊
public static void main(String[] args) throws Exception {
//获取⽂件流
FileInputStream inputStream = new FileInputStream(PATH + "⽤户信息表BigData.xls");
//1.创建⼯作簿,使⽤excel能操作的这边都看看操作
Workbook workbook = new HSSFWorkbook(inputStream);
//2.得到表
Sheet sheet = SheetAt(0);
//3.得到⾏
Row row = Row(0);
//4.得到列
Cell cell = Cell(0);
getValue(cell);
inputStream.close();
}
public static void getValue(Cell cell){
//匹配类型数据
if (cell != null) {
CellType cellType = CellType();
String cellValue = "";
switch (cellType) {
case STRING: //字符串
System.out.print("[String类型]");
cellValue = StringCellValue();
break;
case BOOLEAN: //布尔类型
System.out.print("[boolean类型]");
cellValue = String.BooleanCellValue());
break;
case BLANK: //空
System.out.print("[BLANK类型]");
break;
case NUMERIC: //数字(⽇期、普通数字)
System.out.print("[NUMERIC类型]");
java valueofif (HSSFDateUtil.isCellDateFormatted(cell)) { //⽇期
System.out.print("[⽇期]");
Date date = DateCellValue();
cellValue = new DateTime(date).toString("yyyy-MM-dd");
} else {
//不是⽇期格式,防⽌数字过长
System.out.print("[转换为字符串输出]");
cell.setCellType(CellType.STRING);
cellValue = String();
}
break;
case ERROR:
System.out.print("[数据类型错误]");
break;
}
System.out.println(cellValue);
}
}
}
2.3.2、XSSF⽅式导⼊
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论