Excel產生器

  • 48732
  • 0
  • .Net
  • 2011-04-21

因為客戶太多的匯出Excel的需求,每次都要寫一大串的Code去處理,越寫越多就覺得自己很笨,寫了一堆重覆Copy-Paste的Code,因此想了一個以Template的方式,不同的需求只要寫不同的Template,只要改一下Template就可以快速產生不同的Excel,Code變漂亮了,也大量減少了這類需求的工作量。

因為客戶太多的匯出Excel的需求,每次都要寫一大串的Code去處理,越寫越多就覺得自己很笨,寫了一堆重覆Copy-Paste的Code,因此想了一個以Template的方式,不同的需求只要寫不同的Template,只要改一下Template就可以快速產生不同的Excel,Code變漂亮了,也大量減少了這類需求的工作量。

NOTE:

現在的Excel還在開發中,當然還只能產生簡單的Excel,不過到是能滿足目前客戶的需求。

ASP.NET MVC上的應用,可以參考這篇ASP.NET MVC 匯出Excel套件

 

下載Wade.ExcelGenerater

 

使用範例

商品資訊.Template


<excelTemplate xmlns="http://wade.tw/ExcelTemplate.xsd">
  <fileNameFormat>商品資訊-${date:yyyyMMdd-HHmm}</fileNameFormat>
  <defaultStyle alignment="center" height="120" verticalAlignment="top" warpText="true" />
  <columns>
    <column width="30" bindPath="URL" title="連結" />
    <column width="60" bindPath="&quot;http://www.YourHost.com.tw&quot; +圖片路徑" title="圖片" cellType="image" />
    <column width="25" bindPath="商品編號 + 商品名稱" title="商品名稱" />
    <column width="15" bindPath="點擊數" title="點擊數" />
    <column width="15" bindPath="ID" title="購買率" bindConverter="計算購買率|My.Business.ProduceExtension,My.Business"/>
    <column width="20" bindPath="商品類別.類別名稱" title="類別名稱"/>
    <column width="15" bindPath="IsEnable==true?&quot;存在&quot;:&quot;不存在&quot;" title="圖片狀態" />
    <column width="17" bindPath="CreateTime" title="建檔時間" cellType="datetime" />
    <column width="17" bindPath="LastEditTime" title="最後修改時間" cellType="datetime" />
  </columns>
</excelTemplate>

 

使用端


{
    var datas = context.商品主檔.OrderByDescending(x => x.CreateTime);
    var template = ExcelTemplate.Load("範例路徑\\商品資訊.Template")
    var generater = Ioc.New<ExcelGeneraterBase>(datas,template);
    generater.Generater(File.Open("匯出路徑\\" + template.GetFileName(), FileMode.Create));
}

 

Template說明

這是目前Template所有可以輸入的內容


<excelTemplate xmlns="http://wade.tw/ExcelTemplate.xsd" hideTitle="false">
  <fileNameFormat></fileNameFormat>
  <defaultStyle alignment="left" 
                cellType="" 
                dataFormat="" 
                height="120" 
                verticalAlignment="top" 
                warpText="true" 
                width=""/>
  <columns>
    <column alignment="left" 
            bindConverter="" 
            bindPath="" 
            cellType="string" 
            dataFormat="" 
            formula="" 
            verticalAlignment="bottom" 
            warpText="0" 
            width="" 
            title="" />
  </columns>
</excelTemplate>

 

範本的Xml Root為excelTemplate,我有定義Xml Schema路徑為http://wade.tw/ExcelTemplate.xsd,因為有用Xml Schema驗證所以一定要輸入,可以將xsd複制到

          %Program Files%\Microsoft Visual Studio %version%\xml\Schemas

可以在Visual Studio中編輯時有IntelliSense支援

 

excelTemplate項目說明

 

子項目與屬性 說明
hideTitle 選項
是否要輸入欄位名稱
fileNameFormat 選項
提供匯出時的檔案名稱,目前提供${date : dateFormat}格式。
例:商品資訊-${date:yyyyMMdd-HHmm}
如果沒有設定預設值為Export
defaultStyle 選項
column上的預設風格,與column上的設定相同,唯一多了height設定
columns 必需
可以定義匯出Excel的欄位集合。

 

column項目說明

 

屬性 說明
alignment
選項
水平對齊,有left、center、right可以設定
bindPath
選項
使用DynamicExpression來處理這個欄位,如果是空值會回值物件本身
bindConverter
選項
因為DynamicExpression有namespace的限制,但有時是需要呼叫其他Method,為bindPath回傳的值做一些加工,格式為MethodName|TypeFullName,AssemblyName
如:計算購買率|My.Business.ProduceExtension,My.Business,有一個限制是Method必需是靜態與只能有一個參數。
cellType
選項 預設值為string
為儲存值的格式,目前有
string
numeric
formula 同時必需設定formula屬性
index 為會輸出資料集的Index,從1開始
date date的預設dateFormat為yyyy-m-d
dateTime dateTime的預設dateFormat為yyyy-m-d hh:mm
● image 設成Image時bindPath+bindConverter回傳的值必需是完整的URL,且必需要設定defautStyle的Height
dataFormat
選項
資料的格式化,這個值的設定,請參考Excel的儲存格格式。
image
formula
選項
公式,使用${index}換成RowIndex,目前只支援同一行間的計算。
如: A${index} + B${index}
verticalAlignment
選項
垂直對齊,有top、middle、bottom可以設定
warpText
選項
是否自動換行
title
選項
欄位的名稱

 

目前實作ExcelGeneraterBase的只有NPOIExcelGenerater,所以產生的Office是2003的格式。