导入依赖
<!--xls(03版本excel)-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.2</version>
</dependency>
<!--xlsx(07版本excel)-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.0</version>
</dependency>
写(创建)一个excel
public class ExcelwriteTest {
//生成文件位置
private static final String PATH="D:\\";
@Test
public void testWrite() throws Exception {
/**
* 创建一个工作簿
* Workbook有三个常用实现类
* 1.HSSFWorkbook 03版xls
* 2.XSSFWorkbook 07版xlsx
* 3.SXSSFWorkbook 可以理解为第二种的plus版,增加读写速度
*/
Workbook workbook = new HSSFWorkbook();
//创建一个工作表sheet
Sheet sheet = workbook.createSheet("03版写入测试");
//创建一行(0表示创建的是第一行)
Row row1 = sheet.createRow(0);
//创建一个单元格(这个单元格表示的是第一行第一列的单元格,即坐标(1,1))
Cell cell11 = row1.createCell(0);
//给这个单元格赋值
cell11.setCellValue("坐标(1,1)");
//生成Excel文件(使用io流),注:文件后缀要与excel版本对应
FileOutputStream fileOutputStream = new FileOutputStream(PATH + "03版excel测试写入.xls");
//写入
workbook.write(fileOutputStream);
//文件写完后关闭流
fileOutputStream.close();
System.out.println("03版excel创建完成");
//若想要创建07版本仅需修改两处,1.创建工作簿出改为new XSSFWorkbook(); 2.生成文件名后缀要对应07版本改为.xlsx
}
}
当写入大量数据时03版和07版的区别
大文件写入03版(HSSF):
优点:写入过程中不操作磁盘,而是先都写入缓存,最后一次性写入磁盘。
缺点:最多写入65536行数据,超出则抛出异常。
大文件写入07版(XSSF):
优点:可以写入较大数据量,如10万。
缺点:写入数据非常慢,非常耗内存,当数据量过大也会内存溢出,如100万。
正因为07版XSSF有这些缺点所以有了plus版SXSSF
SXSSF:可以写入非常大数据量百万级,写入速度快,占用内存少。过程中会产生临时文件,需要清理。(如广泛使用,仍需大量内存)。
测试写入速度
@Test
public void testSpeed() throws Exception {
long beginTime = System.currentTimeMillis();
//创建一个工作簿
Workbook workbook = new HSSFWorkbook();
//创建一个工作表sheet
Sheet sheet = workbook.createSheet("03版写入速度测试");
//写入数据
for (int rowNum = 0; rowNum < 65536; rowNum++) {
//循环创建行,注意03版最多写入65536行
Row row = sheet.createRow(rowNum);
for (int cellNum = 0; cellNum <= 6; cellNum++) {
//循环创建单元格,这里每行5个
Cell cell = row.createCell(cellNum);
cell.setCellValue(cellNum);
}
}
System.out.println("数据准备完成");
//生成Excel文件(使用io流),注:文件后缀要与excel版本对应
FileOutputStream fileOutputStream = new FileOutputStream(PATH + "03版excel测试写入速度.xls");
//写入
workbook.write(fileOutputStream);
//文件写完后关闭流
fileOutputStream.close();
//清除临时文件,使用SXSSF时开启下面这句话
//((SXSSFWorkbook)workbook).dispose();
long endTime = System.currentTimeMillis();
System.out.println("数据写入完成,耗时:" + (double) (endTime - beginTime) / 1000);
//同理,测试XSSFWorkbook和SXSSFWorkbook时,只需修改创建的工作簿对象和生成文件后缀名
}
其他记录文章
POI读取Excel
POI读取excel中公式