前言:
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、X SSF
XSSF 用于处理 Excel 2007 及以后版本基于 XML 的 .xlsx 文件,突破了 .xls 文件行列限制,最多支持 1048576 行和 16384 列。处理时会将整个文档加载到内存,处理大量数据时内存占用问题严重,可能出现内存不足错误,性能受影响;处理中等数据量时性能不错。支持 .xlsx 文件丰富特性,功能强大且兼容性好。
1.1.3、SX SSF
SXSSF 用于处理 Excel 2007 及以后的 .xlsx 文件,是 XSSF 的流式扩展。它采用流式处理,仅在内存保留指定数量的行,超出部分写入临时文件,大幅减少内存占用,适合处理超大数据量,处理大数据时性能优势明显,能避免内存溢出。不过处理小数据量时,因频繁读写临时文件,性能可能不如 HSSF 和 XSSF。它继承了 XSSF 大部分功能,但流式处理会使部分功能受限,如写入磁盘的行无法修改。
1.2、 XSSF 格式导入导出
1.2.1、引入依赖
java
<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、数据导入
java
/**
* 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、数据导出
java
/**
* 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());
// 登陆ip
Cell 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)