NPOI導出Excel和基於office導出Excel比較


首先介紹一下NPOI吧。

NPOI 是  POI 項目的 .NET 版本。POI是一個開源的Java讀寫Excel、WORD等微軟OLE2組件文檔的項目。
使用 NPOI 你就可以在沒有安裝 Office 或者相應環境的機器上對 WORD/EXCEL 文檔進行讀寫。 NPOI是構建在 POI 3.x版本之上的,它可以在沒有安裝 Office的情況下對 Word/Excel文檔進行讀寫操作。
 
NPOI的優勢:
(一)傳統操作Excel遇到的問題:
1、如果是.NET,需要在服務器端裝Office,且及時更新它,以防漏洞,還需要設定權限允許.NET訪問COM+,如果在導出過程中出問題可能導致服務器宕機。
2、Excel會把只包含數字的列進行類型轉換,本來是文本型的,Excel會將其轉成數值型的,比如編號000123會變成123。
3、導出時,如果字段內容以“-”或“=”開頭,Excel會把它當成公式進行,會報錯。
4、Excel會根據Excel文件前8行分析數據類型,如果正好你前8行某一列只是數字,那它會認為該列為數值型,自動將該列轉變成類似1.42702E+17格式,日期列變成包含日期和數字的。
(二)使用NPOI的優勢
1、你不需要在服務器上安裝微軟的Office,可以避免版權問題。
2、使用起來比Office PIAAPI更加方便,更人性化。
3、你不用去花大力氣維護NPOINPOI Team會不斷更新、改善NPOI,絕對省成本。
 
基於office導出到Excel實現:
 public static void ExportExcel(string fileName, DataGridView myDGV,bool isShowDialog)
       {
           string saveFileName = "";
           if (isShowDialog)
           {
               //bool fileSaved = false;
               SaveFileDialog saveDialog = new SaveFileDialog();
               saveDialog.DefaultExt = "xls";
               saveDialog.Filter = "Excel文件|*.xls";
               saveDialog.FileName = fileName;
               saveDialog.ShowDialog();
               saveFileName = saveDialog.FileName;
               if (saveFileName.IndexOf(":") < 0) return; //被點了取消 
           }
           else
           {
              // saveFileName = Application.StartupPath + @"\導出記錄\" + fileName + ".xls";
               saveFileName = fileName;
           }
           Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
           if (xlApp == null)
           {
               MessageBox.Show("無法創建Excel對象,可能您的機子未安裝Excel");
               return;
           }

           Microsoft.Office.Interop.Excel.Workbooks workbooks = xlApp.Workbooks;
           Microsoft.Office.Interop.Excel.Workbook workbook = workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);
           Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];//取得sheet1 

           //寫入標題
           for (int i = 0; i < myDGV.ColumnCount; i++)
           {
               worksheet.Cells[1, i + 1] = myDGV.Columns[i].HeaderText;
           }
           //寫入數值
           for (int r = 0; r < myDGV.Rows.Count; r++)
           {
               for (int i = 0; i < myDGV.ColumnCount; i++)
               {
                   if (myDGV[i, r].ValueType == typeof(string)
                      || myDGV[i, r].ValueType == typeof(DateTime))//這里就是驗證DataGridView單元格中的類型,如果是string或是DataTime類型,則在放入緩 存時在該內容前加入" ";
                   {
                       worksheet.Cells[r + 2, i + 1] = "'" + myDGV.Rows[r].Cells[i].Value;
                   }
                   else
                   {
                       worksheet.Cells[r + 2, i + 1] = myDGV.Rows[r].Cells[i].Value;
                   }
               }
               System.Windows.Forms.Application.DoEvents();
           }
           worksheet.Columns.EntireColumn.AutoFit();//列寬自適應
           //if (Microsoft.Office.Interop.cmbxType.Text != "Notification")
           //{
           //    Excel.Range rg = worksheet.get_Range(worksheet.Cells[2, 2], worksheet.Cells[ds.Tables[0].Rows.Count + 1, 2]);
           //    rg.NumberFormat = "00000000";
           //}

           if (saveFileName != "")
           {
               try
               {
                   workbook.Saved = true;
                   workbook.SaveCopyAs(saveFileName);
                   //fileSaved = true;
               }
               catch (Exception ex)
               {
                   //fileSaved = false;
                   MessageBox.Show("導出文件時出錯,文件可能正被打開!\n" + ex.Message);
               }

           }
           //else
           //{
           //    fileSaved = false;
           //}
           xlApp.Quit();
           GC.Collect();//強行銷毀 
           // if (fileSaved && System.IO.File.Exists(saveFileName)) System.Diagnostics.Process.Start(saveFileName); //打開EXCEL
           MessageBox.Show(fileName + "保存成功", "提示", MessageBoxButtons.OK);
       }

 NPOI導出到Excel表實現:

/// <summary>
        /// NPOI導出Excel,不依賴本地是否裝有Excel,導出速度快
        /// </summary>
        /// <param name="dataGridView1">要導出的dataGridView控件</param>
        /// <param name="sheetName">sheet表名</param>
        public static void ExportToExcel(DataGridView dataGridView1, string sheetName)
        {
            SaveFileDialog fileDialog = new SaveFileDialog();
            fileDialog.Filter = "Excel|*.xls";
            if (fileDialog.ShowDialog() == System.Windows.Forms.DialogResult.Cancel)
            {
                return;
            }
            //不允許dataGridView顯示添加行,負責導出時會報最后一行未實例化錯誤
            dataGridView1.AllowUserToAddRows = false;
            HSSFWorkbook workbook = new HSSFWorkbook();
            ISheet sheet = workbook.CreateSheet(sheetName);
            IRow rowHead = sheet.CreateRow(0);

            //填寫表頭
            for (int i = 0; i < dataGridView1.Columns.Count; i++)
            {
                rowHead.CreateCell(i, CellType.STRING).SetCellValue(dataGridView1.Columns[i].HeaderText.ToString());
            }
            //填寫內容
            for (int i = 0; i < dataGridView1.Rows.Count; i++)
            {
                IRow row = sheet.CreateRow(i + 1);
                for (int j = 0; j < dataGridView1.Columns.Count; j++)
                {
                    row.CreateCell(j, CellType.STRING).SetCellValue(dataGridView1.Rows[i].Cells[j].Value.ToString());
                }
            }          

            using (FileStream stream = File.OpenWrite(fileDialog.FileName))
            {
                workbook.Write(stream);
                stream.Close();
            }
            MessageBox.Show("導出數據成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            GC.Collect();
        }

  經過比較:如果導出50000條int類型的數據,基於office導出需要10分鍾左右的時間,NPOI導出則需要3秒鍾左右的時間。

 

  NPOI導出時間截圖如下:

 

 

基於office導出時間截圖如下:

 

呵呵,看出來兩者的速度了吧,並且NPOI用起來相當的靈活,第一次寫博客,希望和大家共同分享,共同學習,共同進步!

 

PS:提供大家一個游戲試玩平台,有興趣的可以進去看下喲!http://www.juxiangyou.com/r4357700


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM