使用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

小伙伴們如果覺得好,幫忙推薦一下!

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

將來的你一定會感激現在拼命的自己


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM