c#

位置:IT落伍者 >> c# >> 浏览文章

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


发布日期:2018年10月23日
 
.net中关于企业Excel报表的生成

在一般的企业应用开发中都会涉及到报表的生成且一般报表的格式都是生成Excel格式的对于各种报表的生成一直是程序员心中永远的痛因为对于很多程序员来说每写一个报表都意味着要写一大断代码来实现而且有的报表可能极其复杂以及不规范这时就会浪费程序员大量的时间来编写和调试这些代码那到底有没有一种方法能使代码尽量少写且又能实现各种Excel报表的生成呢下面我们就转入正题

我们要生成Excel报表其实我们只需要两样东西报表的样式也就是哪个字段应该填在哪里哪一列应该填什么字体大小颜色单元格高度宽度单元格是否合并是否跨行是否跨列是横向报表(所谓横向报表我自定义为一张Excel报表就是有一条记录或者有一条记录以及其关联记录而生成的报表如一张订单报表通常就是有一个订单头和其相关的订单明细所生成这个就是我自定义的横向报表)还是纵向报表(所谓纵向报表我自定义为一张报表就是有一个记录集所生成的如要生成一张记录某个班级学生情况的报表则要把这个班级的学生记录都要导出到这张报表中这种报表基本上就是统计报表一张报表可能会有几万条记录或者更多这个就是我自定义的纵向报表)等等报表样式

报表的数据对于我们而言有了报表样式我们就知道在哪个或者哪几个单元格应该填哪些数据具体的数据我们则可以以DataTable的形式来表现也可以以DataSet的形式来表现至于用怎么样的数据格式可以随自己喜欢自己来定义

现在我们知道了生成Excel报表只要有了样式和数据就可以生成一张自己想要的报表了数据的生成并不困难但是我们的困难就是这个报表的样式用什么来描述怎么来描述

对于样式的描述我们可以用两种方法来实现

直接用XML来描述这个xml描述文件的主要描述的内容可以如下(举个列子说明一下现在描述的还不是很规范)

<?xml version= encoding=UTF?>

<Style>

<ExcelStyle Sort=纵向 Space=>

<Ranges>

<RangeStyle>

<Range CellWidth= CellHeight= CellBord= CellBackColor=></Range>

<TitleCell TitleName=部件编号 TitleStartxPos= TitleEndxPos= TitleStartyPos= TitleEndyPos=></TitleCell>

<DataCell DataName=PartNo DataStartxPos= DataEndxPos= DataStartyPos= DataEndyPos=IsMerger=False Align=XlHAlignxlHAlignLeft IsToArray=True IsDateTime=False Interval=>

</DataCell>

<TitleFont TitleFontName=宋体 TitleFontSize= TitleFontColor=Black TitleFontBold=False TitleFontItatic=False TitleFontPosition=Center> </TitleFont>

<DataFont DataFontName=宋体 DataFontSize= 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不过还很简陋用起来还不方便不过能生成我需要的样式哪位需要我可以发给你们(我不知道怎么提供下载)

XML描述文件和Excel模板相结合的方法对于有些报表会很复杂特别是那些横向的报表有时候会极其复杂这时就需要现成的Excel模板有了Excel模板我们就可以参照着模板来生成xml样式定义文件在具体生成报表的时候我们只要知道用到的Excel模版是哪个XML样式文件是哪个再绑上我们的数据那么即使再复杂的报表也同样能简单生成了

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

sing System;

using NUnitFramework;

using ExcelOperate;

using XmlOperate;

using SystemData;

using SystemDataSqlClient;

namespace TestExcel

{

/// <summary>

/// </summary>

///

[TestFixture]

public class ExcelExport

{

[Test]

public void Export()//不用Excel模板的数据导出

{

string Sql =Select top * from customers ;

//取出条数据

ExcelFactory _factory = new ExcelFactory();

//定义一个没有参数的ExcelFactory

_factoryCreateExcelwithoutTemplate(c:\\bbbbbbbxmlGetDataTable(Sql ));

//载入定义的样式文件bbbbbbbxml和刚取出来的数据GetDataTable(Sql )

_factorySaveExcel(c:\\bbbbbbbbbbbbbbbbxls);

//保存导出的文件即可

}

[Test]

public void ExportWithTemplate()//用到了Excel模版的数据导出

{

string Sql =Select top * from customers ;

//取出一条数据

ExcelFactory _factory = new ExcelFactory(c:\\QStandardCustomerxls);

//导入模版QStandardCustomerxls

_factoryCreateExcel(c:\\QStandardCustomerxmlGetDataTable(Sql ));

//载入定义的样式文件QStandadrCustomerxml和刚取出来的数据GetDataTable(Sql )

_factorySaveExcel(c:\\Qreportstrxls);

//最后保存导出的Excel文件即可

}

private DataTable GetDataTable(string Sql)

{

string myConnectionString = packet size=;user id=sa;data source=;initial catalog=Northwind;

SqlConnection myConnection = new SqlConnection(myConnectionString);

myConnectionOpen();

SqlDataAdapter myAdapter = new SqlDataAdapter();

SqlCommand myCommand = new SqlCommand(SqlmyConnection);

myCommandCommandType = CommandTypeText;

myAdapterSelectCommand = myCommand;

DataSet ds = new DataSet();

myAdapterFill(ds);

myConnectionClose();

return dsTables[];

}

}

}

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

               

上一篇:c# Stack操作类

下一篇:使用.NET Framework中新的日期时间类型