zoukankan      html  css  js  c++  java
  • 使用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

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

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

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

  • 相关阅读:
    自动化测试初介
    接口测试初介
    常见测试面试过程及及问题解析
    hadoop伪分布式平台组件搭建
    使用Github搭建个人博客
    centos7中redis安装配置
    Hive安装配置
    hadoop大数据组件启动
    Java生成窗口
    正则语法
  • 原文地址:https://www.cnblogs.com/wohexiaocai/p/3529641.html
Copyright © 2011-2022 走看看