NETCORE 服務端EXCEL導入導出的分享

項目支持的環境:
.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對象

方便後端進行處理。

 

該組件介紹就到這些了,謝謝閱讀。

 

更多分享,請大家關注我的個人公衆號:

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章