首先导入相关依赖
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi --><!--xls(03)--><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.2.2</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml --><!--xlsx(07)--><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.2</version></dependency><!-- 日期格式化工具 --><dependency><groupId>joda-time</groupId><artifactId>joda-time</artifactId><version>2.12.5</version></dependency><!--测试--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency>
1 写入简单的数据
public class ExcelWrite {String PATH = "D:\\Idea-projects\\POI\\POI_projects";// 以下是相应的写入操作方法// ......
}
(1)当向03版本的Excel中写入数据
@Testpublic void testWrite03() throws IOException {
// 1.创建一个工作簿Workbook workbook = new HSSFWorkbook();// 2.创建一个工作表Sheet sheet = workbook.createSheet("xx");// 3.创建一行Row row = sheet.createRow(0);
// 4.创建一个单元格Cell cell1 = row.createCell(0);cell1.setCellValue("今日新增观众");Cell cell2 = row.createCell(1);cell2.setCellValue(666);// 创建第二行(2,1)Row row2 = sheet.createRow(1);Cell cell21 = row2.createCell(0);cell21.setCellValue("统计时间");// (2,2)Cell cell22 = row2.createCell(1);String time = new DateTime().toString("yyyy-MM-dd HH:mm:ss");cell22.setCellValue(time);// 5. 生成一张表 (IO 流) 03版本就是使用xls结尾FileOutputStream fileOutputStream = new FileOutputStream(PATH + "xx03.xls");workbook.write(fileOutputStream);// 6.关闭流fileOutputStream.close();System.out.println("文件生成完毕!");}
(2)当向07版本的Excel中写入数据
@Testpublic void testWrite07() throws IOException {
// 1.创建一个工作簿Workbook workbook = new XSSFWorkbook();// 2.创建一个工作表Sheet sheet = workbook.createSheet("xiexu1");// 3.创建一行Row row = sheet.createRow(0);
// 4.创建一个单元格Cell cell1 = row.createCell(0);cell1.setCellValue("今日新增观众");Cell cell2 = row.createCell(1);cell2.setCellValue(666);// 创建第二行(2,1)Row row2 = sheet.createRow(1);Cell cell21 = row2.createCell(0);cell21.setCellValue("统计时间");// (2,2)Cell cell22 = row2.createCell(1);String time = new DateTime().toString("yyyy-MM-dd HH:mm:ss");cell22.setCellValue(time);// 5. 生成一张表(IO 流) 03版本就是使用xlsx结尾FileOutputStream fileOutputStream = new FileOutputStream(PATH + "xiexu07.xlsx");workbook.write(fileOutputStream);// 6.关闭流fileOutputStream.close();System.out.println("文件生成完毕!");}
2 写入大量的数据
(1)当向03版本的Excel中写入大量数据
缺点: 最多只能处理65536行,否则会抛出异常;
优点:过程中写入缓存,不操作磁盘,最后一次性写入磁盘,速度快。
@Testpublic void testWriteBigData03() throws IOException {// 计算时间差long beginTime = System.currentTimeMillis();// 1.创建一个工作簿Workbook workbook = new HSSFWorkbook();// 2.创建一个工作表Sheet sheet = workbook.createSheet("xiexu2");// 3. 写入数据 (03版最多只能放65536行, 超出会报异常)for (int rowNum = 0 ; rowNum < 65536; rowNum++) {Row row = sheet.createRow(rowNum);for (int cellNum = 0; cellNum < 10; cellNum++) {Cell cell = row.createCell(cellNum);cell.setCellValue(cellNum);}}System.out.println("写入完成!");FileOutputStream fileOutputStream = new FileOutputStream(PATH + "bigData03.xls");workbook.write(fileOutputStream);fileOutputStream.close();long endTime = System.currentTimeMillis();System.out.println((double) (endTime - beginTime) / 1000); // 毫秒转换为秒}
1.129s 还是非常快的
只能写入65536行,超出会报异常
(2)当向07版本的Excel中写入大量数据
缺点:写数据时速度非常慢,非常耗内存,也会发生内存溢出,如100万条数据时;
优点:可以写入较大数据量的数据, 如20万条数据。
@Testpublic void testWriteBigData07() throws IOException { // 耗时长// 计算时间差long beginTime = System.currentTimeMillis();// 1.创建一个工作簿Workbook workbook = new XSSFWorkbook();// 2.创建一个工作表Sheet sheet = workbook.createSheet("xiexu3");// 3. 写入数据for (int rowNum = 0 ; rowNum < 65538; rowNum++) { // ? 65538Row 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 + "bigData07.xlsx");workbook.write(fileOutputStream);fileOutputStream.close();long endTime = System.currentTimeMillis();System.out.println((double) (endTime - beginTime) / 1000); // 毫秒转换为秒}
耗时4.812s, 相比于03版本,是非常慢的
可以写入超出65536行的数据
(3)因为07版本写入大量数据时的速度较慢,所以我们可以用07的加速版的做法:SXSSFWorkbork()
优点:可以写非常大的数据量,如100万条甚至更多,写入数据速度快,占用更少的内存;
注意:过程中会产生临时文件,需要清理临时文件(默认有100条记录被保存在内存中,如果超出了这个数量,则最前面的数据被写入临时文件,如果想自定义内存中数据的数量,可以使用 new SXSSFWorkbook(自定义的数量值) )
@Testpublic void testWriteBigData07quick() throws IOException { // SXSSF 更快// 计算时间差long beginTime = System.currentTimeMillis();// 1.创建一个工作簿Workbook workbook = new SXSSFWorkbook();// 2.创建一个工作表Sheet sheet = workbook.createSheet("xiexu4");// 3. 写入数据for (int rowNum = 0 ; rowNum < 65538; rowNum++) { // ? 65538Row 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 + "bigData07quick.xlsx");workbook.write(fileOutputStream);fileOutputStream.close();((SXSSFWorkbook) workbook).dispose(); // 清除临时文件long endTime = System.currentTimeMillis();System.out.println((double) (endTime - beginTime) / 1000); // 毫秒转换为秒}
现在是1.667s相比于之前,还是非常快的