首先介紹一下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 PIA的API更加方便,更人性化。
3、你不用去花大力氣維護NPOI,NPOI 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