項目支持的環境:
.NETCORE Standard 2.0
本項目基於NPOI組件,實現對常規格式的excel導入導出封裝。
導出的excel格式,符合office格式,並非html格式的。
很多朋友應該都接觸過NPOI,但是寫一個導入導出,還是很繁瑣的,基於此,我們封裝了一個組件
請從nuget上搜索 KYSharpCore.NPOI
利用該組件,我們可以實現以下功能
數據導出:
支持DataTable的數據
支持匿名數組的數據
支持實體列表的數據
再導出時,本組件也支持一些單元格合併的處理,但是相對繁瑣,本文不做介紹。
數據導入:
支持從excel導入到DataTable
excel支持.xls和.xlsx 的格式
下面就介紹下如何使用
一、數據導出
首先,我們利用組件,將數據轉成符合的MemoryStream流,再處理流導出到文件。
對於控制檯程序和web項目來說,流導出的文件的處理方式有些不一樣。
1、DataTable數據源
直接看代碼,只要一行代碼,我們就可以將datatable數據源轉成符合excel格式的流
var sm = KYSharpCore.NPOI.Excel.Export(dt, true);
其中第二個參數爲 是否爲 xls格式,默認是true,false將導出.xlsx格式的文檔
public MemoryStream GetStream1() { DataTable dt = new DataTable(); dt.Columns.Add("姓名"); for(int i=0;i<10;i++) { DataRow dr = dt.NewRow(); dr[0] = "張" + i;
dt.Rows.Add(dr); } var sm = KYSharpCore.NPOI.Excel.Export(dt, true); return sm; }
2、匿名對象的數據源
public MemoryStream GetStream2() { var query = new[] { new { 姓名="張三"}, new { 姓名="李四"}, }; var sm = KYSharpCore.NPOI.Excel.Export(query, true); return sm; }
也是非常簡單,直接將數據源替換即可。
匿名對象一般用戶我們從數據庫獲取數據後,通過linq,將需要導出的字段重新組合爲一個數組。
如
3、實體對象數組
與匿名對象使用方式一樣,直接將實體的List對象作爲數據傳進去即可。
public MemoryStream GetStream3() { List<Student> list = new List<Student>() { new Student(){ Name="張三" }, new Student(){ Name="李四"} }; var sm = KYSharpCore.NPOI.Excel.Export(list, true); return sm; }
最後,我們分別看下在控制檯環境和web環境下如何導出文件
1、控制檯下,我們採用文件寫入的方式
public void GetFile(MemoryStream sm) { var buffer = sm.ToArray(); string outfile = @"e:\k8008\huangminghui\桌面\aa.xlsx"; //指定文件存儲路徑 using (FileStream fileStream = new FileStream(outfile, FileMode.OpenOrCreate, FileAccess.Write)) { fileStream.Write(buffer, 0, buffer.Length); } }
控制檯的方式,只能將文件寫入服務器上指定的目錄。
2、在web下,我們可以使用 FileResult 類型的輸出
public FileResult Export() { var sm = GetStream(); return File(sm.ToArray(), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "項目.xlsx"); }
web下,可利用這種方式直接導出到客戶端。
如果是寫入服務器上,採用控制檯的寫法即可。
上圖是利用GetStream1構造的數據導出的樣子
二、數據導入
數據導入是指讀取常規的excel文件,轉成DataTable對象,方便服務端對數據進行處理。
常規格式只不出現有合併列的情況,如果有合併,讀取的Datatable要特別處理方可。
我們提供了兩種處理方式,分別對應指定文件路徑和web端上傳的postfile對象
public static DataTable ExcelToDataTable(Stream sm, string p_tableName, int p_sheetIndex, bool isExcel2003 = true) public static DataTable ExcelToDataTable(string filepath, string p_tableName, int p_sheetIndex, bool isExcel2003 = true)
參數說明
sm:用於web端上傳的,通過postfile對象,獲取到的文件流
filepath:指定的文件路徑,此時文件需要在服務器上,不支持遠程下載
p_tableName:是指轉換後,設置的DataTable的Name屬性。可爲空
p_sheetIndex:指excel中的第幾個sheet,默認是0,第一個
isExcel2003:指定文件格式,如果是.xls格式,則爲true,否則爲false,默認爲true。
通過調用以上兩個方法,可以很快速的將常規的文檔轉成DataTable對象
方便後端進行處理。
該組件介紹就到這些了,謝謝閱讀。
更多分享,請大家關注我的個人公衆號: