You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Spring项目Excel模板读取、文件下载及转PDF问题咨询

Hey Gustavo,我来帮你搞定这三个Spring项目里的Excel相关需求,刚好之前做过类似的功能,给你一步步拆解解决方案:

解决方案:Excel模板填充、浏览器下载与转PDF实现

一、读取src/main/resources下的Excel模板

你之前用FileInputStream直接写绝对路径失败,是因为项目打包后,resources目录下的文件会被打包到Jar包内部,无法通过普通的File对象访问。正确的做法是用类加载器(ClassLoader)来读取资源流:

替换原代码里的JFileChooser部分,改成这样:

// 读取resources下的模板文件
InputStream templateStream = GenerateExcel.class.getClassLoader()
    .getResourceAsStream("file/Template_RH.xls");
if (templateStream == null) {
    throw new RuntimeException("模板文件Template_RH.xls不存在,请检查路径是否正确");
}
Workbook workbook = new HSSFWorkbook(templateStream);
Sheet sheet = workbook.getSheetAt(0);

// 这里保留你原来填充Excel的代码...

注意路径是从resources根目录开始的,你的模板在src/main/resources/file/下,所以路径写file/Template_RH.xls就可以了,不用加绝对路径。

二、实现浏览器端下载生成的文件(Spring环境)

因为是Spring项目,你需要写一个Controller接口,把生成的Excel(或PDF)写入HttpServletResponse的输出流,同时设置响应头让浏览器触发下载:

示例Controller代码:

@RestController
@RequestMapping("/report")
public class ReportController {

    @GetMapping("/download")
    public void downloadReport(HttpServletResponse response) throws IOException {
        // 1. 准备业务数据(替换成你的实际数据逻辑)
        List<ReportTable> table = getReportTableData();
        Employee employee = getCurrentEmployee();
        String headerMonth = "2024-06";
        
        // 2. 调用封装的方法生成填充好的Excel
        Workbook workbook = generateFilledExcel(table, employee, headerMonth);

        // 3. 设置响应头,告诉浏览器这是下载文件
        response.setContentType("application/vnd.ms-excel");
        response.setHeader("Content-Disposition", "attachment; filename=Template_RH_updated.xls");

        // 4. 把Workbook写入响应流
        workbook.write(response.getOutputStream());
        workbook.close();
    }

    // 封装的Excel填充逻辑
    private Workbook generateFilledExcel(List<ReportTable> table, Employee employee, String headerMonth) throws IOException {
        InputStream templateStream = getClass().getClassLoader().getResourceAsStream("file/Template_RH.xls");
        if (templateStream == null) {
            throw new RuntimeException("模板文件不存在,请检查resources路径");
        }
        Workbook workbook = new HSSFWorkbook(templateStream);
        Sheet sheet = workbook.getSheetAt(0);

        // 这里写你原来填充Excel的逻辑:比如写入员工信息、报表数据、月份表头...

        return workbook;
    }

    // 模拟业务数据获取方法(替换成你的实际代码)
    private List<ReportTable> getReportTableData() {
        return new ArrayList<>();
    }

    private Employee getCurrentEmployee() {
        return new Employee();
    }
}

这样用户访问/report/download接口时,浏览器就会自动下载生成好的Excel文件了。

三、Excel转PDF的Java库推荐

下面几个库是Java生态里常用的Excel转PDF方案,各有优缺点:

  • Apache POI + iText 7:

    • 优点:开源免费,完全自定义控制转换过程,适合需要对PDF样式做深度定制的场景
    • 缺点:需要自己处理Excel的样式、布局转换,代码量较大,对复杂Excel(比如合并单元格、图表)支持一般
    • 核心思路:用POI读取Excel的单元格内容和样式,再用iText 7逐行逐列构建PDF文档
  • Aspose.Cells for Java:

    • 优点:API极其简洁,转换效果好,支持几乎所有Excel格式(包括复杂公式、图表、样式),不需要自己处理布局
    • 缺点:商业软件,需要购买授权,非授权版本会有水印
    • 示例代码片段:
      // 读取生成好的Excel文件
      Workbook workbook = new Workbook("生成的Excel文件临时路径");
      // 设置PDF保存选项(可选,比如设置页码、水印等)
      PdfSaveOptions options = new PdfSaveOptions();
      // 保存为PDF
      workbook.save("输出的PDF路径", options);
      
  • Spire.XLS for Java:

    • 优点:类似Aspose,API简单,转换质量不错,有免费版本(但免费版有页数限制)
    • 缺点:免费版功能受限,商业版需要付费
    • 示例代码片段:
      Workbook workbook = new Workbook();
      workbook.loadFromFile("生成的Excel文件临时路径");
      // 直接保存为PDF
      workbook.saveToFile("输出的PDF路径", FileFormat.PDF);
      

如果是内部系统使用,Aspose.Cells是最省心的选择;如果需要开源方案,就用POI+iText组合,但要额外做样式适配的工作。

把这些环节整合起来,你就能完成从读取模板、填充数据、浏览器下载,再到转PDF的完整流程啦!

内容的提问来源于stack exchange,提问作者Gustavo Correa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:31:04