zoukankan      html  css  js  c++  java
  • C#读取Excel sheet方法

    最近忙着思考项目优化的工作,发现以前 导入excel的时候,再执行“如何获取excel要导入的sheet名称”的时候特别慢,今天在网上找了比较好,并且更方便的方法;

    原先导入excel代码如下:

    private void EcxelToGridView()
            {
                labelControl1.Text 
    = " ";
                
    //根据路径打开一个Excel文件并将数据填充到ds中
                string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = " + BtnExcPath.Text    + ";Extended Properties ='Excel 8.0;HDR=YES;IMEX=1'";
                OleDbConnection conn 
    = new OleDbConnection(strConn);
                conn.Open();
                
    string strExcel = "";
                OleDbDataAdapter myCommand 
    = null;
                
    //获取Excel中的sheet的名称(当执行到这句的时候特别慢,消耗资源太多)
                  string SheetName = GetExcelSheetNames(BtnExcPath.Text)[0];
                
    //方法一:直接写死为第一个sheet1,这么扩展性不好
                
    //strExcel = "select * from [sheet1$]";
                
    //方法二:目前也是只取第一页但是可以给出提示
                strExcel = "select * from [" + SheetName + "$]";
                myCommand 
    = new OleDbDataAdapter(strExcel, strConn);
                System.Data.DataSet ds 
    = new System.Data.DataSet();
                myCommand.Fill(ds, 
    "table1");
                conn.Close();
                List
    <string> strList = new List<string>();
                
    string str = string.Empty;
                strList.Clear();
                
    if (ds.Tables["table1"].Rows.Count == 0)
                {
                    MessageBoxShow.ShowProMessage(
    "要导入的Excel没有数据");
                }
            }
            
    /// <summary>
            
    /// 获取获得当前你选择的Excel Sheet的所有名字
            
    /// </summary>
            
    /// <param name="filePath"></param>
            
    /// <returns></returns>
            public static string[] GetExcelSheetNames(string filePath)
            {
                Microsoft.Office.Interop.Excel.ApplicationClass excelApp 
    = new Microsoft.Office.Interop.Excel.ApplicationClass();
                Microsoft.Office.Interop.Excel.Workbooks wbs 
    = excelApp.Workbooks;
                Microsoft.Office.Interop.Excel.Workbook wb 
    = wbs.Open(filePath, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                Type.Missing, Type.Missing, Type.Missing, Type.Missing);
                
    int count = wb.Worksheets.Count;
                
    string[] names = new string[count];
                
    for (int i = 1; i <= count; i++)
                {
                    names[i 
    - 1= ((Microsoft.Office.Interop.Excel.Worksheet)wb.Worksheets[i]).Name;
                }
                wb.Close(
    nullnullnull);
                excelApp.Quit();
                wbs.Close();
                System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(wbs);
                excelApp 
    = null;
                wbs 
    = null;
                wb 
    = null;
                
    return names;
            }

    第二种方法:

    private void EcxelToGridView()
            {
                labelControl1.Text 
    = " ";
                
    //根据路径打开一个Excel文件并将数据填充到ds中
                string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = " + BtnExcPath.Text + ";Extended Properties ='Excel 8.0;HDR=YES;IMEX=1'";
                OleDbConnection conn 
    = new OleDbConnection(strConn);
                conn.Open();
                
    string strExcel = "";
                OleDbDataAdapter myCommand 
    = null;
                DataTable dtSheetName 
    = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { nullnullnull"Table" });
                
    //包含excel中表名的字符串数组
                string[] strTableNames = new string[dtSheetName.Rows.Count];
                
    for (int k = 0; k < dtSheetName.Rows.Count; k++)
                {
    //我是倒序插入到strTableNames中,因为dtSheetName中行是从后往前读sheet页的
                    strTableNames[k] = dtSheetName.Rows[dtSheetName.Rows.Count-k-1]["TABLE_NAME"].ToString();
                }
                 
    //从指定的表明查询数据,可先把所有表明列出来供用户选择
                strExcel = "select * from [" + strTableNames[0+ "]";
                myCommand 
    = new OleDbDataAdapter(strExcel, strConn);
                System.Data.DataSet ds 
    = new System.Data.DataSet();
                myCommand.Fill(ds, 
    "table1");
                conn.Close();
                List
    <string> strList = new List<string>();
                
    string str = string.Empty;
                strList.Clear();
                
    if (ds.Tables["table1"].Rows.Count == 0)
                {
                    MessageBoxShow.ShowProMessage(
    "要导入的Excel没有数据");
                }
           }

  • 相关阅读:
    二叉树的最大深度
    [CSP-S模拟测试]:飘雪圣域(莫队)
    [CSP-S模拟测试]:玩具(概率DP)
    [CSP-S模拟测试]:梦境(贪心+小根堆)
    [CSP-S模拟测试]:小P的生成树(数学+Kruskal)
    [CSP-S模拟测试]:小P的单调数列(树状数组+DP)
    [CSP-S模拟测试]:小P的2048(模拟)
    [CSP-S模拟测试]:简单的操作(二分图+图的直径)
    [CSP-S模拟测试]:简单的期望(DP)
    [CSP-S模拟测试]:简单的序列(DP)
  • 原文地址:https://www.cnblogs.com/6303c/p/1868188.html
Copyright © 2011-2022 走看看