Spire.XLS,生成Excel文件、加載Excel文件


一、組件介紹

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

@陳卧龍的博客


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM