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)