一、組件介紹
Spire.XLS是E-iceblue開發的一套基於企業級的專業Office文檔處理的組件之一,全稱Spire.Office for .NET。旗下有Spire.Doc,Spire XLS,Spire.PDF,Spire.BarCode等多款專業組件,為各種Office文檔在程序處理上提供了很大的方便,官方為各種功能提供了大量的在線api,簡化了使用組件的難度。組件使用時不需要本地Office組件的支持。Spire.Office是一款企業級組件,它提供了收費版本和免費版本兩種級別,一般來說,對於個人的應用,免費版本已足夠用。比如對於上文博主遇到的問題,Spire.XLS組件就提供了很好的實現機制,如果你也遇到了NPOI解決不了的問題,不妨試試這個。
“XLS”是Excel文件的后綴之一,顧名思義,Spire.XLS當然就是針對Excel表格處理的組件嘍,本篇,博主將結合上文遇到的問題來看看Spire.XLS組件的強大功能。
二、組件安裝使用
對於組件的安裝,在此還是提供兩種方式:
1、官方下載安裝
下載地址。官方下載的安裝包是msi結尾的,安裝時需要選擇支持的VS版本等信息,軟件的安裝就不做過多說明,有興趣的可以下載試試。
2、Nuget安裝
大家最喜歡的應該還是Nuget方式吧,簡單,方便,並且易於管理。博主也是不太喜歡為了一個組件而去單獨下載一個安裝包。
Spire.XLS也提供了Nuget的方式,只需要搜索Spire,選擇免費版的組件即可:
安裝完成后自動引用了需要的dll
3、程序撰寫
3.1、創建、加載 Excel文件
using Spire.Xls; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data; using Spire.Pdf; using Spire.Xls.Converter; namespace CommonCS { public class SpireInfos : IDisposable { private LoadConfig config = new LoadConfig(); public string ExcelFilePth { get; set; }//Excel保存路徑 public string PdfFilePth { get; set; }//Pdf保存路徑 public string wordFilePth { get; set; }//Word Doc保存路徑 public string swfFilePth { get; set; }//swf Flash文件保存路徑 public SpireInfos() { ExcelFilePth = config.configManager.getConfig("path.xls"); PdfFilePth = config.configManager.getConfig("path.pdf"); wordFilePth = config.configManager.getConfig("path.doc"); swfFilePth = config.configManager.getConfig("path.swf"); } #region 保存Excel文件 /// <summary> /// 保存Excel文件 /// </summary> /// <param name="workbook">workBook</param> /// <param name="FileName">文件名稱</param> public void SavaXls(Workbook workbook,string FileName="") { if (!string.IsNullOrEmpty(FileName)) { workbook.SaveToFile(ExcelFilePth + FileName + ".xlsx", ExcelVersion.Version2010); } else { workbook.SaveToFile(ExcelFilePth + DateTime.Now.ToString("yyyyMMddhhmmssfff") + ".xlsx", ExcelVersion.Version2010); } } #endregion #region 加載Excel文件 常用於加載模板 /// <summary> /// 加載已存在的Excel文件 不能加載受密碼保護的文件 /// </summary> /// <param name="fileName">文件名稱</param> /// <param name="version"></param> public void LoadFromFile(Workbook workbook,string fileName, ExcelVersion version = ExcelVersion.Version2010,string Pth="") { if (string.IsNullOrEmpty(Pth)) { workbook.LoadFromFile(config.configManager.getConfig("path.xls") + fileName + ".xlsx", version); } else { workbook.LoadFromFile(Pth + fileName + ".xlsx", version); } } /// <summary> /// /// </summary> /// <param name="fileName">加載有密碼保護的Excel文檔</param> /// <param name="separator">密碼</param> public void LoadFromFile(Workbook workbook, string fileName, string separator, string Pth = "") { if (string.IsNullOrEmpty(Pth)) { workbook.LoadFromFile(config.configManager.getConfig("path.xls") + fileName + ".xlsx", separator); } else { workbook.LoadFromFile(Pth + fileName + ".xlsx", separator); } } #endregion #region Spire.Xls 導入與導出 /// <summary> /// 讀取Excel數據 並導入到數據庫 /// </summary> /// <param name="workbook"></param> /// <param name="fileName"></param> /// <param name="sheetIndex"></param> /// <param name="version"></param> /// <param name="Pth"></param> /// <returns></returns> public DataTable ReportToDataTable(Workbook workbook, string fileName,int sheetIndex=0, ExcelVersion version = ExcelVersion.Version2010, string Pth = "") { LoadFromFile(workbook, fileName, version, Pth); Worksheet sheet = workbook.Worksheets[sheetIndex]; DataTable dt = sheet.ExportDataTable(); return dt; } /// <summary> /// 讀取數據庫 並導入到Excel /// </summary> /// <param name="workbook"></param> /// <param name="dt">從數據庫中獲取</param> /// <param name="sheetIndex">索引值</param> public void ReportToExcel(Workbook workbook, DataTable dt, int sheetIndex = 0) { Worksheet sheet = workbook.Worksheets[sheetIndex]; int rowscount = sheet.InsertDataTable(dt, true, 1, 1); SavaXls(workbook); } #endregion #region 將 Excel 轉化為PDF /// <summary> /// 將 Excel 轉化為PDF 免費應用 會生成廣告 /// </summary> /// <param name="workbook"></param> /// <param name="ExcelfileName">加載的Excel文件名 不帶擴展名</param> /// <param name="PdffileName">要保存的Pdf文件名 不帶擴展名</param> /// <param name="version"></param> /// <param name="Pth">加載的Excel文件路徑</param> public void ExcelToPdf(Workbook workbook, string ExcelfileName, string PdffileName, ExcelVersion version = ExcelVersion.Version2010, string Pth = "") { LoadFromFile(workbook, ExcelfileName, version, Pth); PdfDocument pdfDocument = new PdfDocument(); pdfDocument.PageSettings.Orientation = PdfPageOrientation.Landscape; pdfDocument.PageSettings.Width = 970; pdfDocument.PageSettings.Height = 850; PdfConverter pdfConverter = new PdfConverter(workbook); PdfConverterSettings settings = new PdfConverterSettings(); settings.TemplateDocument = pdfDocument; pdfDocument = pdfConverter.Convert(settings); pdfDocument.SaveToFile(PdfFilePth + PdffileName + ".pdf", Spire.Pdf.FileFormat.PDF); } #endregion #region xls 與 xlsx 之間的相互轉化 向下兼容 //Excel 97-2003與Excel 2007在C#中的轉換 public void XlsConvertXlsx(Workbook workbook, string OldFileName, string NewFileName="", ExcelVersion version = ExcelVersion.Version97to2003, string Pth = "") { if (string.IsNullOrEmpty(Pth)) { workbook.LoadFromFile(config.configManager.getConfig("path.xls") + OldFileName + ".xls", version); } else { workbook.LoadFromFile(Pth + OldFileName + ".xls", version); } SavaXls(workbook, NewFileName); } public void XlsxConvertXls(Workbook workbook, string OldFileName, string NewFileName="", ExcelVersion version = ExcelVersion.Version2010, string Pth = "") { LoadFromFile(workbook, OldFileName); if (!string.IsNullOrEmpty(NewFileName)) { workbook.SaveToFile(ExcelFilePth + NewFileName + ".xlsx", ExcelVersion.Version2010); } else { workbook.SaveToFile(ExcelFilePth + DateTime.Now.ToString("yyyyMMddhhmmssfff") + ".xlsx", ExcelVersion.Version2010); } } #endregion #region Excel sheet操作 public void RemoveAllSheet() { } #endregion #region 釋放資源 /// <summary> /// 釋放資源 /// </summary> public void Dispose(Workbook workbook) { workbook.Dispose(); } public void Dispose() { throw new NotImplementedException(); } #endregion } }
大家不要被LoadConfig迷惑,我只是把文件保存的路徑放在Config文件里了,上述程序中 config.configManager.getConfig("path.xls");只是返回一個路徑,例如:C://Test/
以上便是創建、加載Excel文件的代碼,現在我們作一個簡單的調用,代碼如下:
public class IndexModel { Workbook workbook = new Workbook(); SpireInfos SpireInfosModel = new SpireInfos(); public void HelloExcel() { SpireInfosModel.SavaXls(workbook,"第一次簡單測試"); } }
這樣就會生成一個簡單的Excel文件:
現在我們右鍵這個Excel文件,並選擇屬性~詳細信息選項卡,如下:
我們看到,‘第一次簡單測試.xlsx’文件屬性~詳細信息中的標題,主題,作者等信息沒有值,我們如果通過程序修改這些屬性的值呢?
修改Excel屬性的代碼如下:
public class IndexModel { Workbook workbook = new Workbook(); SpireInfos SpireInfosModel = new SpireInfos(); public void HelloExcel() { workbook.DocumentProperties.Author = "Jack.Chen"; //作者 workbook.DocumentProperties.Subject = "Excel文檔屬性主題"; //主題 workbook.DocumentProperties.Title = "Excel文檔屬性標題"; //標題 workbook.DocumentProperties.Company = "Excel文檔所屬單位"; //單位 workbook.DocumentProperties.Comments = "Excel文檔備注"; //備注 workbook.DocumentProperties.Keywords = "Excel文檔標記"; //標記 workbook.DocumentProperties.CreatedTime = DateTime.Now; //創建時間 workbook.DocumentProperties.Category = "Excel文檔分類";//類別 workbook.DocumentProperties.Manager = "EXcel管理員";//管理員 workbook.DocumentProperties.LastSaveTime = DateTime.Now;//最后一次保存時間 workbook.DocumentProperties.RevisionNumber = "V1.0";//版本修訂號 workbook.DocumentProperties.ApplicationName = "ApplicationName";//程序名稱 SpireInfosModel.SavaXls(workbook,"我是修改屬性后的Excel文件"); } }
執行程序,會得到如下的Excel文件:
對於保密性較高的文件,我們有必要對Excel文件進行加密,那么,我們如何實現Excel文件的加密呢?
加密Excel文件,代碼如下:
public class IndexModel { Workbook workbook = new Workbook(); SpireInfos SpireInfosModel = new SpireInfos(); public void HelloExcel() { //Excel 加密 如果文檔加密 屬性設置是無效的... workbook.Protect("123456");//設置Excel文檔的打開密碼 SpireInfosModel.SavaXls(workbook,"我是加密的Excel文件"); } }
效果圖如下:
代碼備注中有這么一句話:加密后,屬性設置無效,大家可以吧屬性設置和加密放在一起試試,在此不作實驗了!
如果僅僅加密文件不能滿足安全性的要求?那么我們還可以加密文檔中的Sheet!如果實現加密Sheet呢?
代碼如下:
public class IndexModel { Workbook workbook = new Workbook(); SpireInfos SpireInfosModel = new SpireInfos(); public void HelloExcel() { //Excel 加密 如果文檔加密 屬性設置是無效的... workbook.Protect("123456");//設置Excel文檔的打開密碼 //繼續對Sheet加密 Worksheet sheet = workbook.Worksheets[0]; sheet.Range["A1"].Text = "鎖定"; sheet.Range["B1"].Text = "未鎖定"; sheet.Protect("654321", SheetProtectionType.All);//密碼 654321 SpireInfosModel.SavaXls(workbook,"我是雙重加密的Excel文件"); } }
當我們嘗試編輯Excel單元格時,會出現如下提醒:
那么,我們可以按照上述提示,輸入密碼進行解鎖,在此不作演示。
項目中的需求不僅僅是創建Excel文件,很多時候會使用加載一個已經存在的文件,特別是加載模板Excel文件。那么,如何加載已經存在的Excel文件呢?
現在,我們選擇加載我們第一次測試時生成的Excel文件,即文件:第一次簡單測試.Xlsx
代碼示例如下:
public class IndexModel { Workbook workbook = new Workbook(); SpireInfos SpireInfosModel = new SpireInfos(); public void HelloExcel() { SpireInfosModel.LoadFromFile(workbook, "第一次簡單測試"); Worksheet sheet = workbook.Worksheets[0]; for (int j = 1; j < 11; j++) { sheet.Range["A" + j].Text = j.ToString(); sheet.Range["B" + j].Text = j.ToString(); } SpireInfosModel.SavaXls(workbook); } }
程序中演示過程如下:加載Excel文件:第一次簡單測試.Xlsx,然后操作文件單元格,分別對單元格A1~A10/B1~B10賦值。賦值完畢后,並保存為新的文件
新文件如下:
以上便是加載Excel文件。
在本節案例中,都是些簡單的案例,以后我還會深入學習這個插件,會持續寫關於本插件的使用!
注:以上程序撰寫的過程中,忘記了釋放資源,大家可在自己的程序中添加上,這樣程序會更加完善!
參考文獻:http://www.cnblogs.com/asxinyu/p/4374015.html
官網文獻:https://www.e-iceblue.com/Tutorials/Spire.XLS/Spire.XLS-Program-Guide/Spire.XLS-Program-Guide-Content.html
@陳卧龍的博客