概述
Spire是一套可以輕鬆處理Word、Excel和PDF的商業元件,需要收費,但是他有一套對應的免費元件FreeSpire可以使用,免費元件在功能上有一些限制(比如:excel的sheet數量不能超過30),對於普通應用來說大部分場景下都可以適用了。
中文幫助文件:幫助文件 | 全面豐富的線上文件,助您快速瞭解如何使用產品
本文程式碼基於Stylet開發,如果您還不瞭解Stylet,請參閱:
WPF優秀元件推薦之Stylet(一) - seabluescn - 部落格園 (cnblogs.com)
WPF優秀元件推薦之Stylet(二) - seabluescn - 部落格園 (cnblogs.com)
環境安裝
在Nuget中搜尋:FreeSpire
如果你只需要處理Excel或Word等,可以下載對應的包,怕麻煩可以下一個FreeSpire.Office的總包。(建議下載FreeSpire.Office,雖然檔案多一些,但後期功能升級不需要再加元件,也不會有不同元件版本之間不相容的問題)
生成Word文件
public void SaveWord() { SaveFileDialog fileDialog = new SaveFileDialog() { Filter = "Word File(*.docx)|*.docx", FileName = "Report01" + ".docx", }; if (fileDialog.ShowDialog() == true) { Document document = new Document(); Section s = document.AddSection(); Paragraph para1 = s.AddParagraph(); para1.AppendText("歡迎使用Spire.Doc"); document.SaveToFile(fileDialog.FileName, Spire.Doc.FileFormat.Docx); Process.Start(fileDialog.FileName); } }
生成Excel文件
public void SaveExcel() { SaveFileDialog fileDialog = new SaveFileDialog() { Filter = "Word File(*.xlsx)|*.xlsx", FileName = "Report01" + ".xlsx", }; if (fileDialog.ShowDialog() == true) { Workbook workbook = new Workbook(); Worksheet sheet = workbook.Worksheets[0]; sheet.Range[1, 1].Text = "步驟"; sheet.Range[1, 2].Text = "時間"; int row = 2; for (int i = 0; i <10; i++) { sheet.Range[row, 1].Text = i.ToString(); sheet.Range[row, 2].Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); row++; } sheet.Range[row + 2, 1].Text = "報告時間:"; sheet.Range[row + 2, 2].Text = $"2022-02-02 11:11:11"; workbook.SaveToFile(fileDialog.FileName, ExcelVersion.Version2010); Process.Start(fileDialog.FileName); } }
讀取Word模板
生成Word文件時,格式其實很難控制,有一個簡單的辦法就是先建立一個模板格式檔案,動態的內容先用特殊的佔位字串,然後程式再把相應的佔位字串給替換掉,這樣檔案的樣式就可以非常容易調整和修改,客戶有什麼特殊需求還能直接修改模板,都不用改程式碼。
Code:
public void LoadWord() { SaveFileDialog fileDialog = new SaveFileDialog() { Filter = "Word File(*.docx)|*.docx", FileName = "Report02" + ".docx", }; if (fileDialog.ShowDialog() == true) { Document document = new Document(); document.LoadFromFile(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Template", "WordTemplate.docx")); document.Replace("<$ReportTitle>", "報表標題", false, true); document.Replace("<$CompanyName>", "公司名稱", false, true); document.SaveToFile(fileDialog.FileName, Spire.Doc.FileFormat.Docx); Process.Start(fileDialog.FileName); } }
生成Pdf文件
public void SavePdf() { SaveFileDialog fileDialog = new SaveFileDialog() { Filter = "Word File(*.pdf)|*.pdf", FileName = "Report01" + ".pdf", }; if (fileDialog.ShowDialog() == true) { //初始化一個PdfDocument例項 PdfDocument document = new PdfDocument(); //設定邊距 PdfUnitConvertor unitCvtr = new PdfUnitConvertor(); PdfMargins margins = new PdfMargins(); margins.Top = unitCvtr.ConvertUnits(2.54f, PdfGraphicsUnit.Centimeter, PdfGraphicsUnit.Point); margins.Bottom = margins.Top; margins.Left = unitCvtr.ConvertUnits(3.17f, PdfGraphicsUnit.Centimeter, PdfGraphicsUnit.Point); margins.Right = margins.Left; //新增新頁 PdfPageBase page = document.Pages.Add(PdfPageSize.A4, margins); //自定義PdfTrueTypeFont、PdfPen例項 PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("宋體", 11f), true); PdfPen pen = new PdfPen(Color.Black); //使用DrawString方法在指定位置寫入文字 string text = "我的第一個C# PDF文件"; page.Canvas.DrawString(text, font, pen, 100, 50); //儲存文件 document.SaveToFile(fileDialog.FileName); Process.Start(fileDialog.FileName); } }
Word轉換為PDF
Pdf的生成是比較麻煩的,更像是繪圖操作,如果客戶一定要Pdf格式報表,我一般先生成一個Word的臨時檔案,然後再轉成pdf,當然Word的生成仍可以採用模板的方法。
public void WordToPdf() { var WordFilePath = @"E:\Report02.docx"; var PdfFilePath = @"E:\Report02.pdf"; Document document = new Document(); document.LoadFromFile(WordFilePath); document.SaveToFile(PdfFilePath, Spire.Doc.FileFormat.PDF); Process.Start(PdfFilePath); }
以上程式碼下載地址:NiceComponents · Bruce/Learn WPF - 碼雲 - 開源中國 (gitee.com)
本文只是演示了一些基本應用,表格、圖片等都沒有涉及,主要是官方文件已經非常詳細了,更多高階功能請參考幫助文件。