当前位置: 首页 > news >正文

POI从入门到上手(一)-轻松完成Apache POI使用,完成Excel导入导出.

前言:

Apache POI

        是一个流行的 Java 库,用于处理 Microsoft Office 格式文件,提供丰富 API 来创建、读取和修改 Office 文档。

1.官网Apache POI™ - the Java API for Microsoft Documents

2.优点:功能强大,可处理复杂 Excel 文件;稳定性高,受广泛支持与维护;灵活性好,能满足定制需求。

3.缺点:学习曲线陡,对初学者成本高;处理大量数据时性能受影响。

EasyPoi

        主打功能简单易用,通过简单注解和模板语言就能实现 Excel 导出、导入、Word 模板导出等功能。

1.官网https://gitee.com/lemur/easypoi

2.优点:API 接口简洁,操作便捷;功能丰富,支持多种操作;基于 Apache POI 和 JexcelApi,易于扩展;文档详细,便于学习使用。

3.缺点:与 Apache POI 相比,高级功能有限;因封装层存在,处理大量数据有性能损耗。

EasyExcel

        是阿里巴巴基于 Apache POI 封装的开源框架,专注 Excel 文件读写。

1.官网EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel 官网

2.优点:API 简洁,使用方便;处理大量数据时性能高;支持注解配置导入导出规则,简化开发。

3.缺点:相比 Apache POI,功能简单,无法满足复杂需求;定制化能力不如 Apache POI 灵活。

一、ApachePOI

1.1、文件格式和特点

1.1.1、HSSF

        HSSF 用于处理 Excel 97 - 2003 版本的二进制格式 .xls 文件,该文件最大行数 65536、最大列数 256。处理数据时会将整个文件加载到内存,处理大数据量易致内存溢出、性能显著下降;处理小数据量时,因文件结构简单性能较好。它支持 .xls 文件所有特性,但受文件格式限制,功能有限。

1.1.2、XSSF

        XSSF 用于处理 Excel 2007 及以后版本基于 XML 的 .xlsx 文件,突破了 .xls 文件行列限制,最多支持 1048576 行和 16384 列。处理时会将整个文档加载到内存,处理大量数据时内存占用问题严重,可能出现内存不足错误,性能受影响;处理中等数据量时性能不错。支持 .xlsx 文件丰富特性,功能强大且兼容性好。

1.1.3、SXSSF

        SXSSF 用于处理 Excel 2007 及以后的 .xlsx 文件,是 XSSF 的流式扩展。它采用流式处理,仅在内存保留指定数量的行,超出部分写入临时文件,大幅减少内存占用,适合处理超大数据量,处理大数据时性能优势明显,能避免内存溢出。不过处理小数据量时,因频繁读写临时文件,性能可能不如 HSSF 和 XSSF。它继承了 XSSF 大部分功能,但流式处理会使部分功能受限,如写入磁盘的行无法修改。

1.2、XSSF格式导入导出

1.2.1、引入依赖

<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.2.3</version>
</dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.3</version>
</dependency>

1.2.2、数据导入

/*** XSSFE* 导入excel*/@RequestMapping(value = "/XSSFImportExcel")public List<SysUser> XSSFImportExcel() {List<SysUser> userList = new ArrayList<>();try (FileInputStream file = new FileInputStream(new File("/Users/admin/Desktop/ExcelPoi.xlsx"));Workbook workbook = new XSSFWorkbook(file)) {// 获取第一个工作表Sheet sheet = workbook.getSheetAt(0);// 跳过表头,从第二行开始读取数据for (int i = 1; i <= sheet.getLastRowNum(); i++) {Row row = sheet.getRow(i);if (row != null) {// 假设列顺序为:用户姓名, 真实姓名, 用户名, 密码, 登陆ip, 登陆时间, 登陆次数, 账号状态String uname = getCellValueAsString(row.getCell(0));String realName = getCellValueAsString(row.getCell(1));String iphone = getCellValueAsString(row.getCell(2));String ipassword = getCellValueAsString(row.getCell(3));String lastloginip = getCellValueAsString(row.getCell(4));String lastlogintime = getCellValueAsString(row.getCell(5));long ltime = 0;if (!lastlogintime.isEmpty()){ltime = DateUtils.DateTimeToTimestamp(lastlogintime);}String logintimes = getCellValueAsString(row.getCell(6));String state = getCellValueAsString(row.getCell(7));// 创建用户实例SysUser user = new SysUser();user.setUname(uname);user.setRealName(realName);user.setIphone(iphone);user.setIpassword(ipassword);user.setLastloginip(lastloginip);user.setLastlogintime(ltime);user.setLogintimes(logintimes);user.setState(Integer.parseInt(state));userList.add(user);userList.add(user);// 添加到数据库userService.addUser(user);}}} catch (IOException e) {e.printStackTrace();}return userList;}private String getCellValueAsString(Cell cell) {if (cell == null) {return "";}switch (cell.getCellType()) {case STRING:return cell.getStringCellValue();case NUMERIC:return String.valueOf((int) cell.getNumericCellValue());case BOOLEAN:return String.valueOf(cell.getBooleanCellValue());default:return "";}}

1.2.3、数据导出

/*** XSSFE* 导出excel*/@RequestMapping(value = "/XSSFExcelWrite")public void XSSFExcelWrite(HttpServletRequest request, HttpServletResponse response) throws ParseException {// 创建 SXSSFWorkbook 对象,内存中保留 100 行Workbook workbook = new XSSFWorkbook();// 创建工作表Sheet sheet = workbook.createSheet("用户信息");// 创建表头Row headerRow = sheet.createRow(0);String[] headers = {"用户姓名", "真实姓名", "用户名", "密码", "登陆ip", "登陆时间", "登陆次数", "账号状态"};for (int i = 0; i < headers.length; i++) {Cell cell = headerRow.createCell(i);cell.setCellValue(headers[i]);}// 获取数据List<SysUser> data = userService.userList();// 填充数据for (int i = 0; i < data.size(); i++) {Row row = sheet.createRow(i + 1);SysUser user = data.get(i);// 用户姓名Cell nameCell = row.createCell(0);nameCell.setCellValue(user.getUname());// 真实姓名Cell realNameCell = row.createCell(1);realNameCell.setCellValue(user.getRealName());// 用户名Cell iphoneCell = row.createCell(2);iphoneCell.setCellValue(user.getIphone());// 密码Cell ipasswordCell = row.createCell(3);ipasswordCell.setCellValue(user.getIpassword());// 登陆ipCell lastloginipCell = row.createCell(4);lastloginipCell.setCellValue(user.getLastloginip());// 登陆时间Cell lastlogintimeCell = row.createCell(5);if (user.getLastlogintime() != 0) {lastlogintimeCell.setCellValue(DateUtils.TimestampToDateTime(user.getLastlogintime()));}// 登陆次数Cell logintimesCell = row.createCell(6);logintimesCell.setCellValue(user.getLogintimes());// 账号状态Cell stateCell = row.createCell(7);stateCell.setCellValue(user.getState());}// 设置响应头response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");try {String fileName = URLEncoder.encode("ExcelPoi_" + System.currentTimeMillis() + ".xlsx", "UTF-8");response.setHeader("Content-Disposition", "attachment;filename=" + fileName);OutputStream outputStream = response.getOutputStream();workbook.write(outputStream);outputStream.flush();outputStream.close();} catch (IOException e) {// 记录日志e.printStackTrace();} finally {try {workbook.close();} catch (IOException e) {// 记录日志e.printStackTrace();}}}

通过以上内容便可轻轻松松使用Apache POI.是不是超级简单.有任何问题欢迎留言哦!!!

重点!重点!重点!

遇到问题不用怕不如来我的知识库找找看,也许有意想不到的收获!!!

易网时代-易库资源-易库教程:.NET开发、Java开发、PHP开发、SqlServer技术、MySQL技术-开发资料大全-易网时代-易库资源-易库教程 (escdns.com)

 

相关文章:

  • AD盖白油(一面是板颜色,一面是白色丝印)
  • 自动清空 maven 项目临时文件,vue 的 node_modules 文件
  • K8S Service 原理、案例
  • 【AIGC】基础篇:VS Code 配置 Python 命令行参数调试debug超详细教程
  • MySQL日期函数的详细教程(包含常用函数及其示例)
  • JavaWeb:JavaScript
  • 苹果新规生效:即日起不再接受iOS 17 SDK编译的应用提交
  • [密码学实战]商用密码产品密钥体系架构:从服务器密码机到动态口令系统
  • 源码分析之Leaflet中Icon类
  • 【EDA】EDA中聚类(Clustering)和划分(Partitioning)
  • 《算法笔记》4.2小节——算法初步->哈希
  • 观测云数据在Grafana展示的最佳实践
  • Milvus(7):Schema、主字段和自动识别
  • Apache Spark 源码解析
  • Go 语言 TCP 端口扫描器实现与 Goroutine 池原理
  • Modbus主从通信功能码与报文格式
  • 如何在SpringBoot中通过@Value注入Map和List并使用YAML配置?
  • 电子学会—青少年软件编程 python一级等级考试真题—2025年03月
  • 20242817-李臻-课上测试:信号处理
  • uniapp自定义封装tabbar
  • 习近平在中共中央政治局第二十次集体学习时强调,坚持自立自强,突出应用导向,推动人工智能健康有序发展
  • 邮轮、无人机、水上运动……上海多区推动文旅商体展融合发展
  • “80后”王建浩履新三沙市委常委、组织部部长、秘书长
  • 政企研合力,科学监测分析服务消费
  • 张文宏团队公布广谱抗猴痘药物研发进展,将进入临床审批阶段
  • 甘肃省政府原副省长赵金云严重职务违法被开除公职