因為客戶太多的匯出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套件
使用範例
商品資訊.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=""http://www.YourHost.com.tw" +圖片路徑" 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?"存在":"不存在"" 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的儲存格格式。 |
formula |
選項
公式,使用${index}換成RowIndex,目前只支援同一行間的計算。 如: A${index} + B${index} |
verticalAlignment |
選項
垂直對齊,有top、middle、bottom可以設定 |
warpText |
選項
是否自動換行 |
title |
選項
欄位的名稱 |
目前實作ExcelGeneraterBase的只有NPOIExcelGenerater,所以產生的Office是2003的格式。