专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »DotNet » excel报表:.net关于企业Excel报表的生成 »正文

excel报表:.net关于企业Excel报表的生成

来源: 发布时间:星期四, 2009年2月12日 浏览:170次 评论:0


企业应用开发中都会涉及到报表生成般报表格式都是生成Excel格式对于各种报表生成直是员心中永远对于很多员来说每写个报表都意味着要写大断代码来实现而且有报表可能极其复杂以及不规范标准这时就会浪费员大量时间来编写和调试这些代码那到底有没有种思路方法能使代码尽量少写且又能实现各种Excel报表生成呢下面我们就转入正题
我们要生成Excel报表其实我们只需要两样东西:
1.报表样式也就是哪个字段应该填在哪里列应该填什么字体大小颜色单元格高度宽度单元格是否合并是否跨行是否跨列是横向报表(所谓横向报表我自定义为:张Excel报表就是有条记录或者有条记录以及其关联记录而生成报表张订单报表通常就是有个订单头和其相关订单明细所生成这个就是我自定义横向报表)还是纵向报表(所谓纵向报表我自定义为:张报表就是有个记录集所生成如要生成张记录某个班级学生情况报表则要把这个班级学生记录都要导出到这张报表中这种报表基本上就是统计报表张报表可能会有几万条记录或者更多这个就是我自定义纵向报表)等等报表样式
2.报表数据对于我们而言有了报表样式我们就知道在哪个或者哪几个单元格应该填哪些数据具体数据我们则可以以DataTable形式来表现也可以以DataSet形式来表现至于用如何样数据格式可以随自己喜欢自己来定义
现在我们知道了生成Excel报表只要有了样式和数据就可以生成张自己想要报表了数据生成并不困难但是我们困难就是这个报表样式用什么来描述如何来描述

对于样式描述我们可以用两种思路方法来实现:
1.直接用XML来描述这个xml描述文件主要描述内容可以如下(举个列子介绍说明现在描述还不是很规范标准):
<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<Style>
<ExcelStyle Sort=\"纵向\" Space=\"1\">
<Ranges>
<RangeStyle>
<Range CellWidth=\"2.0\" CellHeight=\"20\" CellBord=\"1\" CellBackColor=\"\"></Range>
<TitleCell TitleName=\"部件编号\" TitleStartxPos=\"1\" TitleEndxPos=\"1\" TitleStartyPos=\"1\" TitleEndyPos=\"1\"></TitleCell>
<DataCell DataName=\"PartNo\" DataStartxPos=\"2\" DataEndxPos=\"14\" DataStartyPos=\"34\" DataEndyPos=\"34\"IsMerger=\"False\" Align=\"XlHAlign.xlHAlignLeft\" IsToArray=\"True\" IsDateTime=\"False\" Interval=\"1\">
</DataCell>
<TitleFont TitleFontName=\"宋体\" TitleFontSize=\"9\" TitleFontColor=\"Black\" TitleFontBold=\"False\" TitleFontItatic=\"False\" TitleFontPosition=\"Center\"> </TitleFont>
<DataFont DataFontName=\"宋体\" DataFontSize=\"11\" DataFontColor=\"Black\" DataFontBold=\"True\" DataFontItatic=\"False\" DataFontHyperLink=\"False\" DataFontPosition=\"Center\">
</DataFont>
</RangeStyle>
</Ranges>
</ExcelStyle>
</Style>
这个XML中结点Excelstyle属性Sort描述了整个Excel格式是纵向还是横向(所谓纵向还是横向我上面已有所介绍说明)而属性Space则描述了报表每个记录行和行的间空多少行Ranges则是下面所有子节点RangeStyle父节点对于张报表通常会有很多RangeStyle结点RangeStyle其实就开始真正来描述哪个或哪些单元格来填写哪些字段如结点Range 就定义了单元格高度宽度边框宽度颜色这些属性TitleCell就是定义了报表(我这张是纵向报表所以有Title)Title属性如Title名称哪个单元格来填写这个名称节点DataCell则定义了要帮定数据中哪个字段从哪个单元开始填写单元格是否要合并对齐方式还有这个字段行和行的间间隔结点Title Font定义了Title字体属性如大小颜色是否斜体是否粗体对齐方式结点DataFont则定义了数据字体属性如大小颜色是否斜体是否粗体对齐方式个RangeStyle结点其实也就定义了个字段填写如果你报表要填写很多字段就会有很多个RangeStyle结点来描述这个xml样式定义文件可以自己写个工具来生成我有现成自己写生成工具叫ExcelStyle不过还很简陋用起来还不方便不过能生成我需要样式哪位需要我可以发给你们(我不知道如何提供下载)
2. XML描述文件和Excel模板相结合思路方法对于有些报表会很复杂特别是那些横向报表有时候会极其复杂这时就需要现成Excel模板有了Excel模板我们就可以参照着模板来生成xml样式定义文件在具体生成报表时候我们只要知道用到Excel模版是哪个XML样式文件是哪个再绑上我们数据那么即使再复杂报表也同样能简单生成了

具体使用可参照如下测试用列代码(声明ExcelOperate,XmlOperate是我自己写几个通用组件如有需要我可发邮件给你们其中数据我是以DataTable形式来描述):

sing ;
using NUnit.Framework;
using ExcelOperate;
using XmlOperate;
using .Data;
using .Data.SqlClient;

TestExcel
{
/// <summary>
/// </summary>
///
[TestFixture]
public ExcelExport
{
[Test]
public void Export//不用Excel模板数据导出
{
Sql =\"Select top 100* from customers \";
//取出100条数据
ExcelFactory _factory = ExcelFactory;
//定义个没有参数ExcelFactory
_factory.CreateExcelwithoutTemplate(\"c:\\\\bbbbbbb.xml\",GetDataTable(Sql ));
//载入定义样式文件bbbbbbb.xml和刚取出来数据GetDataTable(Sql )
_factory.SaveExcel(\"c:\\\\bbbbbbbbbbbbbbbb.xls\");
//保存导出文件即可

}
[Test]
public void ExportWithTemplate//用到了Excel模版数据导出
{
Sql =\"Select top 1* from customers \";


//取出条数据
ExcelFactory _factory = ExcelFactory(\"c:\\\\QStandardCustomer.xls\");
//导入模版QStandardCustomer.xls
_factory.CreateExcel(\"c:\\\\QStandardCustomer.xml\",GetDataTable(Sql ));
//载入定义样式文件QStandadrCustomer.xml和刚取出来数据GetDataTable(Sql )

_factory.SaveExcel(\"c:\\\\Qreportstr.xls\");
//最后保存导出Excel文件即可
}

private DataTable GetDataTable( Sql)
{
myConnectionString = \"packet size=4096;user id=sa;data source=172.28.200.98;initial catalog=Northwind\";
SqlConnection myConnection = SqlConnection(myConnectionString);
myConnection.Open;
SqlDataAdapter myAdapter = SqlDataAdapter;


SqlCommand myCommand = SqlCommand(Sql,myConnection);
myCommand.CommandType = CommandType.Text;
myAdapter.SelectCommand = myCommand;
DataSet ds = DataSet;
myAdapter.Fill(ds);
myConnection.Close;
ds.Tables[0];
}
}
}

由上面代码可见报表生成都是 3句代码即使对于报表某些行某些格式要调整我们也不需要在去修改只要改xml描述文件即可这样就可以使我们大大在报表生成上来节省时间而可以把更多时间放在业务逻辑处理上了
0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: