EciReport模板导出
# 功能介绍
基于模板导出Excel的功能
1
# 功能使用
有两个类一个是EciReport,另一个是EciReport2007。
区别:
EciReport的模板是 xxx.xls的
EciReport2007的模板是 xxx.xlsx
两个类的属性都是一样的,使用方法也是一样的,主要是根据模板来选择。
1
2
3
4
5
2
3
4
5
# EciReport类的属性
属性 | 说明 | 类型 | 默认值 |
---|---|---|---|
Pwd | 密码 | string | |
BookPwd | 密码 | string | |
是否转PDF | bool | false | |
Rar | 是否是压缩包 | bool | false |
PDFView | 预览PDF | bool | false |
AutoHeight | 自适应高度 | bool | false |
StartRowIndex | 数据开始行(第一行索引是1,不是0) | int | 1 |
HeightParam | int | 80 | |
EndRowIndex | 自动高度数据结束行索引 | int | 0 |
AutoToExcel | 导出完毕后自动输出到Excel中 | bool | true |
ForceFormulaRecalculation | 重新计算公式 | bool | false |
Name | 报表名称 | string | |
Type | 报表类型 | string | |
TemplateFile | 模板文件 | string | |
DataSource | 数据源 | DataSet | |
ReportParam | 参数 | EntityBase | |
ListDetail | 明细处理配置 | List:EciReportDetail | |
TargetFileName | 目标文件名 | string | |
multiSheet | 是否是多sheet | bool |
# EciReport类的方法
事件名称 | 说明 | 参数 |
---|---|---|
OnBeforeOutput | 输出之前用户自定义事件 | |
EciReport | 构造函数 | |
AddDataTable | 追加数据表 | DataTable |
AddDataTable | 追加数据表 | DataTable,tableName |
Execute | 执行导出第一页Sheet【EXCEL报表】 | |
ExecuteSheet | 导出指定索引的Sheet | sheet索引:inputSheetIndex,table名称:headTableName |
PrintLandscape | 设置水平打印 | landscape(true:横向打印,false:纵向打印),pagerSize |
ToExcel | 导出Excel |
# EciReportDetail 类的属性
属性 | 说明 | 类型 | 默认值 |
---|---|---|---|
Name | 数据源的名称 | string | |
StartRowIndex | 起始行,注意:第一行的索引是1,不是0 | int | |
RowSpan | 多少行为一条数据 | int | 1 |
RowIndex | 模板行 | int | |
TableIndex | word导出模板专用 | int | 0 |
listPics | 图片列表 |
# 快递面单(条码)
# 模板设置的内容属性
属性 | 说明 | 类型 |
---|---|---|
CMD | 命令符(固定值:BARCODE) | string |
type | 类型(可选值:Code39,Code128A,Code128B,Code128C,QR) | string |
top | 设置条码距到顶部的距离 | string |
left | 设置条码到左边的距离 | string |
ColSpan | 列 | string |
RowSpan | 行 | string |
resize | 生成的条码的图片的大小;默认比例:(0.98, 0.90) | string |
showCode | 是否显示编码(显示:"1") | string |
Data | 数据源 | string |
# 示例
# 模板示例
![[demo_01_模板.jpg]]
# 代码示例
EciReport npoi = new EciReport();
npoi.TemplateFile = Server.MapPath("~") + "\\AppDemo\\NPOI\\Excel\\快递面单YT.xls";
DataTable dataHead = DataTableHelper.Create("运单号", 1).DataTable;
dataHead.TableName = "HEAD";
dataHead.Rows[0]["运单号"] = "123456789";
npoi.AddDataTable(dataHead);
npoi.Execute();
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 导出结果
![[demo_01_结果.png]]
# 主表
主表字段使用的 $ 开始 ,后面拼接表格列的字段名称
1
# 示例
# 模板示例
![[demo_02_模板.png]]
# 代码示例EciReport
EciReport npoi = new EciReport();
npoi.TemplateFile = Server.MapPath("~") + "\\AppDemo\\NPOI\\Excel\\主表.xls";
DataSet dataset = new DataSet();
npoi.DataSource = dataset;
DataTable dataHead = DataTableHelper.Create("用户名,订单号", 1).DataTable;
dataHead.TableName = "HEAD";
dataHead.Rows[0]["用户名"] = "系统管理员1";
dataHead.Rows[0]["订单号"] = "123456789";
dataset.Merge(dataHead);
//自动导出Excel
npoi.AutoToExcel = true;
npoi.Execute();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 导出结果
![[demo_02_结果.png]]
# 主从
主表字段使用的 $ 开始 ,后面拼接表格列的字段名称
明细字段使用:# 开始 ,后面拼接表格列的字段名称
1
2
2
# 示例
# 模板示例
![[demo_03_模板.png]]
# 代码示例1
EciReport npoi = new EciReport();
npoi.TemplateFile = Server.MapPath("~") + "\\AppDemo\\NPOI\\Excel\\主从.xls";
DataSet dataset = new DataSet();
npoi.DataSource = dataset;
//StartRowIndex:设置明细行的开始索引,从1开始
npoi.ListDetail.Add(new EciReportDetail() { StartRowIndex = 9, Name = "ROLE" });
DataTable dataRole = DataTableHelper.Create("NAME,CREATE_DATE,ZONE,NO,NAME_LINK,ZONE_LINK", 5).AddNumColumn("年龄").DataTable;
dataRole.TableName = "ROLE";
int index = 1;
foreach (DataRow row in dataRole.Rows)
{
row["NO"] = "45666" + index++;
row["NAME_LINK"] = "http://baidu.com";//测试超链接
row["ZONE_LINK"] = "http://oa.ecidh.com:8010/oa/";
}
DataTable dataHead = DataTableHelper.Create("用户名,备注,订单号", 1).DataTable;
dataHead.TableName = "HEAD";
dataHead.Rows[0]["用户名"] = this.txtUserName.Text;
dataHead.Rows[0]["订单号"] = "123213213213";
npoi.DataSource.Merge(dataHead);
npoi.DataSource.Merge(dataRole);
npoi.Execute();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 代码示例2
![[config.png]]
通过模板设置StartRowIndex,明细表格名称;
如下:在模板中添加一个“config”的sheet
{List:[{Name:"ROLE",Row:5}]}
等价于代码:npoi.ListDetail.Add(new EciReportDetail() { StartRowIndex = 5, Name = "ROLE" });
1
2
3
4
5
6
2
3
4
5
6
# 导出结果
![[demo_03_结果.png]]
# 主从(合并单元格)
主表字段使用的 $ 开始 ,后面拼接表格列的字段名称
明细字段使用:# 开始 ,后面拼接表格列的字段名称
设置:MERGER列设置需要合并的列名称
COMPANYNAME:133:合并垂直低端水平靠右对齐
第一个数字:1.合并,2.清除
第二个数字垂直方向:1顶端对齐 2居中对齐 3底端对齐
第二个数字水平方向:1左对齐 2居中对齐 3右对齐
NODENAME:121:合并居中靠左对齐
第一个数字:1.合并,2.清除
第二个数字垂直方向:1顶端对齐 2居中对齐 3底端对齐
第二个数字水平方向:1左对齐 2居中对齐 3右对齐
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# 示例
# 模板示例
![[demo_04_模板.png]]
# 代码示例
DataSet ds = new DataSet();
ds.ReadXml(Server.MapPath("~") + @"\AppDemo\NPOI\Xml\Data.xml");
DataTable data = ds.Tables[0];
data.Columns.Add("MERGER");
data.Rows[0]["MERGER"] = "COMPANYNAME:133,NODENAME:121";
EciReport report = new EciReport();
report.TemplateFile = Server.MapPath("~") + @"\AppDemo\NPOI\Excel\用户角色.xls";
report.AddDataTable(data, "DATA");
report.ListDetail.Add(new EciReportDetail() { Name = "DATA", StartRowIndex = 2 });
report.Execute();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 导出结果
![[demo_04_结果.png]]
# 仅导出明细
主表字段使用的 $ 开始 ,后面拼接表格列的字段名称
明细字段使用:# 开始 ,后面拼接表格列的字段名称
1
2
2
# 示例
# 模板示例
![[demo_05_模板.png]]
# 代码示例
EciReport2007 npoi = new EciReport2007();
npoi.TemplateFile = Server.MapPath("~") + "\\AppDemo\\NPOI\\Excel2007\\明细.xlsx";
npoi.ListDetail.Add(new EciReportDetail() { StartRowIndex = 3, Name = "ROLE" });
DataSet dataset = new DataSet();
npoi.DataSource = dataset;
DataTable dataRole = DataTableHelper.Create("NAME,CREATE_DATE", 5).DataTable;
dataRole.TableName = "ROLE";
dataset.Merge(dataRole);
npoi.Execute();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 导出结果
![[demo_05_结果.png]]
# 导出主从(分组)
主表字段使用的 $ 开始 ,后面拼接表格列的字段名称
明细字段使用:# 开始 ,后面拼接表格列的字段名称
在明细表中,通过K列,来进行分组
1
2
3
2
3
# 示例
# 模板示例
在明细表中,添加K列,设置相同的值,代表是一组的 ![[demo_06_模板.png]]
# 代码示例
EciReport2007 npoi = new EciReport2007();
npoi.TemplateFile = Server.MapPath("~") + "\\AppDemo\\NPOI\\Excel2007\\主从-分组.xlsx";
npoi.ListDetail.Add(new EciReportDetail() { StartRowIndex = 5, Name = "ROLE" });
DataSet dataset = new DataSet();
npoi.DataSource = dataset;
DataTable dataHead = DataTableHelper.Create("K,用户名,SHEET_NAME", 3).DataTable;
dataHead.TableName = "HEAD";
dataHead.Rows[0]["SHEET_NAME"] = dataHead.Rows[0]["用户名"].ToString();
dataHead.Rows[1]["SHEET_NAME"] = dataHead.Rows[1]["用户名"].ToString();
dataHead.Rows[2]["SHEET_NAME"] = "";
DataTable dataRole = DataTableHelper.Create("K,NAME,CREATE_DATE", 8).DataTable;
dataRole.TableName = "ROLE";
dataRole.Rows[0]["K"] = "K1";
dataRole.Rows[1]["K"] = "K1";
dataRole.Rows[2]["K"] = "K2";
dataRole.Rows[3]["K"] = "K2";
dataRole.Rows[4]["K"] = "K2";
dataRole.Rows[5]["K"] = "K2";
dataRole.Rows[6]["K"] = "K3";
dataRole.Rows[7]["K"] = "K4";
dataset.Merge(dataRole);
dataset.Merge(dataHead);
npoi.Execute();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 导出结果
分不同的sheet显示结果 ![[demo_06_结果1.png]] ![[demo_06_结果2.png]] ![[demo_06_结果3.png]]
# 多模板,多sheet导出
主表字段使用的 $ 开始 ,后面拼接表格列的字段名称
明细字段使用:# 开始 ,后面拼接表格列的字段名称
要执行多次:ExecuteSheet,指定sheet执行导出
1
2
3
2
3
# 示例
# 模板示例
![[demo_07_模板_1.png]] ![[demo_07_模板_2.png]]
# 代码示例
EciReport npoi = new EciReport();
npoi.TemplateFile = Server.MapPath("~") + "\\AppDemo\\NPOI\\Excel\\多表.xls";
DataTable dataHead = DataTableHelper.Create("CODE,NAME", 1).DataTable;
dataHead.TableName = "HEAD";
DataTable dataA = DataTableHelper.Create("CODE,NAME", 2).DataTable;
dataA.TableName = "A";
DataTable dataB = DataTableHelper.Create("CODE,NAME", 5).DataTable;
dataB.TableName = "B";
npoi.AddDataTable(dataHead);
npoi.AddDataTable(dataA);
npoi.AddDataTable(dataB);
npoi.AutoToExcel = false;
npoi.ListDetail = new List<EciReportDetail>() { new EciReportDetail() { Name = "A", StartRowIndex = 2 } };
npoi.Execute();
npoi.ListDetail = new List<EciReportDetail>() { new EciReportDetail() { Name = "B", StartRowIndex = 2 } };
npoi.ExecuteSheet(1, string.Empty);
npoi.ToExcel();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 导出结果
![[demo_07_结果_1.png]] ![[demo_07_结果_2.png]]
# Excel导出到Table添加超链接
主表字段使用的 $ 开始 ,后面拼接表格列的字段名称
明细字段使用:# 开始 ,后面拼接表格列的字段名称
添加超链接:添加列:columnName_LINK,
1
2
3
2
3
# 示例
# 模板示例
在代码中,给明细表的字段添加超链接: 给字段NAME添加,就是在表格中添加列NAME_LINK,设置url地址。 ![[demo_08_模板.png]]
# 代码示例
EciReport npoi = new EciReport();
npoi.TemplateFile = Server.MapPath("~") + "\\AppDemo\\NPOI\\Excel\\超链接.xls";
npoi.ListDetail.Add(new EciReportDetail() { StartRowIndex = 3, Name = "ROLE" });
DataSet dataset = new DataSet();
npoi.DataSource = dataset;
DataTable dataRole = DataTableHelper.Create("NAME,CREATE_DATE,ZONE,NO,NAME_LINK,ZONE_LINK", 5).AddNumColumn("年龄").DataTable;
dataRole.TableName = "ROLE";
int index = 1;
foreach (DataRow row in dataRole.Rows)
{
row["NO"] = "45666" + index++;
row["NAME_LINK"] = "http://baidu.com";//测试超链接
row["ZONE_LINK"] = "http://oa.ecidh.com:8010/oa/";//测试超链接
}
dataRole.Rows[1]["年龄"] = "1";
DataTable dataHead = DataTableHelper.Create("用户名,备注,订单号", 1).DataTable;
dataHead.TableName = "HEAD";
dataHead.Rows[0]["用户名"] = "xxxxx";
dataHead.Rows[0]["订单号"] = "123213213213";
npoi.DataSource.Merge(dataHead);
npoi.DataSource.Merge(dataRole);
npoi.Execute();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 导出结果
![[demo_08_结果.png]]
# 导出2003自动换行设置
主表字段使用的 $ 开始 ,后面拼接表格列的字段名称
明细字段使用:# 开始 ,后面拼接表格列的字段名称
设置属性:AutoHeight
1
2
3
2
3
# 示例
# 模板示例
![[demo_09_模板.png]]
# 代码示例
EciReport npoi = new EciReport();
npoi.TemplateFile = Server.MapPath("~") + "\\AppDemo\\NPOI\\Excel\\明细.xls";
npoi.ListDetail.Add(new EciReportDetail() { StartRowIndex = 3, Name = "ROLE" });
npoi.AutoHeight = true;
npoi.StartRowIndex = 2;
npoi.EndRowIndex = 8;
DataSet dataset = new DataSet();
npoi.DataSource = dataset;
DataTable dataRole = DataTableHelper.Create("NAME,CREATE_DATE", 5).DataTable;
int i = 0;
foreach (DataRow dr in dataRole.Rows)
{
if (i % 2 == 0)
{
dr["CREATE_DATE"] = "创建时new的对象不一样,2.生成的文件后缀不一样,3.创建时加的前缀不一样(也可以不用加前缀,直接使用接口的方式创建)" + i;
}
i++;
}
dataRole.TableName = "ROLE";
dataset.Merge(dataRole);
npoi.Execute();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 导出结果
![[demo_09_结果.png]]
# 导出设置偏移量
主表字段使用的 $ 开始 ,后面拼接表格列的字段名称
明细字段使用:# 开始 ,后面拼接表格列的字段名称
在模板中设置 $字段 % 5:向左偏移5个单元格;
1
2
3
2
3
# 示例
# 模板示例
向左偏移5个单元格:从H列偏移到C列; ![[demo_10_模板.png]]
# 代码示例
EciReport npoi = new EciReport();
npoi.PDF = this.chkPDFView.Checked;
npoi.TemplateFile = Server.MapPath("~") + "\\AppDemo\\NPOI\\Excel\\主表.xls";
DataSet dataset = new DataSet();
npoi.DataSource = dataset;
DataTable dataHead = DataTableHelper.Create("用户名,订单号", 1).DataTable;
dataHead.TableName = "HEAD";
dataHead.Rows[0]["用户名"] = this.txtUserName.Text;
dataHead.Rows[0]["订单号"] = "123456789";
dataset.Merge(dataHead);
npoi.Execute();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 导出结果
![[demo_10_结果.png]]