C#處理Excel的幫助類


目錄

 


 

前言

最近需要對Excel進行加密解密操作,本身是一個簡單的事情,通過 OleDbConnection可以很容易進行操作Excel,或者也可以用第三方dll如NPOI進行操作。

 

OleDb

用OleDb方法幾乎和SqlConnection一模一樣,基本上把前綴Sql改成OleDb即可,不過有幾個小細節需要注意。
1. 我們可以把一個Excel當成一個數據源
2. 每個sheet可以看成一張表
3. 需要注意的是你在Excel看到的sheet名稱后面需要加上$才是真正的sheet名字。

 

具體操作

我在此簡單封裝了下,取名為OleDbHelper,代碼如下:

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.OleDb;
namespace ExcelDataEncipher
{
    class OleDbHelper
    {
        private readonly string _connstr;
        //當前Sheet集合
        public IEnumerable<string> SheetNames { get; set; }
        //通過在外部傳入數據源的名稱來連接
        public OleDbHelper(string name)
        {
            _connstr = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='Excel 8.0;ReadOnly=False;HDR=Yes;'", name);
            //這個連接串可以連接2003的,高版本Excel的連接串可能有所變化,由於我需要進行加密解密操作需要修改excel,所以ReadOnly設置為false 
            //同時HDR設置為Yes代表第一行是標題,不做為數據使用 
            this.GetSheetName();//獲取所有Sheet名稱
        }
        private void GetSheetName()
        {
            using (OleDbConnection conn = new OleDbConnection(_connstr))
            {
                conn.Open();
                using (DataTable dtSheetName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] {null, null, null, "Table"}))
                {
                    //包含excel中表名的字符串數組  
                    if (dtSheetName != null)
                    {
                        List<string> strTableNames = new List<string>();
                        for (int k = 0; k < dtSheetName.Rows.Count; k++)
                        {
                            strTableNames.Add(dtSheetName.Rows[k]["TABLE_NAME"].ToString());
                        }//獲取Sheet名稱
                        SheetNames = strTableNames;
                    }
                }
            }
        }
        public int ExecuteNonQuery(string oleDb, 
            params OleDbParameter[] parameters)
        {
            using (OleDbConnection conn = new OleDbConnection(_connstr))
            {
                conn.Open();
                using (OleDbCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText = oleDb;
                    cmd.Parameters.AddRange(parameters);
                    return cmd.ExecuteNonQuery();
                }
            }
        }
        public object ExecuteScalar(string oleDb,
            params OleDbParameter[] parameters)
        {
            using (OleDbConnection conn = new OleDbConnection(_connstr))
            {
                conn.Open();
                using (OleDbCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText = oleDb;
                    cmd.Parameters.AddRange(parameters);
                    return cmd.ExecuteScalar();
                }
            }
        }
        public DataTable ExecuteDataTable(string oleDb,
            params OleDbParameter[] parameters)
        {
            using (OleDbConnection conn = new OleDbConnection(_connstr))
            {
                conn.Open();
                using (OleDbCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText = oleDb;
                    cmd.Parameters.AddRange(parameters);
                    DataSet dataset = new DataSet();
                    OleDbDataAdapter adapter = new OleDbDataAdapter(cmd);
                    adapter.Fill(dataset);
                    return dataset.Tables[0];
                }
            }
        }
        public static object FromDbValue(object value)
        {
            if (value == DBNull.Value)
            {
                return null;
            }
            else
            {
                return value;
            }
        }
        public static object ToDbValue(object value)
        {
            if (value == null)
            {
                return DBNull.Value;
            }
            else
            {
                return value;
            }
        }
    }
}

 

可以發現操作和對數據庫操作一模一樣

我通過OpenFileDialog選擇需要操作的文件

foreach (var filename in openFile.FileNames)
{
    string name = filename;
    _oleDbHelper = new OleDbHelper(name); //獲取表
    string sheetName = _oleDbHelper.SheetNames.SingleOrDefault(s => s.Contains("Detail"));//查看名稱是否包含Detail的sheet
    DataTable table = null;
    try
    {
        table = _oleDbHelper.ExecuteDataTable(string.Format("select * from [{0}]", sheetName));//將其轉換為datatable
    }
    catch (Exception msg)
    {
        throw new Exception(msg.Message);
    }
    if (table.Rows.Count < 0)
    {
        MessageBox.Show("未找到任何記錄");
        return;
    }
    for (int i = 0; i < table.Rows.Count; i++)
    {
        ...//處理數據
        try
        {
            ...//處理數據
            _oleDbHelper.ExecuteNonQuery(
                string.Format(
                    "update [{0}] set [AccountNumber] = '{1}',[AccountName] = '{2}',[Price] = '{3}' where [Id] = '{4}'",
                    sheetName, table.Rows[i]["AccountNumber"], table.Rows[i]["AccountName"], table.Rows[i]["Price"],
                    table.Rows[i]["Id"]));
            //更新excel
        }
        catch (Exception msg)
        {
            throw new Exception(msg.Message);
        }
    }
}

 

本來通過參數化的形式進行更新,但是一直報錯,不知道什么情況
通過OleDb修改excel速度非常的慢,我的excel表 5行28列需要修改其中3列的數據需要1秒多,不知道是不是因為更新一個表格他會刷新整張excel還是為什么

 

NPOI

因為速度實在太慢,我不得不尋找其他的解決方法
NPOI是一個開源的讀寫Excel、Word等項目,他的優點是不需要在機子上安裝office也可以進行操作,而且讀寫速度還是非常快的。

 

具體操作

這里我在網上下載了別人的封裝好的一個幫助類,略做了修改來適配我的項目:

/*******************************************************************
 * 版權所有: 
 * 類 名 稱:ExcelHelper
 * 作    者:zk
 * 電子郵箱: 
 * 創建日期:2012/2/25 10:17:21 
 * 修改描述:從excel導入datatable時,可以導入日期類型。
 *           但對excel中的日期類型有一定要求,要求至少是yyyy/mm/dd類型日期; *           
 * 修改描述:將datatable導入excel中,對類型為字符串的數字進行處理,
 *           導出數字為double類型;
 * 
 * 
 * *******************************************************************/
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using NPOI.HSSF.UserModel;
using NPOI.SS.Formula.Eval;
using NPOI.SS.UserModel;
using NPOI.SS.Util;
namespace ExcelDataEncipher
{
    public static class ExcelHelper
    {
        //private static WriteLog wl = new WriteLog();a
        #region 從datatable中將數據導出到excel
        /// <summary>
        /// DataTable導出到Excel的MemoryStream
        /// </summary>
        /// <param name="dtSource">源DataTable</param>
        /// <param name="strHeaderText">表頭文本</param>
        public static MemoryStream ExportDT(DataTable dtSource, string strHeaderText)
        {
            HSSFWorkbook workbook = new HSSFWorkbook();
            HSSFSheet sheet = workbook.CreateSheet() as HSSFSheet;
            #region 右擊文件 屬性信息
            //{
            //    DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();
            //    dsi.Company = "http://www.yongfa365.com/";
            //    workbook.DocumentSummaryInformation = dsi;
            //    SummaryInformation si = PropertySetFactory.CreateSummaryInformation();
            //    si.Author = "柳永法"; //填加xls文件作者信息
            //    si.ApplicationName = "NPOI測試程序"; //填加xls文件創建程序信息
            //    si.LastAuthor = "柳永法2"; //填加xls文件最后保存者信息
            //    si.Comments = "說明信息"; //填加xls文件作者信息
            //    si.Title = "NPOI測試"; //填加xls文件標題信息
            //    si.Subject = "NPOI測試Demo"; //填加文件主題信息
            //    si.CreateDateTime = DateTime.Now;
            //    workbook.SummaryInformation = si;
            //}
            #endregion
            HSSFCellStyle dateStyle = workbook.CreateCellStyle() as HSSFCellStyle;
            HSSFDataFormat format = workbook.CreateDataFormat() as HSSFDataFormat;
            dateStyle.DataFormat = format.GetFormat("yyyy-mm-dd");
            //取得列寬
            int[] arrColWidth = new int[dtSource.Columns.Count];
            foreach (DataColumn item in dtSource.Columns)
            {
                arrColWidth[item.Ordinal] = Encoding.GetEncoding(936).GetBytes(item.ColumnName.ToString()).Length;
            }
            for (int i = 0; i < dtSource.Rows.Count; i++)
            {
                for (int j = 0; j < dtSource.Columns.Count; j++)
                {
                    int intTemp = Encoding.GetEncoding(936).GetBytes(dtSource.Rows[i][j].ToString()).Length;
                    if (intTemp > arrColWidth[j])
                    {
                        arrColWidth[j] = intTemp;
                    }
                }
            }
            int rowIndex = 0;
            foreach (DataRow row in dtSource.Rows)
            {
                #region 新建表,填充表頭,填充列頭,樣式
                if (rowIndex == 65535 || rowIndex == 0)
                {
                    if (rowIndex != 0)
                    {
                        sheet = workbook.CreateSheet() as HSSFSheet;
                    }
                    #region 表頭及樣式
                    {
                        HSSFRow headerRow = sheet.CreateRow(0) as HSSFRow;
                        headerRow.HeightInPoints = 25;
                        headerRow.CreateCell(0).SetCellValue(strHeaderText);
                        HSSFCellStyle headStyle = workbook.CreateCellStyle() as HSSFCellStyle;
                        headStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
                        HSSFFont font = workbook.CreateFont() as HSSFFont;
                        font.FontHeightInPoints = 20;
                        font.Boldweight = 700;
                        headStyle.SetFont(font);
                        headerRow.GetCell(0).CellStyle = headStyle;
                        sheet.AddMergedRegion(new Region(0, 0, 0, dtSource.Columns.Count - 1));
                        //headerRow.Dispose();
                    }
                    #endregion
                    #region 列頭及樣式
                    {
                        HSSFRow headerRow = sheet.CreateRow(1) as HSSFRow;
                        HSSFCellStyle headStyle = workbook.CreateCellStyle() as HSSFCellStyle;
                        headStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
                        HSSFFont font = workbook.CreateFont() as HSSFFont;
                        font.FontHeightInPoints = 10;
                        font.Boldweight = 700;
                        headStyle.SetFont(font);
                        foreach (DataColumn column in dtSource.Columns)
                        {
                            headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
                            headerRow.GetCell(column.Ordinal).CellStyle = headStyle;
                            //設置列寬
                            sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + 1) * 256);
                        }
                        //headerRow.Dispose();
                    }
                    #endregion
                    rowIndex = 2;
                }
                #endregion
                #region 填充內容
                HSSFRow dataRow = sheet.CreateRow(rowIndex) as HSSFRow;
                foreach (DataColumn column in dtSource.Columns)
                {
                    HSSFCell newCell = dataRow.CreateCell(column.Ordinal) as HSSFCell;
                    string drValue = row[column].ToString();
                    switch (column.DataType.ToString())
                    {
                        case "System.String": //字符串類型
                            double result;
                            if (isNumeric(drValue, out result))
                            {
                                double.TryParse(drValue, out result);
                                newCell.SetCellValue(result);
                                break;
                            }
                            else
                            {
                                newCell.SetCellValue(drValue);
                                break;
                            }
                        case "System.DateTime": //日期類型
                            DateTime dateV;
                            DateTime.TryParse(drValue, out dateV);
                            newCell.SetCellValue(dateV);
                            newCell.CellStyle = dateStyle; //格式化顯示
                            break;
                        case "System.Boolean": //布爾型
                            bool boolV = false;
                            bool.TryParse(drValue, out boolV);
                            newCell.SetCellValue(boolV);
                            break;
                        case "System.Int16": //整型
                        case "System.Int32":
                        case "System.Int64":
                        case "System.Byte":
                            int intV = 0;
                            int.TryParse(drValue, out intV);
                            newCell.SetCellValue(intV);
                            break;
                        case "System.Decimal": //浮點型
                        case "System.Double":
                            double doubV = 0;
                            double.TryParse(drValue, out doubV);
                            newCell.SetCellValue(doubV);
                            break;
                        case "System.DBNull": //空值處理
                            newCell.SetCellValue("");
                            break;
                        default:
                            newCell.SetCellValue("");
                            break;
                    }
                }
                #endregion
                rowIndex++;
            }
            using (MemoryStream ms = new MemoryStream())
            {
                workbook.Write(ms);
                ms.Flush();
                ms.Position = 0;
                return ms;
            }
        }
        /// <summary>
        /// DataTable導出到Excel文件
        /// </summary>
        /// <param name="dtSource">源DataTable</param>
        /// <param name="strHeaderText">表頭文本</param>
        /// <param name="strFileName">保存位置</param>
        public static void ExportDTtoExcel(DataTable dtSource, string strHeaderText, string strFileName)
        {
            using (MemoryStream ms = ExportDT(dtSource, strHeaderText))
            {
                using (FileStream fs = new FileStream(strFileName, FileMode.Create, FileAccess.Write))
                {
                    byte[] data = ms.ToArray();
                    fs.Write(data, 0, data.Length);
                    fs.Flush();
                }
            }
        }
        #endregion
        #region 從excel中將數據導出到datatable
        /// <summary>讀取excel
        /// 默認第一行為標頭
        /// </summary>
        /// <param name="strFileName">excel文檔路徑</param>
        /// <returns></returns>
        public static DataTable ImportExceltoDt(string strFileName,string sheetName,bool includeTitle = true)
        {
            DataTable dt = new DataTable();
            HSSFWorkbook hssfworkbook;
            using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read))
            {
                hssfworkbook = new HSSFWorkbook(file);
            }
            HSSFSheet sheet = hssfworkbook.GetSheet(sheetName) as HSSFSheet;
            if (sheet == null) return null;
            dt = ImportDt(sheet, 0, includeTitle);
            return dt;
        }
        /// <summary>
        /// 讀取excel
        /// </summary>
        /// <param name="strFileName">excel文件路徑</param>
        /// <param name="sheet">需要導出的sheet</param>
        /// <param name="HeaderRowIndex">列頭所在行號,-1表示沒有列頭</param>
        /// <returns></returns>
        public static DataTable ImportExceltoDt(string strFileName, string SheetName, int HeaderRowIndex)
        {
            HSSFWorkbook workbook;
            using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read))
            {
                workbook = new HSSFWorkbook(file);
            }
            HSSFSheet sheet = workbook.GetSheet(SheetName) as HSSFSheet;
            DataTable table = new DataTable();
            table = ImportDt(sheet, HeaderRowIndex, true);
            //ExcelFileStream.Close();
            workbook = null;
            sheet = null;
            return table;
        }
        /// <summary>
        /// 讀取excel
        /// </summary>
        /// <param name="strFileName">excel文件路徑</param>
        /// <param name="sheet">需要導出的sheet序號</param>
        /// <param name="HeaderRowIndex">列頭所在行號,-1表示沒有列頭</param>
        /// <returns></returns>
        public static DataTable ImportExceltoDt(string strFileName, int SheetIndex, int HeaderRowIndex)
        {
            HSSFWorkbook workbook;
            using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read))
            {
                workbook = new HSSFWorkbook(file);
            }
            HSSFSheet sheet = workbook.GetSheetAt(SheetIndex) as HSSFSheet;
            DataTable table = new DataTable();
            table = ImportDt(sheet, HeaderRowIndex, true);
            //ExcelFileStream.Close();
            workbook = null;
            sheet = null;
            return table;
        }
        /// <summary>
        /// 讀取excel
        /// </summary>
        /// <param name="strFileName">excel文件路徑</param>
        /// <param name="sheet">需要導出的sheet</param>
        /// <param name="HeaderRowIndex">列頭所在行號,-1表示沒有列頭</param>
        /// <returns></returns>
        public static DataTable ImportExceltoDt(string strFileName, string SheetName, int HeaderRowIndex, bool needHeader)
        {
            HSSFWorkbook workbook;
            using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read))
            {
                workbook = new HSSFWorkbook(file);
            }
            HSSFSheet sheet = workbook.GetSheet(SheetName) as HSSFSheet;
            DataTable table = new DataTable();
            table = ImportDt(sheet, HeaderRowIndex, needHeader);
            //ExcelFileStream.Close();
            workbook = null;
            sheet = null;
            return table;
        }
        /// <summary>
        /// 讀取excel
        /// </summary>
        /// <param name="strFileName">excel文件路徑</param>
        /// <param name="sheet">需要導出的sheet序號</param>
        /// <param name="HeaderRowIndex">列頭所在行號,-1表示沒有列頭</param>
        /// <returns></returns>
        public static DataTable ImportExceltoDt(string strFileName, int SheetIndex, int HeaderRowIndex, bool needHeader)
        {
            HSSFWorkbook workbook;
            using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read))
            {
                workbook = new HSSFWorkbook(file);
            }
            HSSFSheet sheet = workbook.GetSheetAt(SheetIndex) as HSSFSheet;
            DataTable table = new DataTable();
            table = ImportDt(sheet, HeaderRowIndex, needHeader);
            //ExcelFileStream.Close();
            workbook = null;
            sheet = null;
            return table;
        }
        /// <summary>
        /// 將制定sheet中的數據導出到datatable中
        /// </summary>
        /// <param name="sheet">需要導出的sheet</param>
        /// <param name="HeaderRowIndex">列頭所在行號,-1表示沒有列頭</param>
        /// <returns></returns>
        static DataTable ImportDt(HSSFSheet sheet, int HeaderRowIndex, bool needHeader)
        {
            DataTable table = new DataTable();
            HSSFRow headerRow;
            int cellCount;
            try
            {
                if (HeaderRowIndex < 0 || !needHeader)
                {
                    headerRow = sheet.GetRow(0) as HSSFRow;
                    cellCount = headerRow.LastCellNum;
                    for (int i = headerRow.FirstCellNum; i < cellCount; i++)
                    {
                        DataColumn column = new DataColumn(Convert.ToString(i));
                        table.Columns.Add(column);
                    }
                }
                else
                {
                    headerRow = sheet.GetRow(HeaderRowIndex) as HSSFRow;
                    cellCount = headerRow.LastCellNum;
                    for (int i = headerRow.FirstCellNum; i < cellCount; i++)
                    {
                        if (headerRow.GetCell(i) == null)
                        {
                            if (table.Columns.IndexOf(Convert.ToString(i)) > 0)
                            {
                                DataColumn column = new DataColumn(Convert.ToString("重復列名" + i));
                                table.Columns.Add(column);
                            }
                            else
                            {
                                DataColumn column = new DataColumn(Convert.ToString(i));
                                table.Columns.Add(column);
                            }
                        }
                        else if (table.Columns.IndexOf(headerRow.GetCell(i).ToString()) > 0)
                        {
                            DataColumn column = new DataColumn(Convert.ToString("重復列名" + i));
                            table.Columns.Add(column);
                        }
                        else
                        {
                            DataColumn column = new DataColumn(headerRow.GetCell(i).ToString());
                            table.Columns.Add(column);
                        }
                    }
                }
                int rowCount = sheet.LastRowNum;
                for (int i = (HeaderRowIndex + 1); i <= rowCount; i++)
                {
                    try
                    {
                        HSSFRow row;
                        if (sheet.GetRow(i) == null)
                        {
                            row = sheet.CreateRow(i) as HSSFRow;
                        }
                        else
                        {
                            row = sheet.GetRow(i) as HSSFRow;
                        }
                        DataRow dataRow = table.NewRow();
                        for (int j = row.FirstCellNum; j < cellCount; j++)
                        {
                            try
                            {
                                if (row.GetCell(j) != null)
                                {
                                    switch (row.GetCell(j).CellType)
                                    {
                                        case CellType.String:
                                            string str = row.GetCell(j).StringCellValue;
                                            if (!string.IsNullOrEmpty(str))
                                            {
                                                dataRow[j] = str.ToString();
                                            }
                                            else
                                            {
                                                dataRow[j] = null;
                                            }
                                            break;
                                        case CellType.Numeric:
                                            if (DateUtil.IsCellDateFormatted(row.GetCell(j)))
                                            {
                                                dataRow[j] = DateTime.FromOADate(row.GetCell(j).NumericCellValue);
                                            }
                                            else
                                            {
                                                dataRow[j] = Convert.ToDouble(row.GetCell(j).NumericCellValue);
                                            }
                                            break;
                                        case CellType.Boolean:
                                            dataRow[j] = Convert.ToString(row.GetCell(j).BooleanCellValue);
                                            break;
                                        case CellType.Error:
                                            dataRow[j] = ErrorEval.GetText(row.GetCell(j).ErrorCellValue);
                                            break;
                                        case CellType.Formula:
                                            switch (row.GetCell(j).CachedFormulaResultType)
                                            {
                                                case CellType.String:
                                                    string strFORMULA = row.GetCell(j).StringCellValue;
                                                    if (!string.IsNullOrEmpty(strFORMULA))
                                                    {
                                                        dataRow[j] = strFORMULA.ToString();
                                                    }
                                                    else
                                                    {
                                                        dataRow[j] = null;
                                                    }
                                                    break;
                                                case CellType.Numeric:
                                                    dataRow[j] = Convert.ToString(row.GetCell(j).NumericCellValue);
                                                    break;
                                                case CellType.Boolean:
                                                    dataRow[j] = Convert.ToString(row.GetCell(j).BooleanCellValue);
                                                    break;
                                                case CellType.Error:
                                                    dataRow[j] = ErrorEval.GetText(row.GetCell(j).ErrorCellValue);
                                                    break;
                                                default:
                                                    dataRow[j] = "";
                                                    break;
                                            }
                                            break;
                                        default:
                                            dataRow[j] = "";
                                            break;
                                    }
                                }
                            }
                            catch (Exception exception)
                            {
                                throw  new Exception(exception.Message);
                                //wl.WriteLogs(exception.ToString());
                            }
                        }
                        table.Rows.Add(dataRow);
                    }
                    catch (Exception exception)
                    {
                        throw new Exception(exception.Message);
                        //wl.WriteLogs(exception.ToString());
                    }
                }
            }
            catch (Exception exception)
            {
                throw new Exception(exception.Message);
                //wl.WriteLogs(exception.ToString());
            }
            return table;
        }
        #endregion
        #region 更新excel中的數據
        /// <summary>
        /// 更新Excel表格
        /// </summary>
        /// <param name="outputFile">需更新的excel表格路徑</param>
        /// <param name="sheetname">sheet名</param>
        /// <param name="data"></param>
        /// <param name="saveTitle"></param>
        public static bool UpdateExcel(string oldFile,string newFile, string sheetname,DataTable data,bool saveTitle = true)
        {
            try
            {
                HSSFWorkbook hssfworkbook;
                using (FileStream readfile = new FileStream(oldFile, FileMode.Open, FileAccess.Read))
                {
                    hssfworkbook = new HSSFWorkbook(readfile);
                    ISheet sheet1 = hssfworkbook.GetSheet(sheetname);
                    int currentSheetRowIndex = 0;
                    if (saveTitle) currentSheetRowIndex = 1;
                    for (int i = 0; i < data.Rows.Count; i++, currentSheetRowIndex++)
                    {
                        for (int j = 0; j < data.Columns.Count; j++)
                        {
                            if (sheet1.GetRow(currentSheetRowIndex) == null)
                                sheet1.CreateRow(currentSheetRowIndex);
                            if (sheet1.GetRow(currentSheetRowIndex).GetCell(j) == null)
                                sheet1.GetRow(currentSheetRowIndex).CreateCell(j);
                            sheet1.GetRow(currentSheetRowIndex).GetCell(j).SetCellValue(data.Rows[i][j].ToString());
                        }
                    }
                }
                using (FileStream writefile = new FileStream(newFile, FileMode.Create, FileAccess.Write))
                {
                    hssfworkbook.Write(writefile);
                }
            }
            catch (IOException ioException)
            {
                throw new IOException(ioException.Message);
            }
            catch (UnauthorizedAccessException unauthorizedAccessException)
            {
                throw new UnauthorizedAccessException(unauthorizedAccessException.Message);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
                // wl.WriteLogs(ex.ToString());
            }
            return true;
        }
        /// <summary>
        /// 更新Excel表格
        /// </summary>
        /// <param name="outputFile">需更新的excel表格路徑</param>
        /// <param name="sheetname">sheet名</param>
        /// <param name="updateData">需更新的數據</param>
        /// <param name="coluids">需更新的列號</param>
        /// <param name="rowid">需更新的開始行號</param>
        public static void UpdateExcel(string outputFile, string sheetname, string[][] updateData, int[] coluids, int rowid)
        {
            FileStream readfile = new FileStream(outputFile, FileMode.Open, FileAccess.Read);
            HSSFWorkbook hssfworkbook = new HSSFWorkbook(readfile);
            readfile.Close();
            ISheet sheet1 = hssfworkbook.GetSheet(sheetname);
            for (int j = 0; j < coluids.Length; j++)
            {
                for (int i = 0; i < updateData[j].Length; i++)
                {
                    try
                    {
                        if (sheet1.GetRow(i + rowid) == null)
                        {
                            sheet1.CreateRow(i + rowid);
                        }
                        if (sheet1.GetRow(i + rowid).GetCell(coluids[j]) == null)
                        {
                            sheet1.GetRow(i + rowid).CreateCell(coluids[j]);
                        }
                        sheet1.GetRow(i + rowid).GetCell(coluids[j]).SetCellValue(updateData[j][i]);
                    }
                    catch (Exception ex)
                    {
                        // wl.WriteLogs(ex.ToString());
                    }
                }
            }
            try
            {
                FileStream writefile = new FileStream(outputFile, FileMode.Create);
                hssfworkbook.Write(writefile);
                writefile.Close();
            }
            catch (Exception ex)
            {
                //wl.WriteLogs(ex.ToString());
            }
        }
        /// <summary>
        /// 更新Excel表格
        /// </summary>
        /// <param name="outputFile">需更新的excel表格路徑</param>
        /// <param name="sheetname">sheet名</param>
        /// <param name="updateData">需更新的數據</param>
        /// <param name="coluid">需更新的列號</param>
        /// <param name="rowid">需更新的開始行號</param>
        public static void UpdateExcel(string outputFile, string sheetname, double[] updateData, int coluid, int rowid)
        {
            FileStream readfile = new FileStream(outputFile, FileMode.Open, FileAccess.Read);
            HSSFWorkbook hssfworkbook = new HSSFWorkbook(readfile);
            ISheet sheet1 = hssfworkbook.GetSheet(sheetname);
            for (int i = 0; i < updateData.Length; i++)
            {
                try
                {
                    if (sheet1.GetRow(i + rowid) == null)
                    {
                        sheet1.CreateRow(i + rowid);
                    }
                    if (sheet1.GetRow(i + rowid).GetCell(coluid) == null)
                    {
                        sheet1.GetRow(i + rowid).CreateCell(coluid);
                    }
                    sheet1.GetRow(i + rowid).GetCell(coluid).SetCellValue(updateData[i]);
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                    //wl.WriteLogs(ex.ToString());
                    throw;
                }
            }
            try
            {
                readfile.Close();
                FileStream writefile = new FileStream(outputFile, FileMode.Create, FileAccess.Write);
                hssfworkbook.Write(writefile);
                writefile.Close();
            }
            catch (Exception ex)
            {
                //wl.WriteLogs(ex.ToString());
            }
        }
        /// <summary>
        /// 更新Excel表格
        /// </summary>
        /// <param name="outputFile">需更新的excel表格路徑</param>
        /// <param name="sheetname">sheet名</param>
        /// <param name="updateData">需更新的數據</param>
        /// <param name="coluids">需更新的列號</param>
        /// <param name="rowid">需更新的開始行號</param>
        public static void UpdateExcel(string outputFile, string sheetname, double[][] updateData, int[] coluids, int rowid)
        {
            FileStream readfile = new FileStream(outputFile, FileMode.Open, FileAccess.Read);
            HSSFWorkbook hssfworkbook = new HSSFWorkbook(readfile);
            readfile.Close();
            ISheet sheet1 = hssfworkbook.GetSheet(sheetname);
            for (int j = 0; j < coluids.Length; j++)
            {
                for (int i = 0; i < updateData[j].Length; i++)
                {
                    try
                    {
                        if (sheet1.GetRow(i + rowid) == null)
                        {
                            sheet1.CreateRow(i + rowid);
                        }
                        if (sheet1.GetRow(i + rowid).GetCell(coluids[j]) == null)
                        {
                            sheet1.GetRow(i + rowid).CreateCell(coluids[j]);
                        }
                        sheet1.GetRow(i + rowid).GetCell(coluids[j]).SetCellValue(updateData[j][i]);
                    }
                    catch (Exception ex)
                    {
                        //wl.WriteLogs(ex.ToString());
                    }
                }
            }
            try
            {
                FileStream writefile = new FileStream(outputFile, FileMode.Create);
                hssfworkbook.Write(writefile);
                writefile.Close();
            }
            catch (Exception ex)
            {
                //wl.WriteLogs(ex.ToString());
            }
        }
        #endregion
        public static int GetSheetNumber(string outputFile)
        {
            int number = 0;
            try
            {
                FileStream readfile = new FileStream(outputFile, FileMode.Open, FileAccess.Read);
                HSSFWorkbook hssfworkbook = new HSSFWorkbook(readfile);
                number = hssfworkbook.NumberOfSheets;
            }
            catch (Exception exception)
            {
                //wl.WriteLogs(exception.ToString());
            }
            return number;
        }
        public static ArrayList GetSheetName(string outputFile)
        {
            ArrayList arrayList = new ArrayList();
            try
            {
                FileStream readfile = new FileStream(outputFile, FileMode.Open, FileAccess.Read);
                HSSFWorkbook hssfworkbook = new HSSFWorkbook(readfile);
                for (int i = 0; i < hssfworkbook.NumberOfSheets; i++)
                {
                    arrayList.Add(hssfworkbook.GetSheetName(i));
                }
            }
            catch (Exception exception)
            {
                //wl.WriteLogs(exception.ToString());
            }
            return arrayList;
        }
        public static bool isNumeric(String message, out double result)
        {
            Regex rex = new Regex(@"^[-]?d+[.]?d*$");
            result = -1;
            if (rex.IsMatch(message))
            {
                result = double.Parse(message);
                return true;
            }
            else return false;
        }
    }
}

調用方法:

DataTable table = ExcelHelper.ImportExceltoDt(name,"Detail");//name是excel的路徑txtSheetName是sheet名稱
success = ExcelHelper.UpdateExcel(name, newFileName, "Detail", table);//name是原excel名稱,這里我需要把處理好的文件另存而不去修改源文件所以我加入了一個新的路徑,table是需要保存的數據返回值為bool表示成功或失敗

 

通過測試NPOI速度為OLEDB的數十倍,

 

 

 

出處:https://www.cnblogs.com/Jack-Blog/p/4692910.html


免責聲明!

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



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