Spring Boot 集成 POI
Spring Boot 集合 POI
Apache POI 官站:https://poi.apache.org/
基础概念
Apache POI 是一个开源项目,提供 Java API 用于操作 Microsoft Office 文件格式。Apache POI 对 Excel 文件的处理分为两个主要类库:
- HSSF (Horrible Spreadsheet Format):用于处理 Excel 97-2003 文件格式 (.xls)。
- XSSF (XML Spreadsheet Format):用于处理 Excel 2007 及以上版本文件格式 (.xlsx)。
具体到 Excel 文件的处理,POI 提供了一些核心对象以支持对工作簿、工作表、单元格的操作:
- Workbook:表示一个 Excel 文件。
- Sheet:表示一个工作表,可以包含多个 Sheet。
- Row:表示工作表中的一行。
- Cell:表示行中的一个单元格。
添加依赖
<!-- 引入【Apache POI】依赖 集成POI操作excel使用-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.1</version>
</dependency>
POI 写操作
简单写入导出
@Test
public void easyOutPutExcelTest() throws Exception {
// 1. 创建 Excel 文件(工作簿)
XSSFWorkbook workbook = new XSSFWorkbook();
//2.创建工作表(并给sheet取名”)
XSSFSheet sheet = workbook.createSheet("大铁锤de数据表");
// 3.创建excel行,填充数据(示例)
XSSFRow row = sheet.createRow(0);
row.createCell(0).setCellValue("时间");
row.createCell(1).setCellValue(DateUtils.getDateString());
XSSFRow row1 = sheet.createRow(1);
row1.createCell(0).setCellValue("地点");
row1.createCell(1).setCellValue("深圳市南山区");
// 3. 获取桌面路径(Windows/Mac/Linux 通用)
String desktopPath = System.getProperty("user.home") + "/Desktop/大铁锤de数据表.xlsx";
// 4. 保存到桌面
try (FileOutputStream outputStream = new FileOutputStream(desktopPath)) {
workbook.write(outputStream);
}
workbook.close();
System.out.println("文件已保存到桌面!");
}
自定义写入导出
@Test
public void testCustomWriteExportExcel() {
//获取下载路径(Windows/Mac/Linux 通用)
String desktopPath = System.getProperty("user.home") + "/Desktop/自定义写入导出.xlsx";
try (XSSFWorkbook workbook = new XSSFWorkbook();
FileOutputStream fileOut = new FileOutputStream(desktopPath)) {
XSSFSheet sheet = workbook.createSheet();
//创建表头行
XSSFRow headerRow = sheet.createRow(0);
//创建表头单元格样式
XSSFCellStyle headerStyle = workbook.createCellStyle();
//设置背景色 - 使用RGB颜色
headerStyle.setFillForegroundColor(new XSSFColor(new byte[]{(byte) 255, (byte) 184, (byte) 77}, null));
headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
//创建字体
XSSFFont headerFont = workbook.createFont();
headerFont.setBold(true);
headerStyle.setFont(headerFont);
// 创建表头单元格并应用样式
String[] headers = {"编号", "姓名", "年龄", "工作", "地址"};
for (int i = 0; i < headers.length; i++) {
XSSFCell cell = headerRow.createCell(i);
cell.setCellValue(headers[i]);
cell.setCellStyle(headerStyle);
}
workbook.write(fileOut);
System.out.println("文件已保存到桌面!");
} catch (IOException e) {
e.printStackTrace();
}
}
大量数据写入导出
@Test
public void writBigDataTestSuper() throws Exception{
long begin = System.currentTimeMillis();
//1.创建工作簿 SXSSFWorkbook——(耗时比较短,适合大量数据操作)
SXSSFWorkbook workbook = new SXSSFWorkbook();
//创建工作表
SXSSFSheet sheet = workbook.createSheet();
for (int rowNum = 0; rowNum < 100000; rowNum++) {
SXSSFRow row = sheet.createRow(rowNum);
row.createCell(0).setCellValue("时间");
row.createCell(1).setCellValue(DateUtils.getDateString());
}
String desktopPath = System.getProperty("user.home") + "/Desktop/大铁锤大数据表.xlsx";
try (FileOutputStream outputStream = new FileOutputStream(desktopPath)) {
workbook.write(outputStream);
} catch (IOException e) {
e.printStackTrace();
} finally {
workbook.close(); // ✅ 清理临时文件,确保 workbook 被关闭(即使在写入时发生异常)
}
long end = System.currentTimeMillis();
System.out.println("文件已保存到桌面!使用【SXSSFWorkbook】工作簿耗时:"+(double)(end-begin)/1000+"秒");
}
POI 读操作
简单导入操作
@Test
public void easyReadDateExcelTest() throws IOException {
//获取文件流
FileInputStream inputStream = new FileInputStream(System.getProperty("user.home") + "/Desktop/大铁锤de数据表.xlsx");
//1.创建一个工作簿,使用excel 能操作的都可以在HSSFWorkbook对象中设置
try (Workbook workbook = new XSSFWorkbook(inputStream)) {
//得到表
Sheet sheet = workbook.getSheetAt(0);
//得到行
Row row = sheet.getRow(0);
//得到列
Cell cell = row.getCell(1);
//获取垓值
System.out.println(cell.getStringCellValue());
inputStream.close();
}
}
常用注解
CellType 枚举类注释
枚举值 | 值 | 含义 |
---|---|---|
_NONE | -1 | 内部保留类型(不直接对应 Excel 单元格类型,POI 内部使用) |
NUMERIC | 0 | 数值类型(包括整数、小数、日期/时间等,Excel 中日期存储为数值) |
STRING | 1 | 字符串类型(通过 setCellValue("text") 设置的文本,或富文本单元格) |
FORMULA | 2 | 公式类型(单元格包含公式,如 =A1+B1 ,通过 getCachedFormulaResultType() 获取结果类型) |
BLANK | 3 | 空白单元格(无内容,但可能有格式,如背景色) |
BOOLEAN | 4 | 布尔类型(值为 TRUE 或 FALSE ) |
ERROR | 5 | 错误值类型(如 #VALUE! 、#DIV/0! 等错误码) |