之前有寫過多篇關于使用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.Combine(SourceBook2);
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。
標簽:
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:博客園