我們要生成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; namespace TestExcel } _factory.SaveExcel("c://Qreportstr.xls"); |
//最後保存導出的Excel文件即可
}
private DataTable GetDataTable(string Sql)
|
由上面代碼可見,一般的報表生成都是三句代碼,即使對於報表的某些行,某些格式要調整我們也不需要在去修改程序,只要改xml描述文件即可,這樣就可以使我們大大的在報表的生成上來節省時間,而可以把更多的時間放在業務邏輯的處理上了。