熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

.net中關於企業Excel報表的生成

2013-11-13 10:30:00  來源: .NET編程 

  在一般的企業應用開發中都會涉及到報表的生成且一般報表的格式都是生成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描述文件即可這樣就可以使我們大大的在報表的生成上來節省時間而可以把更多的時間放在業務邏輯的處理上了


From:http://tw.wingwit.com/Article/program/net/201311/13827.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.