最近遇到一個Excel導入導出的問題,要支持winform和webform,這里我是一個認真嚴謹的coder,所以決定把這個記錄下來!和大家一起分享一下!如果需要的同學可以下載哦!
對于NPOI這個組件,大家可能都了解了吧!如果不了解的同學,還是百度一下吧!不然后面不太看懂的。
1.我封裝了這個類(ExcelHelper),該有的注釋我也都加上了,希望大家可以看得懂!如果有什么bug,可以反饋到我的郵箱:707055073@QQ.com

自己做了一個簡單的winform的小程序,主要就是Excel的導入和導出,大家可以下載看一下
方法解釋說明
ExcelToDataTable()--Excel轉換成DataTable--B/S和C/S都可以使用
ExcelToDataTable()--根據索引讀取Sheet表數據,默認讀取第一個sheet--B/S和C/S都可以使用
DataGridViewToExcel()--DataGridView導出到Excel文件--C/S

#region ExcelToDataTable(string strExcelFileName, string strSheetName) Excel轉換成DataTable--B/S和C/S都可以使用 /// <summary> /// Excel轉換成DataTable /// </summary> /// <param name="strExcelFileName">文件路徑</param> /// <param name="strSheetName">Excel中對應的sheet表單名稱,如:sheet1,sheet2</param> /// <returns>數據集</returns> [System.Diagnostics.CodeAnalysis.Supaccess.Read)) { if (fileExt == ".xls") hssfworkbook = new HSSFWorkbook(file); else if (fileExt == ".xlsx") xssfworkbook = new XSSFWorkbook(file);//初始化太慢了,不知道這是什么bug } if (hssfworkbook != null) { HSSFSheet sheet = (HSSFSheet)hssfworkbook.GetSheetAt(sheetIndex); if (sheet != null) { System.Collections.IEnumerator rows = sheet.GetRowEnumerator(); HSSFRow headerRow = (HSSFRow)sheet.GetRow(0); int cellCount = headerRow.LastCellNum; for (int j = 0; j < cellCount; j++) { HSSFCell cell = (HSSFCell)headerRow.GetCell(j); dt.Columns.Add(cell.ToString()); } for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++) { HSSFRow row = (HSSFRow)sheet.GetRow(i); DataRow dataRow = dt.NewRow(); for (int j = row.FirstCellNum; j < cellCount; j++) { if (row.GetCell(j) != null) dataRow[j] = row.GetCell(j).ToString(); } dt.Rows.Add(dataRow); } } } else if (xssfworkbook != null) { XSSFSheet xSheet = (XSSFSheet)xssfworkbook.GetSheetAt(sheetIndex); if (xSheet != null) { System.Collections.IEnumerator rows = xSheet.GetRowEnumerator(); XSSFRow headerRow = (XSSFRow)xSheet.GetRow(0); int cellCount = headerRow.LastCellNum; for (int j = 0; j < cellCount; j++) { XSSFCell cell = (XSSFCell)headerRow.GetCell(j); dt.Columns.Add(cell.ToString()); } for (int i = (xSheet.FirstRowNum + 1); i <= xSheet.LastRowNum; i++) { XSSFRow row = (XSSFRow)xSheet.GetRow(i); DataRow dataRow = dt.NewRow(); for (int j = row.FirstCellNum; j < cellCount; j++) { if (row.GetCell(j) != null) dataRow[j] = row.GetCell(j).ToString(); } dt.Rows.Add(dataRow); } } } return dt; } #endregion #region DataGridViewToExcel(DataGridView myDgv, string strHeaderText, string strFileName) DataGridView導出到Excel文件--C/S /// <summary> /// C/S Winform中DataGridView導出數據到Excel /// </summary> /// <param name="myDgv">DataGridView控件名稱</param> /// <param name="saveFileName">保存的文件名稱,默認沒有,調用的時候最好加上,中英文都支持</param> /// <param name="isOpen">導出后是否打開文件和所在文件夾</param> /// <param name="saveFilePath">默認保存在“我的文檔”中,可自定義保存的文件夾路徑</param> /// <param name="strHeaderText">Excel中第一行的標題文字,默認沒有,可以自定義</param> /// <param name="titleNames">Excel中列名的數組,默認綁定GridView的列名</param> public static void DataGridViewToExcel(DataGridView myDgv, string saveFileName = null, bool isOpen = false, string saveFilePath = null, string strHeaderText = null, string[] titleNames = null) { using (MemoryStream ms = DataGridViewToExcel(myDgv, strHeaderText, titleNames)) { if (string.IsNullOrEmpty(saveFileName)) //文件名為空 { saveFileName = DateTime.Now.Ticks.ToString(); } if (string.IsNullOrEmpty(saveFilePath) || !System.IO.Directory.Exists(saveFilePath)) //保存路徑為空或者不存在 { saveFilePath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); //默認在文檔文件夾中 } string saveFullPath = saveFilePath + "http://" + saveFileName + ".xls"; if (System.IO.File.Exists(saveFullPath)) //驗證文件重復性 { saveFullPath = saveFilePath + "http://" + saveFileName + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss").Replace(":", "-").Replace(" ", "-") + ".xls"; } using (FileStream fs = new FileStream(saveFullPath, FileMode.Create, FileAccess.Write)) { byte[] data = ms.ToArray(); fs.Write(data, 0, data.Length); fs.Flush(); } if (isOpen) { Process.Start(saveFullPath); //打開文件 Process.Start(saveFilePath); //打開文件夾 } } } #endregionView Code
新聞熱點
疑難解答