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


    最近遇到一个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.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

    添加引用包

    Dll下载地址(http://download.csdn.net/detail/mryanghenglian/6873605

    这个压缩文件当中包含了需要添加的dll和ExcelHelper类,添加完毕后,就可以使用了,支持B/S和C/S的导入导出哦!希望大家可以喜欢

    测试程序项目下载地址

    http://download.csdn.net/detail/mryanghenglian/6873615

    小伙伴们如果觉得好,帮忙推荐一下!

    *****************************************************************

    将来的你一定会感激现在拼命的自己

  • 相关阅读:
    ASP.NET在禁用视图状态的情况下仍然使用ViewState对象【转】
    Atcoder Regular Contest 061 D Card Game for Three(组合数学)
    Solution 「CERC 2016」「洛谷 P3684」机棚障碍
    Solution 「CF 599E」Sandy and Nuts
    Solution 「洛谷 P6021」洪水
    Solution 「ARC 058C」「AT 1975」Iroha and Haiku
    Solution 「POI 2011」「洛谷 P3527」METMeteors
    Solution 「CF 1023F」Mobile Phone Network
    Solution 「SP 6779」GSS7
    Solution 「LOCAL」大括号树
  • 原文地址:https://www.cnblogs.com/wohexiaocai/p/3529641.html
Copyright © 2020-2023  润新知