Java基于Spire.XLS實(shí)現(xiàn)從Excel到PDF的發(fā)票自動(dòng)化生成
隨著業(yè)務(wù)數(shù)字化進(jìn)程的不斷推進(jìn),許多企業(yè)開始嘗試用自動(dòng)化手段替代手工開票。尤其是那些已經(jīng)習(xí)慣用 Excel 管理訂單或發(fā)票模板的公司,更希望能將其一鍵轉(zhuǎn)換成標(biāo)準(zhǔn)格式的 PDF,方便發(fā)送、歸檔與打印。本文將基于 Spire.XLS for Java 介紹如何快速實(shí)現(xiàn)“從 Excel 到 PDF”的發(fā)票生成自動(dòng)化流程。
一、為什么選擇 Excel + PDF 的組合
在企業(yè)日常經(jīng)營中,發(fā)票是不可或缺的重要憑證。許多企業(yè)使用 Excel 來管理訂單、記錄商品信息,并據(jù)此生成發(fā)票。將這些發(fā)票以 PDF 格式保存,不僅便于歸檔、打印,還方便通過郵件等方式發(fā)送給客戶。
相比直接從系統(tǒng)輸出 PDF,采用“Excel 設(shè)計(jì)模板 + 自動(dòng)生成 PDF”這一方案具備明顯優(yōu)勢:
- 靈活設(shè)計(jì):可利用 Excel 豐富的排版功能,自由控制表格樣式、字體、邊框等;
- 低學(xué)習(xí)成本:非開發(fā)人員也能通過 Excel 模板快速修改發(fā)票樣式;
- 批量處理更高效:通過程序批量填充數(shù)據(jù)、自動(dòng)生成 PDF,適合大批量開票場景。
Spire.XLS for Java 正好提供了這樣一套解決方案:用 Java 代碼控制 Excel 內(nèi)容生成,并保存為 PDF 格式,整個(gè)過程無需安裝 Microsoft Office,適合部署在服務(wù)器或后臺(tái)系統(tǒng)中。
二、兩種常見場景:沒有模板 vs 已有模板
根據(jù)實(shí)際情況,我們可以將發(fā)票生成分為兩類:沒有模板和已經(jīng)有模板。若是前者,您可以同樣使用 Spire.XLS 來創(chuàng)建 Excel 模板,也可以在微軟辦公套件中進(jìn)行設(shè)計(jì)。如果是后者,您可以直接查看場景 2 查看如何將 Excel 形式的發(fā)票轉(zhuǎn)換為 PDF 格式。
場景 1:沒有模板,從零生成 Excel 并導(dǎo)出 PDF
這種方式適用于初期系統(tǒng)搭建,尚未固定格式,或者格式需要根據(jù)業(yè)務(wù)動(dòng)態(tài)變化的場景。
我們可以使用 Spire.XLS 直接用代碼構(gòu)建表格結(jié)構(gòu),并填充內(nèi)容。下面是一個(gè)簡單示例,展示如何用 Java 創(chuàng)建一個(gè)包含表頭和數(shù)據(jù)的 Excel 發(fā)票表格:
import com.spire.xls.*;
import java.awt.*;
public class CreateInvoiceExcel {
public static void main(String[] args){
// 創(chuàng)建Workbook實(shí)例
Workbook workbook = new Workbook();
// 獲取默認(rèn)的第一張工作表并重命名
Worksheet sheet = workbook.getWorksheets().get(0);
sheet.setName("Invoice");
// 設(shè)置列寬
for (int i = 1; i <= 4; i++) {
sheet.setColumnWidth(i, 18f);
}
// 設(shè)置客戶信息(保持和模板對(duì)應(yīng))
sheet.getCellRange("B2").setText("客戶名稱:張三");
sheet.getCellRange("B3").setText("訂單編號(hào):INV20240530");
sheet.getCellRange("B4").setText("日期:2025-05-30");
// 創(chuàng)建樣式:表頭
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 = {"商品名稱", "單價(jià)", "數(shù)量", "總價(jià)"};
for (int col = 0; col < headers.length; col++) {
CellRange cell = sheet.getCellRange(5, col + 1);
cell.setValue(headers[col]);
cell.setStyle(headerStyle);
}
// 填充數(shù)據(jù)(從第6行開始)
String[][] data = {
{"U盤", "¥35", "2", "¥70"},
{"鍵盤", "¥120", "1", "¥120"},
{"鼠標(biāo)", "¥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("/發(fā)票模板.xlsx", FileFormat.Version2013);
}
}此方式的優(yōu)點(diǎn)是完全不依賴已有 Excel 文件,自由度高。但也意味著格式全部需用代碼實(shí)現(xiàn),適合對(duì)自動(dòng)化要求更高的場景。
場景 2:已有 Excel 模板,填充數(shù)據(jù)后導(dǎo)出 PDF
更常見的情況是,企業(yè)已經(jīng)設(shè)計(jì)好一套標(biāo)準(zhǔn)的 Excel 發(fā)票模板,程序只需讀取模板,填入相應(yīng)數(shù)據(jù)即可。這種方式的好處是設(shè)計(jì)和開發(fā)分離,易于維護(hù)。
實(shí)現(xiàn)步驟也很簡單:
- 設(shè)計(jì)好 Excel 模板,例如在特定單元格留空;
- 程序加載模板文件;
- 根據(jù)業(yè)務(wù)數(shù)據(jù)填入相應(yīng)位置;
- 保存為 PDF。
以下是完整的示例代碼,展示了如何在 Excel 模板中填充數(shù)據(jù)并導(dǎo)出為 PDF 文件。你可以直接復(fù)制粘貼到 Java 編輯器中運(yùn)行,并根據(jù)實(shí)際業(yè)務(wù)場景調(diào)整相應(yīng)內(nèi)容:
import com.spire.xls.*;
public class FillTemplateAndExport {
public static void main(String[] args){
// 加載已有模板
Workbook workbook = new Workbook();
workbook.loadFromFile("E:/Administrator/Python1/output/發(fā)票模板.xlsx");
// 獲取工作表
Worksheet sheet = workbook.getWorksheets().get(0);
// 替換客戶信息(B2 ~ B4)
sheet.getCellRange("B2").setText("客戶名稱:李思");
sheet.getCellRange("B3").setText("訂單編號(hào):INV20250527");
sheet.getCellRange("B4").setText("日期:2025-05-27");
// 填充商品信息,從第6行開始,與模板一致
String[][] data = {
{"鼠標(biāo)墊", "¥15", "3", "¥45"},
{"鼠標(biāo)", "¥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]);
}
}
// 設(shè)置 PDF 導(dǎo)出時(shí)頁面自動(dòng)適配內(nèi)容
workbook.getConverterSetting().setSheetFitToPage(true);
// 導(dǎo)出為 PDF 文件
workbook.saveToFile("E:/Administrator/Python1/發(fā)票1.pdf", FileFormat.PDF);
}
}這種方式更加適合業(yè)務(wù)流程已定型的企業(yè),發(fā)票樣式清晰統(tǒng)一,后續(xù)只需關(guān)注數(shù)據(jù)變化即可。
友情提示:如果你還在評(píng)估產(chǎn)品是否適合自己,不妨先試試免費(fèi)版。導(dǎo)出的文件沒有水印,只是在頁數(shù)上有些限制。
三、總結(jié)與建議
Excel 與 PDF 的組合,為企業(yè)帶來了靈活、高效、易維護(hù)的發(fā)票自動(dòng)化生成方案。通過 Spire.XLS for Java,您可以:
- 純代碼生成發(fā)票內(nèi)容并導(dǎo)出 PDF;
- 利用已有 Excel 模板實(shí)現(xiàn)自動(dòng)填充;
- 無需安裝 Excel 軟件即可運(yùn)行;
- 滿足服務(wù)端或批處理的使用場景。
未來,您還可以進(jìn)一步結(jié)合數(shù)據(jù)庫,實(shí)現(xiàn)批量生成發(fā)票、導(dǎo)出 PDF 并打包下載等功能,全面提升業(yè)務(wù)自動(dòng)化水平。如果您正在尋找一套可靠的 Java Excel 組件,Spire.XLS 是值得一試的選擇。
到此這篇關(guān)于Java基于Spire.XLS實(shí)現(xiàn)從Excel到PDF的發(fā)票自動(dòng)化生成的文章就介紹到這了,更多相關(guān)Java自動(dòng)生成發(fā)票內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java并發(fā)編程專題(九)----(JUC)淺析CyclicBarrier
這篇文章主要介紹了java CyclicBarrier的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07
mybatis-plus踩坑之下劃線駝峰轉(zhuǎn)換方式
MyBatis-Plus默認(rèn)駝峰轉(zhuǎn)下劃線導(dǎo)致實(shí)體字段匹配失敗,關(guān)閉該功能后需手動(dòng)配置映射,建議避免字段使用下劃線,若必須則可通過注解、重寫toString或調(diào)整字段名解決2025-08-08
Java 使用IO流實(shí)現(xiàn)大文件的分割與合并實(shí)例詳解
這篇文章主要介紹了Java 使用IO流實(shí)現(xiàn)大文件的分割與合并實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2016-12-12
springboot整合mybatis實(shí)現(xiàn)多表查詢的實(shí)戰(zhàn)記錄
SpringBoot對(duì)數(shù)據(jù)庫操作有多種方式,下面這篇文章主要給大家介紹了關(guān)于springboot整合mybatis實(shí)現(xiàn)多表查詢的相關(guān)資料,文中通過示例代碼以及圖文介紹的非常詳細(xì),需要的朋友可以參考下2021-08-08
MyBatis實(shí)現(xiàn)數(shù)據(jù)庫類型和Java類型轉(zhuǎn)換的處理方法
MyBatis作為一個(gè)優(yōu)秀的持久層框架,其核心功能之一就是處理Java類型和數(shù)據(jù)庫類型之間的轉(zhuǎn)換,這種轉(zhuǎn)換過程在MyBatis中被稱為"類型處理器(TypeHandler)"機(jī)制,本文給大家詳細(xì)介紹了MyBatis如何實(shí)現(xiàn)數(shù)據(jù)庫類型和Java類型的轉(zhuǎn)換,需要的朋友可以參考下2025-05-05

