首先說說,第一次遇到過匿名導出的那個時候是在我在北京第一家公司,簡單的聲明一個對象就可以導出,那時候感覺高大上,自己也想研究研究,但是因為頭將代碼後來加密了根本看不到。好吧,研究了研究放棄了,後來,因為個人原因離職了。
然後進入了一個外包公司,有個功能需求是導入,導出Excel的需求,當時不想復制粘貼簡單操作,也因為受到這家公司動態創建實體的代碼上的理解,也不喜歡同事導出時先保存到服務器的邏輯,便用NPOI重寫了一份幫助類。
因為時間太長了,更換了電腦,當時測試的Demo已經沒有了,我分拆出來一個吧。
實現功能:
注:功能目前只支持單Sheet
導入:支持List和DataTable格式,支持數據非空驗證。
導出:支持List和DataTable格式,支持Excel格式,支持匿名類List導出及簡單樣式操作。
定義Excel和實體類及DataTable的對應列實體,此實體主要是用於幫助定義導入導出時的字段對應關系。
及導入是非空驗證,導出時配置簡單樣式等。
下圖是主要類結構圖:
ExcelColumn是單元格的列定義的實體類;
ExCelColumns是列的集合定義列。
ExcelStream 是防止NPOI釋放操作,因為NPOI2開始至今Response到浏覽器會出現錯誤,後來發現是因為內存釋放導致的。
NPOIExelHelper 是導入導出的調用方法。
幫助類的代碼不貼了,稍後傳上去各位自己下載,因當時開始的考慮與後來的考慮不一致導致代碼有部分重復,沒有做整理,諒解。
兩個導入節點配置,當然你也可以不用配置,那麼導入的第一行的單元格直接對應實體類的列或DataTable的表格。
<?xml version="1.0" encoding="utf-8" ?>
<root>
<Inbound>
<!--默認讀取節點-->
<row height="20" title="入庫SN信息" sheetname="sheet1" ignoreerr="false">
<column key="庫房所在地" name="WarehouseName" />
<column key="采購訂單號" name="PurchaseNumber"></column>
<column key="批次編號" name="BatchNumber" required="true"></column>
<column key="CODE" name="Code" required="true"></column>
<column key="序列號" name="SN" required="true"></column>
<column key="Configid/Bom" name="ConfigId"></column>
<column key="產品描述" name="ProductDescription"></column>
<column key="入庫數量" name="Amount"></column>
</row>
</Inbound>
<Outbound>
<row height="50" title="出庫SN信息" sheetname="sheet1" ignoreerr="false">
<column key="庫房所在地" name="WarehouseName" />
<column key="出庫單號" name="OutBoundNumber" required="true"></column>
<column key="合同號" name="ContractNumber"></column>
<column key="CODE" name="Code" required="true"></column>
<column key="序列號" name="SN" required="true"></column>
<column key="Configid/Bom" name="ConfigId"></column>
<column key="產品描述" name="ProductDescription"></column>
<column key="出庫數量" name="Amount"></column>
</row>
</Outbound>
</root>
其中ignoreerr是導入是是否忽略錯誤導入,一般只是否非空驗證錯誤。
required為此列是否非空驗證。
下面我們就做一個導入導出測試。因為本人不喜歡用DataTable,所以DataTable方式不做Demo。但是實體類裡面支持Dt導入導出。
首先,聲明實體類:
配置導入導出XML:
導入代碼:
導出代碼:
源碼地址:下載鏈接