zoukankan      html  css  js  c++  java
  • C#中Excel文件的读取

    提供两种方法:一个是直接打开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;
    }
  • 相关阅读:
    oracle 快速删除大批量数据方法(全部删除,条件删除,删除大量重复记录) 转
    linux rm删除含有特殊符号目录或者文件
    Linux下安装SVN(Subversion)
    linux还原svn
    linux 备份svn
    Linux下Tomcat重新启动
    Linux下rz,sz与ssh的配合使用
    深度分析Linux下双网卡绑定七种模式
    Ubuntu 12.04 安装Scrapy爬虫框架
    maven 添加本地jar
  • 原文地址:https://www.cnblogs.com/weekzero/p/1209991.html
Copyright © 2011-2022 走看看