EPPlus導(dǎo)出Excel

EPPlus主頁(yè)
EPPlus源碼
需求:將xml文件中的數(shù)據(jù)導(dǎo)出成Excel
數(shù)據(jù)量在幾十萬(wàn)吧
xml的數(shù)據(jù)大致如下結(jié)構(gòu)

<?xml version="1.0" standalone="yes"?>
<newDataSet>
  <DataTable1>
    <datacolumn1>001</datacolumn1>
    <datacolumn2>a1</datacolumn2>
    <datacolumn3>b1</datacolumn3>
    <datacolumn4>c1</datacolumn4>
  </DataTable1>
...
  <DataTable1>
    <datacolumn1>001</datacolumn1>
    <datacolumn2>an</datacolumn2>
    <datacolumn3>bn</datacolumn3>
    <datacolumn4>cn</datacolumn4>
  </DataTable1>

<DataTable2>
    <datacolumn1>001</datacolumn1>
    <datacolumn2>a1</datacolumn2>
    <datacolumn3>b1</datacolumn3>
    <datacolumn4>c1</datacolumn4>
    <datacolumn5>d1</datacolumn5>
    <datacolumn6>e1</datacolumn6>
  </DataTable2>
...
  <DataTable2>
    <datacolumn1>001</datacolumn1>
    <datacolumn2>an</datacolumn2>
    <datacolumn3>bn</datacolumn3>
    <datacolumn4>cn</datacolumn4>
    <datacolumn5>dn</datacolumn5>
    <datacolumn6>en</datacolumn6>
  </DataTable2>
...
</newDataSet>

導(dǎo)出Excel的代碼如下:

        static void Main(string[] args)
        {
            System.Data.DataSet ds = new System.Data.DataSet();
            ds.ReadXml("D:\\Data_20180525170650.xml");
            ExportEasy(ds, "D:\\Excel" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xlsx");
            Console.Write("OK");
            Console.ReadKey();
        }

        /// <summary>
        /// 導(dǎo)出EXCEL,可以導(dǎo)出多個(gè)sheet .xsl
        /// </summary>
        /// <param name="dtSources">原始數(shù)據(jù)數(shù)</param>
        /// <param name="strFileName">路徑</param>
        public static void ExportEasy(System.Data.DataSet dtSources, string strFileName)
        {            
            FileInfo file = new FileInfo(strFileName);
            if (file.Exists)
            {
                file.Delete();
                file = new FileInfo(strFileName);
            }
            if (dtSources != null && dtSources.Tables != null && dtSources.Tables.Count > 0)
            {
                using (var package = new ExcelPackage(file))
                {
                    int count = dtSources.Tables.Count;
                    for (int i = 0; i < count; i++)
                    {
                        DataTable dt = dtSources.Tables[i];
                        string sheetName = string.IsNullOrEmpty(dt.TableName) ? string.Format("sheet{0}", i + 1) : dt.TableName;
                        Stream s =  DataTableToExcel(dt,sheetName);
                        ExcelPackage p=new ExcelPackage(s);
                        p.SaveAs(file);
                    }
                }
            }
        }
       
        
        public static Stream DataTableToExcel(FileInfo file, DataTable dt, string sheetName)
        {
            try
            {
                using (var package = new ExcelPackage(file))
                {
                    ExcelWorksheet worksheet = package.Workbook.Worksheets.Add(sheetName);                    
                    worksheet.Cells["A1"].LoadFromDataTable(dt, true);
                    MemoryStream ms = new MemoryStream();
                    package.SaveAs(ms);
                    ms.Flush();
                    ms.Position = 0;
                    return ms;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

這段代碼其實(shí)有很大的性能消耗問(wèn)題,因?yàn)镾aveAs寫(xiě)在了循環(huán)的內(nèi)部,一次SaveAs就是一次IO,IO是特別耗能的一種操作。
其次,F(xiàn)ile對(duì)象本身就已經(jīng)可以判斷指定路徑的文件是否存在,無(wú)需創(chuàng)建FileInfo對(duì)象后再去判斷。
修改后的代碼如下:

        static void Main(string[] args)
        {
            System.Data.DataSet ds = new System.Data.DataSet();
            ds.ReadXml("D:\\Data_20180525170650.xml");
            ExportEasy(ds, "D:\\Excel" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xlsx");
            Console.Write("OK");
            Console.ReadKey();
        }

        /// <summary>
        /// 導(dǎo)出EXCEL,可以導(dǎo)出多個(gè)sheet .xsl
        /// </summary>
        /// <param name="dtSources">原始數(shù)據(jù)</param>
        /// <param name="strFileName">路徑</param>
        public static void ExportEasy(System.Data.DataSet dtSources, string strFileName)
        {
            if (File.Exists(strFileName)) File.Delete(strFileName);
            FileInfo file = new FileInfo(strFileName);           
            if (dtSources != null && dtSources.Tables != null && dtSources.Tables.Count > 0)
            {
                using (var package = new ExcelPackage(file))
                {
                    int count = dtSources.Tables.Count;
                    for (int i = 0; i < count; i++)
                    {
                        DataTable dt = dtSources.Tables[i];
                        string sheetName = string.IsNullOrEmpty(dt.TableName) ? string.Format("sheet{0}", i + 1) : dt.TableName;
                        ExcelWorksheet worksheet = package.Workbook.Worksheets.Add(sheetName);
                        worksheet.Cells["A1"].LoadFromDataTable(dt, true);                        
                    }
                    package.SaveAs(file);
                }
            }
        }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Step1當(dāng)然是在Nuget下載EPPPlus,然后引入: using OfficeOpenXml; Step2直...
    EvanWay閱讀 3,577評(píng)論 3 3
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,045評(píng)論 25 709
  • 人總會(huì)在一些時(shí)刻,莫名地想念一些人一些事。而外婆,是無(wú)數(shù)次晃動(dòng)的影像。無(wú)論是夜半無(wú)人或觥籌交錯(cuò)之時(shí)。 譬如此刻,難...
    彧忞君閱讀 518評(píng)論 2 5
  • “原來(lái)她是這樣的人”,“身為老師,她怎么能做這樣的事”,“原來(lái)她是這么卑微的”,“原來(lái)……”辦公室里傳來(lái)老師們竊...
    雪櫻思薰XYSX閱讀 525評(píng)論 4 10
  • G288小組成員: 一本萬(wàn)利-295 叁一叁-275 dxljy-112 用心追隨心-288 曌影-24 《亞迪斯...
    dxljy閱讀 241評(píng)論 5 5

友情鏈接更多精彩內(nèi)容