C#2008报表控件导出excel格式,能实现类似excel中的合并单元格
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#2008报表控件导出excel格式,能实现类似excel中的合并单元格相关的知识,希望对你有一定的参考价值。
Access数据库,要生成统计表格。其中,有相同的字段属性,合并相同的行,后面不一样的再分开显示。如下图:然后还要把这种效果导出成excel格式。
尝试了利用水晶报表来解决,主要是通过抑制显示,可是导出的基于文本框的外框也效果不好?大家有什么好的解决方案?
或者,有哪个第三方控件,可以完美的实现合并单元格后,上下还能居中,支持用程序控制那些自动合并?
谢谢。
使用第三方开源excel控件,NPOI可以实现。以下为效果图。关于合并可以是横向合并和纵向,合并只要第一个单元格赋值,然后用代码合并即可。而且用第三方控件可以通到生成多sheet的excel文档。
还有一个开源控件叫MyXls也可以实现,不过这个控件每个单元格有255个字符的限制,所以不推荐使用。
用table的方式导出表格的老套方法就不要考虑了,那个导出的不是标准的excel。属于多年前被淘汰的方式。
追问谢谢啊!
用table的方式导出表格的老套方法?是什么意思?
已被淘汰的方式,那现在的方式是什么呢?
因为table的方式导出的实际是文本文件,你用记事本打开就能看出来,excel实际是有专用格式的。我建议用第三方控件NPOI实现excel的导出和导入。
参考技术A C#代码可以写一个HttpResponse 导出EXCECL,实际内容就像写一个表格的字符串,然后用流输出,合并单元格、上下居中这些都是在标签里就完成类似:<tr><td colspan='4' align='center' style='font-size: 18pt; font-family: 宋体;border-right: black 1px solid; border-top: black 1px solid; border-left: black 1px solid;" +
"border-bottom: black 1px solid'>明细表</td></tr>(这个是表格抬头的那行)
使用Aspose.Cell控件实现多个Excel文件的合并
之前有写过多篇关于使用Apose.Cell控件制作自定义模板报表和通用的导出Excel表格数据的操作,对这个控件的功能还是比较满意,而且也比较便利。忽然有一天,一个朋友说:你已经有生成基于自定义模板报表了,可是我每个单位都导出一张相同的报表的话,我岂不是要生成很多文件,而且对比查看也不方便,有没有更好的办法合并他们到一个文件里面呢?这样我看报表就方便很多了。本文主要介绍如何实现基于一个自定义报表模式,生成多个类似报表合并在一个文件中具体操作。
查询Apose.Cell控件的使用介绍,WorkBook对象确实有一个Combine的方法,专门做文件合并的工作,实现的代码如下所示。
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重新保存为另外一个文件即可。
首先我通过一个简单例子来介绍实现思路,先来设计一个简单的自定义模板,如下所示 。
这样,我们通过基于该自定义模板,生成一系列相似的报表文件,然后逐一合并他们即可,例子实现的代码如下所示:
{
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。
以上是关于C#2008报表控件导出excel格式,能实现类似excel中的合并单元格的主要内容,如果未能解决你的问题,请参考以下文章