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
相关产品推荐
相关产品推荐

