使用NPOI组件完成的Excel导出导入(附源代码,测试通过)

8/3/2015来源:C#应用人气:4423

使用NPOI组件完成的Excel导出导入(附源代码,测试通过)

最近遇到一个Excel导入导出的问题,要支持winform和webform,这里我是一个认真严谨的coder,所以决定把这个记录下来!和大家一起分享一下!如果需要的同学可以下载哦!

对于NPOI这个组件,大家可能都了解了吧!如果不了解的同学,还是百度一下吧!不然后面不太看懂的。

1.我封装了这个类(ExcelHelper),该有的注释我也都加上了,希望大家可以看得懂!如果有什么bug,可以反馈到我的邮箱:[email protected]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.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都可以使用        /// <summary>读取excel        /// 根据索引读取Sheet表数据,默认读取第一个sheet        /// </summary>        /// <param name="strFileName">excel文档路径</param>        /// <param name="sheetIndex">sheet表的索引,从0开始</param>        /// <returns>数据集</returns>        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        /// <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 + "\\" + 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
View Code