概述:之前有寫過多篇關(guān)于使用Apose.Cell控件制作自定義模板報(bào)表和通用的導(dǎo)出Excel表格數(shù)據(jù)的操作,對(duì)這個(gè)控件的功能還是比較滿意,而且也 比較便利。忽然有一天,一個(gè)朋友說:你已經(jīng)有生成基于自定義模板報(bào)表了,可是我每個(gè)單位都導(dǎo)出一張相同的報(bào)表的話,我豈不是要生成很多文件,而且對(duì)比查看 也不方便,有沒有更好的辦法合并他們到一個(gè)文件里面呢?這樣我看報(bào)表就方便很多了。本文主要介紹如何實(shí)現(xiàn)基于一個(gè)自定義報(bào)表模式,生成多個(gè)類似報(bào)表合并在 一個(gè)文件中具體操作。
之前有寫過多篇關(guān)于使用Apose.Cell控件制作自定義模板報(bào)表和通用的導(dǎo)出Excel表格數(shù)據(jù)的操作,對(duì)這個(gè)控件的功能還是比較滿意,而且也 比較便利。忽然有一天,一個(gè)朋友說:你已經(jīng)有生成基于自定義模板報(bào)表了,可是我每個(gè)單位都導(dǎo)出一張相同的報(bào)表的話,我豈不是要生成很多文件,而且對(duì)比查看 也不方便,有沒有更好的辦法合并他們到一個(gè)文件里面呢?這樣我看報(bào)表就方便很多了。本文主要介紹如何實(shí)現(xiàn)基于一個(gè)自定義報(bào)表模式,生成多個(gè)類似報(bào)表合并在 一個(gè)文件中具體操作。
查詢Apose.Cell控件的使用介紹,WorkBook對(duì)象確實(shí)有一個(gè)Combine的方法,專門做文件合并的工作,實(shí)現(xiàn)的代碼如下所示。
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");
既然有了這個(gè)方法合并文件,那么客戶提出的問題,就也可以通過該思路來解決了。問題只是這個(gè)方法合并已有的文件,而客戶需要的是在一個(gè)自定義模板的基礎(chǔ)上生成多個(gè)相似的報(bào)表,放到一個(gè)文件中,每個(gè)報(bào)表一個(gè)Sheet而已。
SourceBook1.Combine(SourceBook2);
SourceBook1.Save("c:\\excels\\combined.xls");
通過以上的代碼,我們可以看到,文件合并的邏輯,其實(shí)是多個(gè)WorkBook之間的合并,然后把最后的WorkBook重新保存為另外一個(gè)文件即可。
首先我通過一個(gè)簡(jiǎn)單例子來介紹實(shí)現(xiàn)思路,先來設(shè)計(jì)一個(gè)簡(jiǎn)單的自定義模板,如下所示 。
這樣,我們通過基于該自定義模板,生成一系列相似的報(bào)表文件,然后逐一合并他們即可,例子實(shí)現(xiàn)的代碼如下所示:
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對(duì)象
List <string> fileList = new List<string>();
for (int i = 0; i < 3; i++)
{
Workbook tempBook = new Workbook();
//創(chuàng)建設(shè)計(jì)模板對(duì)象,并綁定數(shù)據(jù)源
WorkbookDesigner designer = new WorkbookDesigner();
designer.Open(path);
designer.SetDataSource(dt);
designer.Process();
//修改Sheet的名稱
designer.Workbook.Worksheets[0].Name = "test" + i.ToString();
//根據(jù)數(shù)據(jù)源和自定義模板,生成相應(yīng)的報(bào)表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
{
//第二個(gè)使用Combind函數(shù)操作
tempBook.Open(fileToSave);
SourceBook1.Combine(tempBook);
}
}
//最后將WorkBook保存為一個(gè)文件即可
string soucePath =
System.IO.Path.Combine(Application.StartupPath, "Combind.xls");
SourceBook1.Save(soucePath);
//刪除臨時(shí)文件
foreach (string file in fileList)
{
if (File.Exists(file))
{
File.Delete(file);
}
}
//打開文件
Process.Start(soucePath);
}
}
注意,由于Workbook對(duì)象默認(rèn)只創(chuàng)建了一個(gè)Sheet對(duì)象供使用,因此要逐一修改Sheet對(duì)應(yīng)的名稱,如下代碼所示:
designer.Workbook.Worksheets[0].Name = "test" + i.ToString();
最終生成的多Sheet對(duì)象的Excel報(bào)表效果如下圖所示:
當(dāng)然,復(fù)雜的報(bào)表可能相對(duì)處理會(huì)更加復(fù)雜一些,不過大致的邏輯就是通過這樣的步驟來實(shí)現(xiàn)整合即可,在項(xiàng)目中整合 真正的報(bào)表后,對(duì)方滿意,一切OK。
標(biāo)簽:
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@ke049m.cn
文章轉(zhuǎn)載自:博客園