之前有写过多篇关于使用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。

标签: none

添加新评论