天天看點

使用Aspose.Cell控件實作多個Excel檔案的合并

之前有寫過多篇關于使用Apose.Cell控件制作自定義模闆報表和通用的導出Excel表格資料的操作,對這個控件的功能還是比較滿意,而且也比較便利。忽然有一天,一個朋友說:你已經有生成基于自定義模闆報表了,可是我每個機關都導出一張相同的報表的話,我豈不是要生成很多檔案,而且對比檢視也不友善,有沒有更好的辦法合并他們到一個檔案裡面呢?這樣我看報表就友善很多了。本文主要介紹如何實作基于一個自定義報表模式,生成多個類似報表合并在一個檔案中具體操作。

查詢Apose.Cell控件的使用介紹,WorkBook對象确實有一個Combine的方法,專門做檔案合并的工作,實作的代碼如下所示。

Workbook SourceBook1 = new Workbook();

SourceBook1.Open("c:\\excels\\ChartTest.xls");

Workbook SourceBook2 = new Workbook();

SourceBook2.Open("C:\\excels\\PictureTest.xls");

SourceBook1.Combine(SourceBook2);

SourceBook1.Save("c:\\excels\\combined.xls");

既然有了這個方法合并檔案,那麼客戶提出的問題,就也可以通過該思路來解決了。問題隻是這個方法合并已有的檔案,而客戶需要的是在一個自定義模闆的基礎上生成多個相似的報表,放到一個檔案中,每個報表一個Sheet而已。

SourceBook1.Save("c:\\excels\\combined.xls"); 

通過以上的代碼,我們可以看到,檔案合并的邏輯,其實是多個WorkBook之間的合并,然後把最後的WorkBook重新儲存為另外一個檔案即可。 

首先我通過一個簡單例子來介紹實作思路,先來設計一個簡單的自定義模闆,如下所示 。

 這樣,我們通過基于該自定義模闆,生成一系列相似的報表檔案,然後逐一合并他們即可,例子實作的代碼如下所示:

        private DataTable GetCustomersTable()

        {

            DataTable dt = new DataTable("Customers");

            dt.Columns.Add("Address");

            dt.Columns.Add("City");

            dt.Columns.Add("CompanyName");

            dt.Columns.Add("ContactName");

            dt.Columns.Add("ContactTitle");

            dt.Columns.Add("Country");

            dt.Columns.Add("CustomerID");

            dt.Columns.Add("Fax");

            dt.Columns.Add("Phone");

            dt.Columns.Add("PostalCode");

            dt.Columns.Add("Region");

            for (int i = 0; i < 10; i++)

            {

                DataRow row = dt.NewRow();

                for (int j = 0; j < dt.Columns.Count; j++)

                {

                    row[j] = dt.Columns[j].ColumnName + "(" + i.ToString() + "," + j.ToString() + ")";

                }

                dt.Rows.Add(row);

            }

            return dt;

        }

        private void btnCombind_Click(object sender, EventArgs e)

            Workbook SourceBook1 = new Workbook();

            string path = System.IO.Path.Combine(Application.StartupPath, "SmartMarkerCombind.xls");

            DataTable dt = GetCustomersTable();//使用DataTable對象

            List<string> fileList = new List<string>();

            for (int i = 0; i < 3; i++)

                Workbook tempBook = new Workbook();

                //建立設計模闆對象,并綁定資料源

                WorkbookDesigner designer = new WorkbookDesigner();

                designer.Open(path);

                designer.SetDataSource(dt);

                designer.Process();

                //修改Sheet的名稱

                designer.Workbook.Worksheets[0].Name = "test" + i.ToString();

                //根據資料源和自定義模闆,生成相應的報表Excel檔案

                string fileToSave = System.IO.Path.Combine(Application.StartupPath, string.Format("Combind{0}.xls", i));

                designer.Save(fileToSave, FileFormatType.Excel2003);

                fileList.Add(fileToSave);

                //第一次要打開

                if (i == 0)

                    SourceBook1.Open(fileToSave);

                else

                    //第二個使用Combind函數操作

                    tempBook.Open(fileToSave);

                    SourceBook1.Combine(tempBook);

            //最後将WorkBook儲存為一個檔案即可

            string soucePath = System.IO.Path.Combine(Application.StartupPath, "Combind.xls");

            SourceBook1.Save(soucePath);

            //删除臨時檔案

            foreach (string file in fileList)

                if (File.Exists(file))

                    File.Delete(file);

            //打開檔案

            Process.Start(soucePath);

    }

注意,由于Workbook對象預設隻建立了一個Sheet對象供使用,是以要逐一修改Sheet對應的名稱,如下代碼所示:

designer.Workbook.Worksheets[0].Name = "test" + i.ToString(); 

最終生成的多Sheet對象的Excel報表效果如下圖所示:

當然,複雜的報表可能相對處理會更加複雜一些,不過大緻的邏輯就是通過這樣的步驟來實作整合即可,在項目中整合 真正的報表後,對方滿意,一切OK。