当前位置:首页 > 后端开发 > 正文

java怎么导出excel

va可通过Apache POI库操作Workbook对象创建Excel文件,设置单元格数据后写入输出流

是关于Java如何导出Excel的详细指南,涵盖主流库的使用、代码示例及最佳实践:

java怎么导出excel  第1张

Apache POI(功能全面)

  1. 适用场景:需要精细控制单元格样式、公式或复杂格式时首选,支持新旧版Excel(.xls和.xlsx)。
  2. 依赖配置:Maven项目中需添加以下三个核心组件:
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>3.9</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.9</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml-schemas</artifactId>
        <version>3.9</version>
    </dependency>
  3. 基本实现步骤
    | 步骤 | 作用 | 关键类/方法 |
    |——|——-|————–|
    | 创建Workbook实例 | 根据文件类型选择HSSF(旧版)或XSSF(新版) | new XSSFWorkbook() |
    | 添加Sheet页 | 指定名称和索引位置 | workbook.createSheet("数据表") |
    | 构建表头行 | 遍历列名创建首行单元格 | Row headerRow = sheet.createRow(0); headerRow.createCell(i).setCellValue("列名") |
    | 填充数据区 | 逐行写入业务数据 | for循环中调用row.getCell(colNum).setCellValue(value) |
    | 设置样式属性 | 包括字体加粗、背景色等美化操作 | CellStyle style = workbook.createCellStyle(); style.setAlignment(HorizontalAlignment.CENTER); |
    | 输出到流 | 通过字节流保存物理文件 | FileOutputStream → workbook.write() |
  4. 优势特点:支持图表嵌入、条件格式、数据验证等高级特性;适合生成带有复杂格式要求的报表,但学习曲线较陡,代码量相对较大。

JExcelApi(简单轻量)

  1. 定位差异:专注于基础读写操作,仅兼容Excel 97-2003格式(.xls),适合不需要现代特性的传统系统迁移场景。
  2. 典型用法示例
    WritableWorkbook wb = Workbook.createWorkbook(new File("output.xls"));
    WritableSheet sheet = wb.createSheet("第一页", 0);
    Label titleCell = new Label(0, 0, "用户名"); // 坐标从0开始计数
    sheet.addCell(titleCell);
    Number numCell = new Number(1, 0, 28); // (列索引, 行索引, 数值)
    sheet.addCell(numCell);
    wb.write(); // 自动关闭并刷盘
  3. 性能考量:由于不支持SXSSF模式,大数据量场景下容易出现内存瓶颈,建议配合分批写入策略使用。

EasyExcel(阿里开源方案)

  1. 设计哲学:通过注解映射实现极简API,天然支持大数据分块处理,特别适合Web应用中的动态导出需求。
  2. 快速上手模板
    // 定义模型类
    public class UserDTO {
        @ExcelProperty("登录名称") private String loginName;
        @ExcelProperty("注册时间") private Date registerDate;
        // getters/setters省略...
    }
    // 执行导出
    List<UserDTO> dataList = queryDatabase();
    EasyExcel.write("用户清单.xlsx")
             .head(UserDTO.class)
             .sheet("会员信息")
             .doWrite(dataList);
  3. 性能优化技巧:当单次导出超过5万条记录时,可采用分页机制:
    int batchSize = 1000;
    for (int start=0; start<total; start+=batchSize){
        int end = Math.min(start+batchSize, total);
        EasyExcel.write(filePath)
                .head(HeadClass.class)
                .sheet("Sheet1")
                .doWrite(subList(start, end));
    }
  4. 扩展能力:通过实现WriteHandler接口可自定义渲染逻辑,如自动换行、特殊标记高亮等。

方案对比矩阵

特性 Apache POI JExcelApi EasyExcel
功能完整性
API简洁度
大数据支持 SXSSF模式可用 不支持 内置分页机制
样式控制精度 像素级控制 基础样式 中等灵活性
社区活跃度 国际广泛使用 维护停滞 国内生态完善
推荐应用场景 企业级复杂报表 遗留系统维护 互联网项目快速迭代

FAQs

Q1:遇到乱码问题怎么解决?
A:确保所有文本类型的单元格都明确设置为UTF-8编码格式,对于POI用户,可在创建Workbook后执行workbook.setCharset(StandardCharsets.UTF_8);EasyExcel则默认使用UTF-8,若出现异常需检查源码文件的实际编码是否匹配。

Q2:如何防止数字被科学计数法显示?
A:在POI中创建单元格时指定单元格类型为STRING类型;使用EasyExcel时,可在@ExcelProperty注解中添加参数format = "#{}"强制按原样显示长数字串,`@ExcelProperty(value = “身份证号”, format = “#{}

0