1、POI工具介绍
1.1、POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能。
1.2、主要是运用其中读取和输出excel的功能。
1.3、POI官网地址:
https://poi.apache.org/components/index.html
2、POI可操作的文件类型
3、POI所需依赖
<!--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>
4、xls和xlsx的区别
xls是excel03版本 xlsx是excel07版本
最大的区别是行列数不同
xls最大支持65536行、256列
xlsx最大支持1048576行、16384列
poi操作
poi 操作xls
poi-ooml操作xlsx
5、POI Excel 写 03(xls)和07(xlsx)版本方式
package poi;import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.junit.Test;import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;/*** @author yw* @since 2022/11/20*/
public class ExcelWrite {public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";String PATH = "D:\\excel\\";/*** 写工作簿 03版本*/@Testpublic void Write03() throws Exception {//1.创建一个工作簿Workbook workbook = new HSSFWorkbook();//2.创建 一个工作表Sheet sheet = workbook.createSheet("工人表");//3.创建一行Row row1 = sheet.createRow(0);//4.创建一个单元格//(1,1)Cell cell1 = row1.createCell(0);cell1.setCellValue("工号");//(1,2)Cell cell2 = row1.createCell(1);cell2.setCellValue("日期");//创建第二行Row row2 = sheet.createRow(1);//(2,1)Cell cell21 = row2.createCell(0);cell21.setCellValue(001);//(2,2)Cell cell22 = row2.createCell(1);SimpleDateFormat sdf = new SimpleDateFormat(DEFAULT_DATE_FORMAT);String datetime = sdf.format(new Date());cell22.setCellValue(datetime);//生成一张表(IO流),03版本就是使用xls结尾FileOutputStream fos = new FileOutputStream(PATH + "工人表03.xls");//输出workbook.write(fos);//关闭流fos.close();System.out.println("文件生成完毕");}/*** 写工作簿 07版本*/@Testpublic void Write07() throws Exception {//1.创建一个工作簿Workbook workbook = new XSSFWorkbook();//2.创建 一个工作表Sheet sheet = workbook.createSheet("工人表");//3.创建一行Row row1 = sheet.createRow(0);//4.创建一个单元格//(1,1)Cell cell1 = row1.createCell(0);cell1.setCellValue("工号");//(1,2)Cell cell2 = row1.createCell(1);cell2.setCellValue("日期");//创建第二行Row row2 = sheet.createRow(1);//(2,1)Cell cell21 = row2.createCell(0);cell21.setCellValue(001);//(2,2)Cell cell22 = row2.createCell(1);SimpleDateFormat sdf = new SimpleDateFormat(DEFAULT_DATE_FORMAT);String datetime = sdf.format(new Date());cell22.setCellValue(datetime);//生成一张表(IO流),03版本就是使用xlsx结尾FileOutputStream fos = new FileOutputStream(PATH + "工人表07.xlsx");//输出workbook.write(fos);//关闭流fos.close();System.out.println("文件生成完毕");}
}
6、HSSF和XSSF写大文件的区别
6.1、使用HSSF写大文件
@Testpublic void Write03BigData() throws Exception{//时间long begin = System.currentTimeMillis();//1.创建一个工作簿Workbook workbook = new HSSFWorkbook();//2.创建一个表Sheet sheet = workbook.createSheet("sheet1");//写入数据for (int rowNum = 0;rowNum<65536;rowNum++){//3.创建行Row row = sheet.createRow(rowNum);for (int CellNum = 0;CellNum<10;CellNum++){Cell cell = row.createCell(CellNum);cell.setCellValue(CellNum);}}System.out.println("over");//获取io流FileOutputStream fos = new FileOutputStream(PATH+"Write03BigData.xlsx");//生成一张表workbook.write(fos);fos.close();long end = System.currentTimeMillis();System.out.println("耗时:"+(end-begin));}
优点:过程中写入缓存,不操作磁盘,最后再一次性导入磁盘,速度快+
缺点:但是只能写入65535条数据,超过就会报异常
6.2、使用XSSF写大文件
@Testpublic void Write07BigData() throws Exception{//时间long begin = System.currentTimeMillis();//1.创建一个工作簿Workbook workbook = new XSSFWorkbook();//2.创建一个表Sheet sheet = workbook.createSheet("sheet1");//写入数据for (int rowNum = 0;rowNum<1000000;rowNum++){//3.创建行Row row = sheet.createRow(rowNum);for (int CellNum = 0;CellNum<10;CellNum++){Cell cell = row.createCell(CellNum);cell.setCellValue(CellNum);}}System.out.println("over");//获取io流FileOutputStream fos = new FileOutputStream(PATH+"Write07BigData.xlsx");//生成一张表workbook.write(fos);fos.close();long end = System.currentTimeMillis();System.out.println("耗时:"+(end-begin));}
优点:可以写较大数据量(超过655135条),如10万条
缺点:写数据时,速度非常慢,非常消耗内存,也会容易发生内存溢出,如100万条的时候。
6.3、使用SXSS写大文件
@Testpublic void Write07BigDataS() throws Exception{//时间long begin = System.currentTimeMillis();//1.创建一个工作簿Workbook workbook = new SXSSFWorkbook(200);//2.创建一个表Sheet sheet = workbook.createSheet("sheet1");//写入数据for (int rowNum = 0;rowNum<1000000;rowNum++){//3.创建行Row row = sheet.createRow(rowNum);for (int CellNum = 0;CellNum<10;CellNum++){Cell cell = row.createCell(CellNum);cell.setCellValue(CellNum);}}System.out.println("over");//获取io流FileOutputStream fos = new FileOutputStream(PATH+"Write07BigDataS.xlsx");//生成一张表workbook.write(fos);fos.close();//清除临时文件((SXSSFWorkbook) workbook).dispose();long end = System.currentTimeMillis();System.out.println("耗时:"+(end-begin));}
优点:可以写超大数据量的,比如100万条,写数据速度更快,占用更少内存
注意:
1、过程中会产生临时文件,结束时需要注意清理
2、默认100条记录会保存在内存中,如果超过这个数据,则最前面的数据会被写入磁盘中
3、如果想自定义内存中的数量,则可以new SXSSFWorkbook(自定义数量)
SXSSFWorkbook-来至官方的解释︰实现"BigGridDemo"策略的流式XSSFWorkbook版本。这允许写入非常大的文件而不会耗尽内存,因为任何时候只有可配置的行部分被保存在内存中。