C# 讀取excel數(shù)據(jù)到datatable

在項目中使用到遇到了需要將excel文件導入到數(shù)據(jù)庫中斟薇,在此做個總結記錄设江,防止后面人踩坑袋励。

開發(fā)環(huán)境:VS2008+Win10

第一種方式:Office.Interop.Excel方式 數(shù)據(jù)量大時有點慢

public static DataTable getExcelDataKHFY(string fileName, DataTable dt)
        {
            string[] names = GetExcelTableName(fileName);
            int ysCount = 0;//獲取頁數(shù)
            string exname = "";
            if (names.Length > 1)
            {
                Yx_Module.winChangeExcel win = new THKClient.Yx_Module.winChangeExcel(names);

                win.ShowDialog();
                if (win.IsReturn)
                {
                    ysCount = int.Parse(win.Excelid) + 1;//頁碼
                    exname = win.ExName;//選擇的頁名
                }

            }

            DataTable result = dt;
            Microsoft.Office.Interop.Excel.Application xlApp = null;
            Microsoft.Office.Interop.Excel.Workbook xlWorkbook = null;
            try
            {
                xlApp = new Microsoft.Office.Interop.Excel.Application();
                if (xlApp == null) return null;

                xlApp.Visible = false;
                xlWorkbook = xlApp.Workbooks.Open(fileName, 0, false, 5, "", "", false, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false);
                Dictionary<int, Microsoft.Office.Interop.Excel.Range> rowrange = new Dictionary<int, Microsoft.Office.Interop.Excel.Range>();
                if (ysCount != 0)
                {
                    try
                    {
                        //動態(tài)頁插入數(shù)據(jù)
                        int i = ysCount;
                        // Microsoft.Office.Interop.Excel.Worksheet sheet = (Microsoft.Office.Interop.Excel.Worksheet)xlWorkbook.Sheets[i];//根據(jù)頁碼
                        Microsoft.Office.Interop.Excel.Worksheet sheet = (Microsoft.Office.Interop.Excel.Worksheet)xlWorkbook.Sheets[exname];//根據(jù)頁名獲取
                        string str = sheet.Name;
                        for (int rowIndex = 2; rowIndex < sheet.Cells.Rows.Count - 1; rowIndex++)
                        {
                            rowrange.Clear();
                            object[] parm = new object[result.Columns.Count];
                            for (int j = 0; j < result.Columns.Count; j++)
                            {
                                rowrange[j] = (Microsoft.Office.Interop.Excel.Range)(sheet.Cells[rowIndex, j + 1]);

                                parm[j] = rowrange[j].Value2 == null ? "" : rowrange[j].Value2.ToString();
                            }



                            rowrange.Clear();
                            if (parm[0].ToString().Trim().Length == 0)
                            {
                                break;
                            }
                            result.Rows.Add(parm);
                        }
                    }
                    catch (Exception ee)
                    {

                        throw;
                    }
                }
                else
                {
                    for (int i = 1; i < xlWorkbook.Sheets.Count + 1; i++)
                    {
                        Microsoft.Office.Interop.Excel.Worksheet sheet = (Microsoft.Office.Interop.Excel.Worksheet)xlWorkbook.Sheets[i];
                        string str = sheet.Name;
                        for (int rowIndex = 2; rowIndex < sheet.Cells.Rows.Count - 1; rowIndex++)
                        {
                            rowrange.Clear();
                            object[] parm = new object[result.Columns.Count];
                            for (int j = 0; j < result.Columns.Count; j++)
                            {
                                rowrange[j] = (Microsoft.Office.Interop.Excel.Range)(sheet.Cells[rowIndex, j + 1]);

                                parm[j] = rowrange[j].Value2 == null ? "" : rowrange[j].Value2.ToString();
                            }



                            rowrange.Clear();
                            if (parm[0].ToString().Trim().Length == 0)
                            {
                                break;
                            }
                            result.Rows.Add(parm);
                        }
                    }
                }

                xlWorkbook.Close(Type.Missing, Type.Missing, Type.Missing);
                xlApp.Quit();
            }
            finally
            {
                Marshal.ReleaseComObject(xlWorkbook);
                Marshal.ReleaseComObject(xlApp);
                xlApp = null;
                List<Process> excelProcesses = GetExcelProcesses();
                if (excelProcesses.Count > 0)
                {
                    KillTheExcel();//殺死進程

                }
            }

            return result;
        }

第二種方式:NPOI方式 此種方式最優(yōu)

/// <summary>讀取excel
        /// 默認第一行為表頭
        /// </summary>
        /// <param name="strFileName">excel文檔路徑</param>
        /// <returns></returns>
        public static DataTable Import(string strFileName)
        {
            DataTable dt = new DataTable();

            HSSFWorkbook hssfworkbook;
            using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read))
            {
                hssfworkbook = new HSSFWorkbook(file);
            }
            HSSFSheet sheet = hssfworkbook.GetSheetAt(0);
            System.Collections.IEnumerator rows = sheet.GetRowEnumerator();

            HSSFRow headerRow = sheet.GetRow(0);
            int cellCount = headerRow.LastCellNum;

            for (int j = 0; j < cellCount; j++)
            {
                HSSFCell cell = headerRow.GetCell(j);
                dt.Columns.Add(cell.ToString());
            }

            for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++)
            {
                HSSFRow row = 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);
            }
            return dt;
        }

第三種方式:OLEDB方式 需要將程序設置為X86運行

image.png
public static DataTable ExcelToDataTable(string filePath)
        {
            string connStr = "";
            string fileType = System.IO.Path.GetExtension(filePath);
            if (string.IsNullOrEmpty(fileType)) return null;

            if (fileType == ".xls")
                connStr = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + filePath + ";" + ";Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1\"";
            else
                connStr = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + filePath + ";" + ";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1\"";
            string sql_F = "Select * FROM [{0}]";

            DataSet ds = new DataSet();

            //using (OleDbConnection myConn = new OleDbConnection(connStr))
            //{
            //    using (OleDbDataAdapter myCommand = new OleDbDataAdapter(sql_F, myConn))
            //    {
            //        myConn.Open();
            //        myCommand.Fill(ds);
            //    }
            //}

            //if (ds == null || ds.Tables.Count <= 0) return null;
            //return ds.Tables[0];


            OleDbConnection conn = null;
            OleDbDataAdapter da = null;
            DataTable dtSheetName = null;
            try
            {
                // 初始化連接角虫,并打開
                conn = new OleDbConnection(connStr);
                conn.Open();

                // 獲取數(shù)據(jù)源的表定義元數(shù)據(jù)                        
                string SheetName = "";
                dtSheetName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });

                // 初始化適配器
                da = new OleDbDataAdapter();
                for (int i = 0; i < dtSheetName.Rows.Count; i++)
                {
                    SheetName = (string)dtSheetName.Rows[i]["TABLE_NAME"];

                    if (SheetName.Contains("$") && !SheetName.Replace("'", "").EndsWith("$"))
                    {
                        continue;
                    }

                    da.SelectCommand = new OleDbCommand(String.Format(sql_F, SheetName), conn);
                    DataSet dsItem = new DataSet();
                    da.Fill(dsItem);

                    ds.Tables.Add(dsItem.Tables[0].Copy());
                }
            }
            catch (Exception ex)
            {
            }
            finally
            {
                // 關閉連接
                if (conn.State == ConnectionState.Open)
                {
                    conn.Close();
                    da.Dispose();
                    conn.Dispose();
                }
            }
            return ds.Tables[0];
        }
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末恃疯,一起剝皮案震驚了整個濱河市儿捧,隨后出現(xiàn)的幾起案子荚坞,更是在濱河造成了極大的恐慌挑宠,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件西剥,死亡現(xiàn)場離奇詭異痹栖,居然都是意外死亡,警方通過查閱死者的電腦和手機瞭空,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門揪阿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人咆畏,你說我怎么就攤上這事南捂。” “怎么了旧找?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵溺健,是天一觀的道長。 經(jīng)常有香客問我钮蛛,道長鞭缭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任魏颓,我火速辦了婚禮岭辣,結果婚禮上,老公的妹妹穿的比我還像新娘甸饱。我一直安慰自己沦童,他們只是感情好,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布叹话。 她就那樣靜靜地躺著偷遗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪驼壶。 梳的紋絲不亂的頭發(fā)上氏豌,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天,我揣著相機與錄音热凹,去河邊找鬼箩溃。 笑死,一個胖子當著我的面吹牛碌嘀,可吹牛的內容都是我干的涣旨。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼股冗,長吁一口氣:“原來是場噩夢啊……” “哼霹陡!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤烹棉,失蹤者是張志新(化名)和其女友劉穎攒霹,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體浆洗,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡催束,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了伏社。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抠刺。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖摘昌,靈堂內的尸體忽然破棺而出速妖,到底是詐尸還是另有隱情,我是刑警寧澤聪黎,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布罕容,位于F島的核電站,受9級特大地震影響稿饰,放射性物質發(fā)生泄漏锦秒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一喉镰、第九天 我趴在偏房一處隱蔽的房頂上張望旅择。 院中可真熱鬧,春花似錦梧喷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至屁擅,卻和暖如春偿凭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背派歌。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工弯囊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人胶果。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓匾嘱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親早抠。 傳聞我的和親對象是個殘疾皇子霎烙,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內容