Apache POI操作Excel详解

news2025/6/9 0:33:04

Maven依赖 

<!-- 核心库(支持.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单元格通用

基础操作

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

读取文件

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);
});

写文件

//创建工作簿实例
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);
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);
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2404754.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker容器部署elasticsearch8.*与Kibana8.*版本使用filebeat采集日志

第 1 步&#xff1a;使用 Docker Compose 部署 Elasticsearch 和 Kibana 首先&#xff0c;我们需要创建一个 docker-compose.yml 文件来定义和运行 Elasticsearch 和 Kibana 服务。这种方式可以轻松管理两个容器的配置和网络。 创建 docker-compose.yml 文件 在一个新的文件夹…

OpenCV CUDA模块图像处理------双边滤波的GPU版本函数bilateralFilter()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 该函数在 GPU 上执行双边滤波操作&#xff0c;是一种非线性平滑滤波器&#xff0c;能够在 保留边缘的同时去除噪声。 函数原型 void cv::cuda:…

华为手机开机卡在Huawei界面不动怎么办?

遇到华为手机卡在启动界面&#xff08;如HUAWEI Logo界面&#xff09;的情况&#xff0c;可依次尝试以下解决方案&#xff0c;按操作复杂度和风险由低到高排序&#xff1a; &#x1f527; 一、强制重启&#xff08;优先尝试&#xff09; 1.通用方法‌ 长按 ‌电源键 音量下键‌…

go语言map扩容

map是什么&#xff1f; ​在Go语言中&#xff0c;map是一种内置的无序key/value键值对的集合&#xff0c;可以根据key在O(1)的时间复杂度内取到value&#xff0c;有点类似于数组或者切片结构&#xff0c;可以把数组看作是一种特殊的map&#xff0c;数组的key为数组的下标&…

5.3 Spring Boot整合JPA

本文详细介绍了如何在Spring Boot项目中整合Spring JPA&#xff0c;实现对数据库的高效操作。首先&#xff0c;创建Spring Boot项目并添加必要的依赖&#xff0c;如Druid数据源。接着&#xff0c;配置数据源属性&#xff0c;创建实体类Comment和Article&#xff0c;并使用JPA注…

腾讯开源视频生成工具 HunyuanVideo-Avatar,上传一张图+一段音频,就能让图中的人物、动物甚至虚拟角色“活”过来,开口说话、唱歌、演相声!

腾讯混元团队提出的 HunyuanVideo-Avatar 是一个基于多模态扩散变换器&#xff08;MM-DiT&#xff09;的模型&#xff0c;能够生成动态、情绪可控和多角色对话视频。支持仅 10GB VRAM 的单 GPU运行&#xff0c;支持多种下游任务和应用。例如生成会说话的虚拟形象视频&#xff0…

[文献阅读] Emo-VITS - An Emotion Speech Synthesis Method Based on VITS

[文献阅读]&#xff1a;An Emotion Speech Synthesis Method Based on VITS 在VITS基础上通过参考音频机制&#xff0c;获取情感信息&#xff0c;从而实现的情感TTS方式。 摘要 VITS是一种基于变分自编码器&#xff08;VAE&#xff09;和对抗神经网络&#xff08;GAN&#xf…

OpenCV-Python Tutorial : A Candy from Official Main Page(持续更新)

OpenCV-Python 是计算机视觉领域最流行的开源库之一&#xff0c;它结合了 OpenCV (Open Source Computer Vision Library) 的 C 高性能实现和 Python 的简洁易用特性&#xff0c;为开发者提供了强大的图像和视频处理能力。具有以下优势&#xff1a; 典型应用领域&#xff1a; …

【Vue】指令补充+样式绑定+计算属性+侦听器

【指令补充】 【指令修饰符】 指令修饰符可以让指令的 功能更强大&#xff0c;书写更便捷 分类&#xff1a; 1.按键修饰符&#xff08;侦测当前点击的是哪个按键&#xff09; 2.事件修饰符&#xff08;简化程序对于阻止冒泡&#xff0c; 一些标签的默认默认行为的操作&…

LLM 笔记:Speculative Decoding 投机采样

1 基本介绍 投机采样&#xff08;Speculative Sampling&#xff09;是一种并行预测多个可能输出&#xff0c;然后快速验证并采纳正确部分的加速策略 在不牺牲输出质量的前提下&#xff0c;减少语言模型生成 token 所需的时间 传统的语言模型生成是 串行 的 必须生成一个&…

当SAP系统内计划订单转换为生产订单时发生了什么?

【SAP系统研究】 #SAP #计划订单 #生产订单 #采购申请 一、关于计划订单的一点疑惑 曾经对SAP为什么会有计划订单,是感到很疑惑的。 这个界面简单,配置点也不多,能被随意“摆布”,一旦要变形就消失得无影无踪的计划订单,why? 但是,再次重新审视过之后,才发现它其实…

PDF转PPT转换方法总结

你是否遇到过这些场景&#xff1f; 收到客户发来的产品手册PDF&#xff0c;明天就要用它做演示&#xff1b; 公司历史资料只有PDF版&#xff0c;领导突然要求更新为幻灯片。 这时PDF转PPT工具就成了救命稻草。接下来&#xff0c;介绍三种PDF转PPT工具。 1. iLoveOFD在线转换…

3D Web轻量化引擎HOOPS Communicator的定制化能力全面解析

HOOPS Communicator 是Tech Soft 3D推出的高性能Web工程图形引擎。它通过功能丰富的JavaScript API&#xff0c;帮助开发团队在浏览器中快速添加2D/3D CAD模型的查看与交互功能。该引擎专为工程应用优化&#xff0c;支持大规模模型的流畅浏览、复杂装配的智能导航、流式加载和服…

【力扣链表篇】19.删除链表的倒数第N个节点

题目&#xff1a; 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5]示例 2&#xff1a; 输入&#xff1a;head [1], n 1 输出&#xff1a;[]…

如何使用Jmeter进行压力测试?

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、什么是压力测试 软件测试中&#xff1a;压力测试&#xff08;Stress Test&#xff09;&#xff0c;也称为强度测试、负载测试。压力测试是模拟实际应用的软硬…

Grafana-ECharts应用讲解(玫瑰图示例)

工具: MySQL 数据库 MySQL Workbench 数据库管理工具(方便编辑数据) Grafana v11.5.2 Business Charts 6.6(原 Echarts插件) 安装 安装 MySQL社区版安装 MySQL Workbench安装 Grafana在 Grafana 插件中搜索 Business Charts 进行安装以上安装步骤网上教程很多,自行搜…

前端vue3 上传/导入文件 调用接口

点击按钮导入&#xff1a; <el-uploadaction"https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15":auto-upload"false":on-change"handleFileChange":show-file-list"false"><el-button type"warning"…

Python训练营-Day22-Titanic - Machine Learning from Disaster

Description linkkeyboard_arrow_up &#x1f44b;&#x1f6f3;️ Ahoy, welcome to Kaggle! You’re in the right place. This is the legendary Titanic ML competition – the best, first challenge for you to dive into ML competitions and familiarize yourself w…

FreeCAD:开源世界的三维建模利器

FreeCAD 开发模式 FreeCAD的开发采用多语言协作模式&#xff0c;其核心框架与高性能模块主要使用C构建&#xff0c;而用户界面与扩展功能则通过Python脚本实现灵活定制。具体来说&#xff1a; C核心层&#xff1a;作为基础架构&#xff0c;C负责实现与Open CASCADE Technology…

嵌入式里的时间魔法:RTC 与 BKP 深度拆解

文章目录 RTC实时时钟与BKPUnix时间戳UTC/GMT时间戳转换时间戳转换BKP简介BKP基本结构1. 电池供电模块&#xff08;VBAT 输入&#xff09;2. 侵入检测模块&#xff08;TAMPER 输入&#xff09;3. 时钟输出模块&#xff08;RTC 输出&#xff09;4. 内部寄存器组 RTC简介RTC时钟源…