POI-Excel写
POI-Excel写
1,创建项目
2,引入pom依赖
<dependencies>
<!--xls-03-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
<!--xls-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.1</version>
</dependency>
<!--test-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
03 | 07版本的写入操作,本质就是对象的不同,其他方法是一样的!
注意:2003版本和2007版本存在兼容性问题!2003版本最多只有65535行!
03版本:
public void testWrite03() throws IOException {
//1,创建一个工作簿
Workbook workbook = new HSSFWorkbook();
//2,创建一个工作表
Sheet sheet = workbook.createSheet("测试表");
//3,创建一行,默认从0开始,即表示第一行
Row row = sheet.createRow(0);
//4,创建一个单元格,(1,1)第一个单元格
Cell cell1 = row.createCell(0);
cell1.setCellValue("今日新增观众");
//(1,2)
Cell cell2 = row.createCell(1);
cell2.setCellValue(666);
//第二行
Row row2 = sheet.createRow(1);
//(2,1)
Cell cell21 = row2.createCell(0);
cell21.setCellValue("统计时间");
//(2,2)
Cell cell22 = row2.createCell(1);
cell22.setCellValue(new DateTime().toString("yyyy-MM-dd HH:mm:ss"));
//生成一张表(IO流) 03版就是使用xls结尾!
FileOutputStream fileOutputStream = new FileOutputStream(PATH + "testWrite03.xls");
//输出
workbook.write(fileOutputStream);
//关闭流
fileOutputStream.close();
System.out.println("文件生成完毕!");
}
07版本:
public void testWrite07() throws IOException {
//1,创建一个工作簿
Workbook workbook = new XSSFWorkbook();
//2,创建一个工作表
Sheet sheet = workbook.createSheet("测试表");
//3,创建一行,默认从0开始,即表示第一行
Row row = sheet.createRow(0);
//4,创建一个单元格,(1,1)第一个单元格
Cell cell1 = row.createCell(0);
cell1.setCellValue("今日新增观众");
//(1,2)
Cell cell2 = row.createCell(1);
cell2.setCellValue(666);
//第二行
Row row2 = sheet.createRow(1);
//(2,1)
Cell cell21 = row2.createCell(0);
cell21.setCellValue("统计时间");
//(2,2)
Cell cell22 = row2.createCell(1);
cell22.setCellValue(new DateTime().toString("yyyy-MM-dd HH:mm:ss"));
//生成一张表(IO流) 07版就是使用xlsx结尾!
FileOutputStream fileOutputStream = new FileOutputStream(PATH + "testWrite07.xlsx");
//输出
workbook.write(fileOutputStream);
//关闭流
fileOutputStream.close();
System.out.println("文件生成完毕!");
}
注意:1,对象的区别,2,文件的后缀!
大文件写入 HSSF
缺点:最多只能处理65536行,否则会抛出异常
java.lang.IllegalArgumentException: Invalid row number (65536) outside allowable range (0..65535)
优点:过程中写入换船,不操作磁盘,最后一次性写入磁盘,速度快
public void testWrite03BigData() throws IOException {
//开始时间
long begin = System.currentTimeMillis();
//创建一个簿
Workbook workbook = new HSSFWorkbook();
//创建表
Sheet sheet = workbook.createSheet();
//写入数据
for (int rowNum = 0; rowNum < 65537; rowNum++) {
Row row = sheet.createRow(rowNum);
for (int cellNum = 0; cellNum < 10; cellNum++) {
Cell cell = row.createCell(cellNum);
cell.setCellValue(cellNum);
}
}
System.out.println("over");
//创建输出流
FileOutputStream fileOutputStream = new FileOutputStream(PATH + "testWrite03BigData.xls");
//通过流的方式写入数据
workbook.write(fileOutputStream);
//关闭流
fileOutputStream.close();
//结束时间
long end = System.currentTimeMillis();
//输出时间差
System.out.println((double) (end-begin)/1000);
}
业务中数据批量导入!
大文件写入XSSF
缺点:写数据时速度非常慢,非常耗内存,也会发生内存溢出,如100万条数据
优点:可以写较大的数据量,比如20万条数据
public void testWrite07BigData() throws IOException {
//开始时间
long begin = System.currentTimeMillis();
//创建一个簿
Workbook workbook = new XSSFWorkbook();
//创建表
Sheet sheet = workbook.createSheet();
//写入数据
for (int rowNum = 0; rowNum < 100000; rowNum++) {
Row row = sheet.createRow(rowNum);
for (int cellNum = 0; cellNum < 10; cellNum++) {
Cell cell = row.createCell(cellNum);
cell.setCellValue(cellNum);
}
}
System.out.println("over");
//创建输出流
FileOutputStream fileOutputStream = new FileOutputStream(PATH + "testWrite07BigData.xlsx");
//通过流的方式写入数据
workbook.write(fileOutputStream);
//关闭流
fileOutputStream.close();
//结束时间
long end = System.currentTimeMillis();
//输出时间差
System.out.println((double) (end-begin)/1000);
}
大文件写入SXSSF
优点:可以写入非常大的数据量,如100万条数据甚至更多,写数据速度快,占用更少的内存
注意:
过程中会产生临时文件,需要清理临时文件
默认有100条记录被保存在内存中,如果超过这个数量,则最前面的数据被写入临时文件
如果想自定义内存中的数据的数量,可以使用 new SXSSFWorkbook(数量)
public void testWrite07BigDataS() throws IOException {
//开始时间
long begin = System.currentTimeMillis();
//创建一个簿
Workbook workbook = new SXSSFWorkbook();
//创建表
Sheet sheet = workbook.createSheet();
//写入数据
for (int rowNum = 0; rowNum < 100000; rowNum++) {
Row row = sheet.createRow(rowNum);
for (int cellNum = 0; cellNum < 10; cellNum++) {
Cell cell = row.createCell(cellNum);
cell.setCellValue(cellNum);
}
}
System.out.println("over");
//创建输出流
FileOutputStream fileOutputStream = new FileOutputStream(PATH + "testWrite07BigDataS.xlsx");
//通过流的方式写入数据
workbook.write(fileOutputStream);
//关闭流
fileOutputStream.close();
//清除临时文件
((SXSSFWorkbook)workbook).dispose();
//结束时间
long end = System.currentTimeMillis();
//输出时间差
System.out.println((double) (end-begin)/1000);
}
SXSSFWorkbook 来自官方的解释:实现“BigGridDemo”策略的流式XSSFWorkbook版本。这允许写入非常大的文件而不会耗尽内存,因为任何时候只有可配置的行部分会被保存在内存中。
请注意,任然可能会消耗大量的内存,这些内存基于您正在使用的功能,例如合并区域,注释。。。仍然只存储在内存中,因此,如果广泛使用需要大量内存
学习自:BiliBili 狂神说Java

浙公网安备 33010602011771号