最近遇到一个Excel导入导出的问题,要支持winform和webform,这里我是一个认真严谨的coder,所以决定把这个记录下来!和大家一起分享一下!如果需要的同学可以下载哦!
对于NPOI这个组件,大家可能都了解了吧!如果不了解的同学,还是百度一下吧!不然后面不太看懂的。
1.我封装了这个类(ExcelHelper),该有的注释我也都加上了,希望大家可以看得懂!如果有什么bug,可以反馈到我的邮箱:
自己做了一个简单的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都可以使用 ////// Excel转换成DataTable /// /// 文件路径 /// Excel中对应的sheet表单名称,如:sheet1,sheet2 ///数据集 [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Security", "CA2100:检查 SQL 查询是否存在安全漏洞")] public static DataTable ExcelToDataTable(string strExcelFileName, string strSheetName) { string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + strExcelFileName + ";" + "Extended Properties=Excel 5.0;"; string strExcel = string.Format("select * from [{0}$]", strSheetName); DataSet ds = new DataSet(); using (OleDbConnection conn = new OleDbConnection(strConn)) { conn.Open(); OleDbDataAdapter adapter = new OleDbDataAdapter(strExcel, strConn); adapter.Fill(ds, strSheetName); conn.Close(); return ds.Tables[strSheetName]; } } #endregion #region DataTable ExcelToDataTable(string strFileName, int sheetIndex = 0) 根据索引读取Sheet表数据,默认读取第一个sheet--B/S和C/S都可以使用 ///读取excel /// 根据索引读取Sheet表数据,默认读取第一个sheet /// /// excel文档路径 /// sheet表的索引,从0开始 ///数据集 public static DataTable ExcelToDataTable(string strFileName, int sheetIndex = 0) { DataTable dt = new DataTable(); HSSFWorkbook hssfworkbook = null; XSSFWorkbook xssfworkbook = null; string fileExt = Path.GetExtension(strFileName);//获取文件的后缀名 using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.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 ////// C/S Winform中DataGridView导出数据到Excel /// /// DataGridView控件名称 /// 保存的文件名称,默认没有,调用的时候最好加上,中英文都支持 /// 导出后是否打开文件和所在文件夹 /// 默认保存在“我的文档”中,可自定义保存的文件夹路径 /// Excel中第一行的标题文字,默认没有,可以自定义 /// Excel中列名的数组,默认绑定GridView的列名 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 + "\\" + saveFileName + ".xls"; if (System.IO.File.Exists(saveFullPath)) //验证文件重复性 { saveFullPath = saveFilePath + "\\" + 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); //打开文件夹 } } } #endregion
添加引用包
Dll下载地址(http://download.csdn.net/detail/mryanghenglian/6873605)
这个压缩文件当中包含了需要添加的dll和ExcelHelper类,添加完毕后,就可以使用了,支持B/S和C/S的导入导出哦!希望大家可以喜欢
测试程序项目下载地址
小伙伴们如果觉得好,帮忙推荐一下!
*****************************************************************
将来的你一定会感激现在拼命的自己