zoukankan      html  css  js  c++  java
  • 【转载】C# 读取Excel文件代码的几种片段收集

    片段 1

    using System.Data.OleDb;

    ...


    static void Main()
    {
    Application.Run(
    new Form1());
    }

    private void Form1_Load(object sender, System.EventArgs e)
    {
    DataTable myT
    =ExcelToDataTable("D:/文件/新武昌站点资料.xls","sheet1");
    String mystr
    =myT.Rows[0][0].ToString();
    this.textBox1.Text=mystr;
    }

    public static DataTable ExcelToDataTable(string strExcelFileName, string strSheetName)
    {
    //源的定义
    string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + strExcelFileName + ";" + "Extended Properties='Excel 8.0;HDR=NO;IMEX=1';";

    //Sql语句
    //string strExcel = string.Format("select * from [{0}$]", strSheetName); 这是一种方法
    string strExcel = "select * from   [sheet1$]";

    //定义存放的数据表
    DataSet ds = new DataSet();

    //连接数据源
    OleDbConnection conn = new OleDbConnection(strConn);

    conn.Open();

    //适配到数据源
    OleDbDataAdapter adapter = new OleDbDataAdapter(strExcel, strConn);
    adapter.Fill(ds, strSheetName);

    conn.Close();

    return ds.Tables[strSheetName];
    }


    很简单的代码,但是问题就出在连接字符串上面,后面一定要加上Extended Properties='Excel 8.0;HDR=NO;IMEX=1',HDR和IMEX也一定要配合使用,哈哈,老实说,我也不知道为什么,这样配合的效果最好,这是我艰苦调试的结果.IMEX=1应该是将所有的列全部视为文本,我也有点忘记了.至于HDR本来只是说是否要出现一行标题头而已,但是结果却会导致某些字段值丢失,所以其实我至今也搞不明白为什么,很可能是驱动的问题...

    片段 2

    提供两种方法:一个是直接打开excel文件,然后逐行读取,速度较慢;还有一种方法是通过OleDb连接,把excel文件作为数据源来读取
    方法一:这种直接读取单元格的方法释放很重要。

      

    Excel.Application excel = null;
       Excel.Workbooks wbs 
    = null;
       Excel.Workbook wb 
    = null;
       Excel.Worksheet ws 
    = null;
       Excel.Range range1 
    = null;
       
    object Nothing = System.Reflection.Missing.Value;
        
       
    try
       {
        excel 
    = new Excel.Application();
        excel.UserControl 
    = true;
        excel.DisplayAlerts 
    = false;
                        
        excel.Application.Workbooks.Open(
    this.FilePath,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing ) ;
        
        wbs 
    = excel.Workbooks;
        wb 
    = wbs[1];
        ws 
    = (Excel.Worksheet)wb.Worksheets["Sheet2"];
        
             
        
    int rowCount = ws.UsedRange.Rows.Count;
        
    int colCount = ws.UsedRange.Columns.Count;
        
    if (rowCount <= 0)
         
    throw new InvalidFormatException("文件中没有数据记录");
        
    if (colCount < 4 )
         
    throw new InvalidFormatException("字段个数不对");
        
        
    for (int i = 0;i    {

         
    this.rowNo = i + 1;
         
    object[] row = new object[4];
         
    for (int j = 0;j<4;j++)
         {
          range1 
    = ws.get_Range(ws.Cells[i+2,j+1],ws.Cells[i+2,j+1]);
          row[j] 
    = range1.Value;

          
    if (row[0== null)
          {
           
    this.isNullRecord++;
           
    break;
          }
         }
                       
         
    if (this.isNullRecord > 0)
          
    continue;

         DataRow dataRow 
    = this.readExcel(row);

         
    if (this.isNullRecord == 1)
          
    continue;
      
         
    if (this.verifyData(dataRow) == false)
          errFlag
    ++;
      
         
    this.updateTableCurr(dataRow);
        }
        
       }
       
    finally
       {
        
    if (excel != null)
        {
         
    if (wbs != null)
         {
          
    if (wb != null)
          {
           
    if (ws != null)
           {
            
    if (range1 != null)
            {
             System.Runtime.InteropServices.Marshal.ReleaseComObject(range1);
             range1 
    = null;
            }
            System.Runtime.InteropServices.Marshal.ReleaseComObject(ws);
            ws 
    = null;
           }
           wb.Close(
    false,Nothing,Nothing);
           System.Runtime.InteropServices.Marshal.ReleaseComObject(wb);
           wb 
    = null;
          }
          wbs.Close();
          System.Runtime.InteropServices.Marshal.ReleaseComObject(wbs);
          wbs 
    = null;
         }
         excel.Application.Workbooks.Close();
         excel.Quit();
         System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);
         excel 
    = null;
         GC.Collect();
        }
       }

    方法二:这里是fill进dataset,也可以返回OleDbDataReader来逐行读,数据较快
    注:这种方法容易把混合型的字段作为null值读取进来,解决办法是改造连接字符串
    strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Erp1912.xls;Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'";
    通过Imex=1来把混合型作为文本型读取,避免null值,详细请见http://www.connectionstrings.com

    private DataSet importExcelToDataSet(string FilePath)
    {
       
    string strConn;
       strConn 
    = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + FilePath + ";Extended Properties=Excel 8.0;";
       OleDbConnection conn 
    = new OleDbConnection(strConn);
       OleDbDataAdapter myCommand 
    = new OleDbDataAdapter("SELECT * FROM [Sheet1$]",strConn);
       DataSet myDataSet 
    = new DataSet();
       
    try
       {
        myCommand.Fill(myDataSet);
       }
       
    catch(Exception ex)
       {
        
    throw new InvalidFormatException("该Excel文件的工作表的名字不正确," + ex.Message);
       }
       
    return myDataSet;
    }


    片段 3

    用c#读取excel文件,写到datagridview控件中

    用c#读取excel文件,写到datagridview控件中


    string strconn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyExcel.xls;Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1''" " ;

                OleDbConnection conn 
    = new OleDbConnection(strconn);

                conn.Open();

                
    if (bo == false)

                {

                    comboBox1.Items.Clear();

                    DataTable dt 
    = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { nullnullnull"TABLE" });

                    
    foreach (DataRow dr in dt.Rows)

                    {

                        comboBox1.Items.Add((String)dr[
    "TABLE_NAME"]);

                        
    //MessageBox.Show((String)dr["TABLE_NAME"]);

                    }

                    
    //comboBox1.Text = comboBox1.Items[0].ToString();

                }

                
    else

                {

                    
    string sql = "select * from " + comboBox1.Text;

                    OleDbDataAdapter aper 
    = new OleDbDataAdapter(sql, conn);

                    DataSet myset 
    = new DataSet();

                    aper.Fill(myset, comboBox1.Text);

                    dataGridView1.DataSource 
    = myset.Tables[comboBox1.Text];

                }

                conn.Close();

    备注:

    @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyExcel.xls;Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"""

    "HDR=Yes;" indicates that the first row contains columnnames, not data

    "IMEX=1;" tells the driver to always read "intermixed" data columns as text

    TIP! SQL syntax: "SELECT * FROM [sheet1$]" - i.e. worksheet name followed by a "$" and wrapped in "[" "]" brackets.

    如果第一行是数据而不是标题的话, 应该写: "HDR=No;"

    "IMEX=1;" tells the driver to always read "intermixed" data columns as text

    片段 4

    C#读取Excel文件数据    
    相当简单,Excel就像数据库,每个Sheet就是一个Table. Microsoft.Jet.OLEDB驱动.
    之后是DataReader循环,或DataSet处理都非常简单.

    HTTP://BLOG.CSDN.NET/CRABO/
    注意:数据类型的转换!!


    #region set connection
       
    string strConn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source= "+this.txtPath.Text+";Extended Properties=Excel 8.0;";
       myDataReader 
    = null;
    craboDbConnection 
    = new OleDbConnection(strConn);
       OleDbCommand myOleDbCommand 
    = new OleDbCommand("SELECT * FROM [Sheet1$]", myOleDbConnection);
       
    #endregion

       
    try
       {
        myOleDbConnection.Open();
        myDataReader 
    = myOleDbCommand.ExecuteReader();
        
    while (myDataReader.Read())
        {
           
    this.txtSeq.Text=Convert.ToString(myDataReader.GetValue(0));//列1
           this.txtName.Text=Convert.ToString(myDataReader.GetValue(1));//列2
           this.txtPIN.Text=Convert.ToString(myDataReader.GetValue(2));//列3
        }
    }
       
    #region Catch
       
    catch(System.Threading.ThreadAbortException e)
       {
        System.Threading.Thread.ResetAbort();
        
    this.lblResult.Text = "线程被中断..."+e.Message;
       }
       
    catch(Exception ex)
       {
        System.Windows.Forms.MessageBox.Show(ex.ToString());
       }
       
    finally
       {
        
    // Always call Close when done reading.
        if (myDataReader != null)
         myDataReader.Close();

        
    // Close the connection when done with it.
        if (craboDbConnection!=null && craboDbConnection.State == ConnectionState.Open)
         craboDbConnection.Close();

        
    if(webResponse!=null)
         webResponse.Close();
       }
       
    #endregion
    我抬头仰望,星星给予仰望者光芒……
  • 相关阅读:
    微信小程序 视频广告展示异常(“表情、壁纸”等页面,当视频广告与顶部区域重叠时,视频广告呈现透明状态,需重新设置视频广告的层级即可)
    Vue:The template root requires exactly one element.的解决办法
    Angular之ES6语法实现数组去重
    Java程序中的代理作用和应用场景及实现
    Hadoop hdfs副本存储和纠删码(Erasure Coding)存储优缺点
    Hadoop源码:namenode格式化和启动过程实现
    ssh免密登录设置后不生效
    递归查询子级元素,返回树形菜单数据
    mysql设置密码
    PX4飞行模式简单对比梳理
  • 原文地址:https://www.cnblogs.com/koon/p/2093140.html
Copyright © 2011-2022 走看看