Apache POI操作Excel详解

Maven依赖

XML 复制代码
<!-- 核心库(支持.xls) -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
</dependency>

<!-- 支持.xlsx格式 -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
</dependency>

核心概念

类名 作用 对应格式
SXSSFWorkbook 大数据量导出(流式处理) .xlsx
Sheet 工作表 通用
Row 通用
Cell 单元格 通用

基础操作

java 复制代码
private void test() {
        //创建工作簿
		Workbook workbook = new SXSSFWorkbook();
		Sheet sheet = workbook.createSheet();

		//创建表头
        //创建第一行
		Row row = sheet.createRow(0);
        //第一行 第一列
		row.createCell(0).setCellValue("姓名");
        //第一行 第二列
		row.createCell(1).setCellValue("年龄");

        //创建第二行
		Row row1 = sheet.createRow(1);
        //第二行 第一列
		row1.createCell(0).setCellValue("张三");
        //第二行 第二列
		row1.createCell(1).setCellValue("18");

        //创建第三行
		Row row2 = sheet.createRow(2);
        //第三行 第一列
		row2.createCell(0).setCellValue("李四");
        //第三行 第二列
		row2.createCell(1).setCellValue("20");

		try (FileOutputStream fileOutputStream = new FileOutputStream("学生信息.xlsx")) {
			workbook.write(fileOutputStream);
            workbook.close();
		} catch (Exception e) {
            throw new RuntimeException();
		}
	}

封装工具类使用 ExcelUtils

读取文件

java 复制代码
ExcelUtils.read(OPCPackage.open(inputStream), 1, (row, index) -> {
	String keyword = ExcelUtils.getString(row.getCell(0));
	String cityName = ExcelUtils.getString(row.getCell(1));
	String positionType = ExcelUtils.getString(row.getCell(2));
	if (StringUtils.isEmpty(keyword) || "未匹配到城市".equals(cityName) || "未匹配到工种".equals(positionType)) {
		return;
	}
	PositionSeoKeywordRequest keywordRequest = PositionSeoKeywordRequest.builder().keyword(keyword)
			.positionType(positionType).cityName(cityName)
			.deleted(0L).createTime(now).updateTime(now).build();
	list.add(keywordRequest);
});

写文件

java 复制代码
//创建工作簿实例
Workbook workbook = new SXSSFWorkbook();
// sheet页1-拉新业务看板数据
int sheet1Volume = ExcelUtils.write(
	workbook,
	(page, size) -> this.customerShareRelationRecordService.listCustomerShareSummaries(
			param.getPeriod(), param.getSharerId(), Paging.of(page, size)
	),
	(row, summary, i) -> {
		EmployeeDTO employee = employeesMap.get(summary.getSharerId());
		// sharerId = 0 代表是合计总数
		row.createCell(0).setCellValue(
				summary.getSharerId() == 0L ? "合计" : employee == null ? null : employee.getName()
		);
		row.createCell(1).setCellValue(employee == null ? null : employee.getMobile());
		row.createCell(2).setCellValue(summary.getRegisterCount());
		row.createCell(3).setCellValue(
				summary.getReleasePositionNormalCount() + summary.getReleasePositionAbnormalCount()
		);
		row.createCell(4).setCellValue(summary.getReleasePositionNormalCount());
		row.createCell(5).setCellValue(summary.getReleasePositionAbnormalCount());
	},
	"销售人员", "手机号", "注册人数", "发布职位人数", "发布职位人数-正常用户", "发布职位人数-异常用户"
);
workbook.setSheetName(0, "汇总数据");

// sheet页2-异常用户明细数据
int sheet2Volume = ExcelUtils.write(
	workbook,
	(page, size) -> this.customerShareRelationRecordService.listEachTypeUsers(
			param.getPeriod(), param.getSharerId(), Paging.of(page, size), CustomerShareType.ABNORMAL
	),

	(row, abnormal, i) -> {
		EmployeeDTO employee = employeesMap.get(abnormal.getSharerId());
		row.createCell(0).setCellValue(ObjectUtils.ifNull(employee, EmployeeDTO::getName));
		row.createCell(1).setCellValue(abnormal.getMobile());
		row.createCell(2).setCellValue(DateUtils.format(abnormal.getOperateTime()));
		row.createCell(3).setCellValue(abnormal.getAbnormalMobile());
	},
	"销售人员", "用户登录手机号", "发布职位日期", "发布职位信息填写联系电话"
);
workbook.setSheetName(1, "发布职位人-异常用户明细");

// sheet页3-正常用户明细数据
int sheet3Volume = ExcelUtils.write(
	workbook,
	(page, size) -> this.customerShareRelationRecordService.listEachTypeUsers(
			param.getPeriod(), param.getSharerId(), Paging.of(page, size), CustomerShareType.NORMAL
	),

	(row, abnormal, i) -> {
		EmployeeDTO employee = employeesMap.get(abnormal.getSharerId());
		row.createCell(0).setCellValue(ObjectUtils.ifNull(employee, EmployeeDTO::getName));
		row.createCell(1).setCellValue(abnormal.getMobile());
		row.createCell(2).setCellValue(DateUtils.format(abnormal.getOperateTime()));
		row.createCell(3).setCellValue(abnormal.getAbnormalMobile());
	},
	"销售人员", "用户登录手机号", "发布职位日期", "发布职位信息填写联系电话"
);
workbook.setSheetName(2, "发布职位人-正常用户明细");

// 保存文件
File attachment = new File(this.getExportDirectory(), String.valueOf(exportationId));
try (OutputStream output = new FileOutputStream(attachment)) {
workbook.write(output);
workbook.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
//导出完成
this.exportationService.completeExporting(exportationId, sheet1Volume + sheet2Volume + sheet3Volume);
java 复制代码
private File doExportRecruitData(List<PositionEmailSendDTO> positionEmailSendDTOS) {
	File attachment = new File(getExportDirectory(), UUID.randomUUID() + EXCEL_EXTENSION);
	try (Workbook workbook = new SXSSFWorkbook()) {
		Sheet sheet = ExcelUtils.initializeSheet(workbook,EXCEL_HEADERS);
		for (int i = 0, size = positionEmailSendDTOS.size(); i < size; i++) {
			PositionEmailSendDTO label = positionEmailSendDTOS.get(i);
			Row row = sheet.createRow(i+1);
			row.createCell(0).setCellValue(label.getTitle());
			row.createCell(1).setCellValue(label.getDescription());
			row.createCell(2).setCellValue(label.getRegionName());
			row.createCell(3).setCellValue(label.getType().getDescription());
			row.createCell(4).setCellValue(label.getMobile());
		}
		try (OutputStream output = new FileOutputStream(attachment)) {
			workbook.write(output);
			workbook.close();
		}
		return attachment;
	} catch (Exception e) {
		log.error("【招聘数据邮件发送定时器】导出失败:{}",e.getMessage());
		throw new RuntimeException("Failed to export recruitment data", e);
	}
}
相关推荐
Kay_Liang6 小时前
大语言模型如何精准调用函数—— Function Calling 系统笔记
java·大数据·spring boot·笔记·ai·langchain·tools
自由的疯6 小时前
Java 如何学习Docker
java·后端·架构
自由的疯6 小时前
Java Docker本地部署
java·后端·架构
007php0076 小时前
猿辅导Java面试真实经历与深度总结(二)
java·开发语言·python·计算机网络·面试·职场和发展·golang
摇滚侠6 小时前
Spring Boot 3零基础教程,WEB 开发 内容协商机制 笔记34
java·spring boot·笔记·缓存
一勺菠萝丶6 小时前
在 macOS 上用 Docker 为 Java 后端 & 常见开发需求搭建完整服务(详尽教程)
java·macos·docker
顾漂亮6 小时前
JVM底层攻坚
java·jvm·spring
编程岁月6 小时前
java面试-0215-HashMap有序吗?Comparable和Comparator区别?集合如何排序?
java·数据结构·面试
木井巳6 小时前
[Java数据结构与算法]详解排序算法
java·数据结构·算法·排序算法
没有bug.的程序员8 小时前
分布式架构未来趋势:从云原生到智能边缘的演进之路
java·分布式·微服务·云原生·架构·分布式系统