Excel報表的生成[轉貼]

在一般的企業應用開發中都會涉及到報表的生成,且一般報表的格式都是生成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 System;
using NUnit.Framework;
using ExcelOperate;
using XmlOperate;
using System.Data;
using System.Data.SqlClient;

namespace TestExcel
{
/// <summary>
/// </summary>
///
[TestFixture]
public class ExcelExport
{
[Test]
public void Export()//不用Excel模板的數據導出
{
string Sql ="Select top 100* from customers ";
//取出100條數據
ExcelFactory _factory = new ExcelFactory();
//定義一個沒有參數的ExcelFactory
_factory.CreateExcelwithoutTemplate("c://bbbbbbb.xml",GetDataTable(Sql ));
//載入定義的樣式文件bbbbbbb.xml和剛取出來的數據GetDataTable(Sql )
_factory.SaveExcel("c://bbbbbbbbbbbbbbbb.xls");
//保存導出的文件即可

}
[Test]
public void ExportWithTemplate()//用到了Excel模版的數據導出
{
string Sql ="Select top 1* from customers ";
//取出一條數據
ExcelFactory _factory = new 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(string Sql)
{
string myConnectionString = "packet size=4096;user id=sa;data source=172.28.200.98;initial catalog=Northwind";
SqlConnection myConnection = new SqlConnection(myConnectionString);
myConnection.Open();
SqlDataAdapter myAdapter = new SqlDataAdapter();


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

由上面代碼可見,一般的報表生成都是三句代碼,即使對於報表的某些行,某些格式要調整我們也不需要在去修改程序,只要改xml描述文件即可,這樣就可以使我們大大的在報表的生成上來節省時間,而可以把更多的時間放在業務邏輯的處理上了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章