Java基于Spire.XLS实现从Excel到PDF的发票自动化生成

 更新时间:2025年06月04日 08:37:02   作者:E-iceblue  
随着业务数字化进程的不断推进,许多企业开始尝试用自动化手段替代手工开票,本文将基于 Spire.XLS for Java 介绍如何快速实现从 Excel 到 PDF的发票生成自动化方法,感兴趣的小伙伴可以了解下

随着业务数字化进程的不断推进,许多企业开始尝试用自动化手段替代手工开票。尤其是那些已经习惯用 Excel 管理订单或发票模板的公司,更希望能将其一键转换成标准格式的 PDF,方便发送、归档与打印。本文将基于 Spire.XLS for Java 介绍如何快速实现“从 Excel 到 PDF”的发票生成自动化流程。

一、为什么选择 Excel + PDF 的组合

在企业日常经营中,发票是不可或缺的重要凭证。许多企业使用 Excel 来管理订单、记录商品信息,并据此生成发票。将这些发票以 PDF 格式保存,不仅便于归档、打印,还方便通过邮件等方式发送给客户。

相比直接从系统输出 PDF,采用“Excel 设计模板 + 自动生成 PDF”这一方案具备明显优势:

  • 灵活设计:可利用 Excel 丰富的排版功能,自由控制表格样式、字体、边框等;
  • 低学习成本:非开发人员也能通过 Excel 模板快速修改发票样式;
  • 批量处理更高效:通过程序批量填充数据、自动生成 PDF,适合大批量开票场景。

Spire.XLS for Java 正好提供了这样一套解决方案:用 Java 代码控制 Excel 内容生成,并保存为 PDF 格式,整个过程无需安装 Microsoft Office,适合部署在服务器或后台系统中。

二、两种常见场景:没有模板 vs 已有模板

根据实际情况,我们可以将发票生成分为两类:没有模板和已经有模板。若是前者,您可以同样使用 Spire.XLS 来创建 Excel 模板,也可以在微软办公套件中进行设计。如果是后者,您可以直接查看场景 2 查看如何将 Excel 形式的发票转换为 PDF 格式。

场景 1:没有模板,从零生成 Excel 并导出 PDF

这种方式适用于初期系统搭建,尚未固定格式,或者格式需要根据业务动态变化的场景。

我们可以使用 Spire.XLS 直接用代码构建表格结构,并填充内容。下面是一个简单示例,展示如何用 Java 创建一个包含表头和数据的 Excel 发票表格:

import com.spire.xls.*;
import java.awt.*;

public class CreateInvoiceExcel {
   public static void main(String[] args){

       // 创建Workbook实例
       Workbook workbook = new Workbook();

       // 获取默认的第一张工作表并重命名
       Worksheet sheet = workbook.getWorksheets().get(0);
       sheet.setName("Invoice");

       // 设置列宽
       for (int i = 1; i <= 4; i++) {
           sheet.setColumnWidth(i, 18f);
       }

       // 设置客户信息(保持和模板对应)
       sheet.getCellRange("B2").setText("客户名称:张三");
       sheet.getCellRange("B3").setText("订单编号:INV20240530");
       sheet.getCellRange("B4").setText("日期:2025-05-30");

       // 创建样式:表头
       CellStyle headerStyle = workbook.getStyles().addStyle("Header");
       headerStyle.getFont().isBold(true);
       headerStyle.getFont().setSize(12f);
       headerStyle.setHorizontalAlignment(HorizontalAlignType.Center);
       headerStyle.setVerticalAlignment(VerticalAlignType.Center);

       // 填充表头(从第5行开始,避免覆盖客户信息)
       String[] headers = {"商品名称", "单价", "数量", "总价"};
       for (int col = 0; col < headers.length; col++) {
           CellRange cell = sheet.getCellRange(5, col + 1);
           cell.setValue(headers[col]);
           cell.setStyle(headerStyle);
       }

       // 填充数据(从第6行开始)
       String[][] data = {
               {"U盘", "¥35", "2", "¥70"},
               {"键盘", "¥120", "1", "¥120"},
               {"鼠标", "¥45", "3", "¥135"},
       };

       for (int row = 0; row < data.length; row++) {
           for (int col = 0; col < data[row].length; col++) {
               sheet.getCellRange(row + 6, col + 1).setValue(data[row][col]);
           }
       }

       // 保存为 Excel 文件
       workbook.saveToFile("/发票模板.xlsx", FileFormat.Version2013);
   }
}

此方式的优点是完全不依赖已有 Excel 文件,自由度高。但也意味着格式全部需用代码实现,适合对自动化要求更高的场景。

场景 2:已有 Excel 模板,填充数据后导出 PDF

更常见的情况是,企业已经设计好一套标准的 Excel 发票模板,程序只需读取模板,填入相应数据即可。这种方式的好处是设计和开发分离,易于维护。

实现步骤也很简单:

  • 设计好 Excel 模板,例如在特定单元格留空;
  • 程序加载模板文件;
  • 根据业务数据填入相应位置;
  • 保存为 PDF。

以下是完整的示例代码,展示了如何在 Excel 模板中填充数据并导出为 PDF 文件。你可以直接复制粘贴到 Java 编辑器中运行,并根据实际业务场景调整相应内容:

import com.spire.xls.*;

public class FillTemplateAndExport {
    public static void main(String[] args){
        // 加载已有模板
        Workbook workbook = new Workbook();
        workbook.loadFromFile("E:/Administrator/Python1/output/发票模板.xlsx");

        // 获取工作表
        Worksheet sheet = workbook.getWorksheets().get(0);

        // 替换客户信息(B2 ~ B4)
        sheet.getCellRange("B2").setText("客户名称:李思");
        sheet.getCellRange("B3").setText("订单编号:INV20250527");
        sheet.getCellRange("B4").setText("日期:2025-05-27");

        // 填充商品信息,从第6行开始,与模板一致
        String[][] data = {
                {"鼠标垫", "¥15", "3", "¥45"},
                {"鼠标", "¥45", "1", "¥45"},
                {"键盘", "¥120", "4", "¥480"}
        };

        for (int i = 0; i < data.length; i++) {
            for (int j = 0; j < data[i].length; j++) {
                sheet.getCellRange(i + 6, j + 1).setText(data[i][j]);
            }
        }

        // 设置 PDF 导出时页面自动适配内容
        workbook.getConverterSetting().setSheetFitToPage(true);

        // 导出为 PDF 文件
        workbook.saveToFile("E:/Administrator/Python1/发票1.pdf", FileFormat.PDF);
    }
}

这种方式更加适合业务流程已定型的企业,发票样式清晰统一,后续只需关注数据变化即可。

友情提示:如果你还在评估产品是否适合自己,不妨先试试免费版。导出的文件没有水印,只是在页数上有些限制。

三、总结与建议

Excel 与 PDF 的组合,为企业带来了灵活、高效、易维护的发票自动化生成方案。通过 Spire.XLS for Java,您可以:

  • 纯代码生成发票内容并导出 PDF;
  • 利用已有 Excel 模板实现自动填充;
  • 无需安装 Excel 软件即可运行;
  • 满足服务端或批处理的使用场景。

未来,您还可以进一步结合数据库,实现批量生成发票、导出 PDF 并打包下载等功能,全面提升业务自动化水平。如果您正在寻找一套可靠的 Java Excel 组件,Spire.XLS 是值得一试的选择。

到此这篇关于Java基于Spire.XLS实现从Excel到PDF的发票自动化生成的文章就介绍到这了,更多相关Java自动生成发票内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java 求解二维数组列最小值

    java 求解二维数组列最小值

    这篇文章主要介绍了java 求解二维数组列最小值的相关资料,需要的朋友可以参考下
    2017-05-05
  • Docker容器中的SSH免密登录详解

    Docker容器中的SSH免密登录详解

    这篇文章主要介绍了Docker容器中的SSH免密登录详解,在日常的开发和测试环境中经常需要创建和管理Docker容器,有时,出于调试或管理的目的,可能需要SSH到容器内部,本文将介绍如何创建一个Docker容器,它在启动时自动运行SSH服务,并支持免密登录,需要的朋友可以参考下
    2023-08-08
  • java双向循环链表的实现代码

    java双向循环链表的实现代码

    这篇文章介绍了java双向循环链表的实现代码,有需要的朋友可以参考一下
    2013-09-09
  • Spring中存储Bean的常见注解方式

    Spring中存储Bean的常见注解方式

    Spring框架中的控制反转(IoC)和依赖注入(DI)是核心概念,实现了对象的解耦和动态依赖,IoC容器负责对象的生命周期和对象间的依赖关系,通过DI方式注入依赖,本文介绍Spring中存储Bean的常见注解方式,感兴趣的朋友一起看看吧
    2024-09-09
  • LCN分布式事务解决方案详解

    LCN分布式事务解决方案详解

    这篇文章主要介绍了LCN分布式事务解决方案详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • mybatis 运行时加载自定义mapper文件方式

    mybatis 运行时加载自定义mapper文件方式

    这篇文章主要介绍了mybatis 运行时加载自定义mapper文件方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Java编程—在测试中考虑多态

    Java编程—在测试中考虑多态

    这篇文章主要介绍了Java编程—在测试中考虑多态,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Mybatis 如何在配置文件中给实体类起别名

    Mybatis 如何在配置文件中给实体类起别名

    这篇文章主要介绍了Mybatis 如何在配置文件中给实体类起别名的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Springboot中使用Filter实现Header认证详解

    Springboot中使用Filter实现Header认证详解

    这篇文章主要介绍了Springboot中使用Filter实现Header认证详解,当在 web.xml 注册了一个 Filter 来对某个 Servlet 程序进行拦截处理时,它可以决定是否将请求继续传递给 Servlet 程序,以及对请求和响应消息是否进行修改,需要的朋友可以参考下
    2023-08-08
  • MultipartResolver实现文件上传功能

    MultipartResolver实现文件上传功能

    这篇文章主要为大家详细介绍了MultipartResolver实现文件上传功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06

最新评论