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ì):
- 靈活設(shè)計(jì):可利用 Excel 豐富的排版功能,自由控制表格樣式、字體、邊框等;
- 低學(xué)習(xí)成本:非開發(fā)人員也能通過 Excel 模板快速修改發(fā)票樣式;
- 批量處理更高效:通過程序批量填充數(shù)據(jù)、自動(dòng)生成 PDF,適合大批量開票場(chǎng)景。
Spire.XLS for Java 正好提供了這樣一套解決方案:用 Java 代碼控制 Excel 內(nèi)容生成,并保存為 PDF 格式,整個(gè)過程無需安裝 Microsoft Office,適合部署在服務(wù)器或后臺(tái)系統(tǒng)中。
二、兩種常見場(chǎng)景:沒有模板 vs 已有模板
根據(jù)實(shí)際情況,我們可以將發(fā)票生成分為兩類:沒有模板和已經(jīng)有模板。若是前者,您可以同樣使用 Spire.XLS 來創(chuàng)建 Excel 模板,也可以在微軟辦公套件中進(jìn)行設(shè)計(jì)。如果是后者,您可以直接查看場(chǎng)景 2 查看如何將 Excel 形式的發(fā)票轉(zhuǎn)換為 PDF 格式。
場(chǎng)景 1:沒有模板,從零生成 Excel 并導(dǎo)出 PDF
這種方式適用于初期系統(tǒng)搭建,尚未固定格式,或者格式需要根據(jù)業(yè)務(wù)動(dòng)態(tài)變化的場(chǎng)景。
我們可以使用 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)化要求更高的場(chǎng)景。
場(chǎ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ù)場(chǎng)景調(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ù)端或批處理的使用場(chǎng)景。
未來,您還可以進(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雙向循環(huán)鏈表的實(shí)現(xiàn)代碼
這篇文章介紹了java雙向循環(huán)鏈表的實(shí)現(xiàn)代碼,有需要的朋友可以參考一下2013-09-09mybatis 運(yùn)行時(shí)加載自定義mapper文件方式
這篇文章主要介紹了mybatis 運(yùn)行時(shí)加載自定義mapper文件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07Springboot中使用Filter實(shí)現(xiàn)Header認(rèn)證詳解
這篇文章主要介紹了Springboot中使用Filter實(shí)現(xiàn)Header認(rèn)證詳解,當(dāng)在?web.xml?注冊(cè)了一個(gè)?Filter?來對(duì)某個(gè)?Servlet?程序進(jìn)行攔截處理時(shí),它可以決定是否將請(qǐng)求繼續(xù)傳遞給?Servlet?程序,以及對(duì)請(qǐng)求和響應(yīng)消息是否進(jìn)行修改,需要的朋友可以參考下2023-08-08MultipartResolver實(shí)現(xiàn)文件上傳功能
這篇文章主要為大家詳細(xì)介紹了MultipartResolver實(shí)現(xiàn)文件上傳功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06