2011-01-10 5 views
2

Microsoftデータアクセスエンジンを使用して2007のExcelファイルを読み取るコードを書きましたが、以下のコードスニペットは大部分のファイルで正常に動作しますが、エクセルファイルie .xlsx、 .xlsですが、objConn.Open()で失敗した場合。エクセルの書式問題を抱えているExcelファイルのためにそれは外部表が予想形式ではありませんエラーを知らせるOLE DB接続を開くことができませんでしたでしょうMicrosoft OLEDBエラー外部テーブルが予期された形式ではありません

Excel file with formatting errors

下の画像を参照してください。このインポート手順でもう一つの問題は、

  OleDbCommand objCmdSelect = new OleDbCommand("SELECT * FROM "+ SelectionSheet, objConn); 

は、この問題を解決するとすべてのヘルプは高く評価されるだろうスペースで始まるシートを読み取ることができないということです。

 public DataTable ReadExcel(string Path, ArrayList IgnoreString, ArrayList IgnoreColumn) 
     { 
      DataTable dtReturn = new DataTable(); 
      DataTable dtPrintable = new DataTable(); 
      DataTable dtTemp = new DataTable(); 
      try 
      { 
       string sConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" + 
             "Data Source=" + Path + ";" + "Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1;\""; 

       OleDbConnection objConn = new OleDbConnection(sConnectionString); 




       objConn.Open(); 
       DataTable dtSheetnames = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); 

       DataTable dtTesting = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.DbInfoLiterals, new object[] {}); 
       DataTable dtTesting2 = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables_Info, new object[] { }); 


       string SelectionSheet = dtSheetnames.Rows[0][2].ToString(); 

       if (SelectionSheet.Contains("'")) 
       { 
        SelectionSheet = SelectionSheet.Remove(0, 1); 
        SelectionSheet = "[" + SelectionSheet; 
        SelectionSheet = SelectionSheet.Remove(SelectionSheet.Length - 1, 1); 
        // -- Mod by zeemz on 23 dec 
        // string PrintArea = SelectionSheet + "Print_Area]"; 

        SelectionSheet = SelectionSheet + "]"; 
       } 
       else 
       { 
        SelectionSheet = "["+ SelectionSheet + "]"; 
       } 


       //OleDbCommandBuilder objCmdBuilder = new OleDbCommandBuilder(


       OleDbCommand objCmdSelect = new OleDbCommand("SELECT * FROM "+ SelectionSheet, objConn); 




       OleDbDataAdapter objAdapter = new OleDbDataAdapter(); 
       DataSet objDataSet = new DataSet(); 

       DataSet PrintAreads = new DataSet(); 

       objAdapter.SelectCommand = objCmdSelect; 
       objAdapter.Fill(objDataSet); 

       // -- Mod by zeemz on 23 dec 
       //objCmdSelect.CommandText = "SELECT * FROM " + PrintArea; 
       //objAdapter.Fill(PrintAreads); 




       objConn.Close(); 

       dtReturn = objDataSet.Tables[0].Copy(); 
       // dtPrintable = PrintAreads.Tables[0].Copy(); 

       // -- Mod by zeemz on 23 dec 
       //if (dtPrintable.Columns.Count != dtReturn.Columns.Count) 
       //{ 
       // int TotalPrintable = dtPrintable.Columns.Count; 
       // int TotalComing = dtReturn.Columns.Count; 
       // int StartRemovingPos = TotalComing - TotalPrintable; 

       // for (int i = TotalPrintable; dtPrintable.Columns.Count != dtReturn.Columns.Count; i++) 
       // { 

       //  dtReturn.Columns.RemoveAt(i); 
       //  i = i - 1 ; 
       // } 


       //} 


       int iCount = 0; 
       while (iCount <= dtReturn.Rows.Count - 1) 
       { 
        if (isRowEmpty(dtReturn.Rows[iCount])) 
        { 
         dtReturn.Rows.RemoveAt(iCount); 
        } 
        else 
        { 
         iCount += 1; 
        } 
       } 


       //now applying the filters 

       //column ignore 
       for (int i = IgnoreColumn.Count - 1; i >= 0; i--) 
       { 
        dtReturn.Columns.RemoveAt((int)IgnoreColumn[i]); 
       } 

       //string ignore 
       for (int i = IgnoreString.Count - 1; i >= 0; i--) 
       { 
        for (int j = dtReturn.Rows.Count - 1; j >= 0; i--) 
        { 
         foreach (DataColumn dCol in dtReturn.Columns) 
         { 
          if (dtReturn.Rows[j][dCol.ColumnName].ToString().ToLower().Contains(IgnoreString[i].ToString().ToLower())) 
          { 
           dtReturn.Rows.RemoveAt(j); 
           break; 
          } 
         } 
        } 
       } 


       /* Hack to get rid of DateTime Columns */ 
       // added by zeemz 
       dtTemp = dtReturn.Clone(); 
       dtTemp.Clear(); 
       foreach (DataColumn tempColumn in dtTemp.Columns) 
       { 
       // if (tempColumn.DataType == typeof(DateTime)) 
//     { 
         tempColumn.DataType = typeof(String); 
    //     } 
       } 
       foreach (DataRow tempRow in dtReturn.Rows) 
       { 
        DataRow insRow = dtTemp.NewRow(); 
        foreach (DataColumn tempColumn in dtReturn.Columns) 
        { 

         if (tempColumn.DataType == typeof(DateTime)) 
         { 
          if (!String.IsNullOrEmpty(tempRow[tempColumn.ColumnName.ToString()].ToString())) 
          { 
           insRow[tempColumn.ColumnName.ToString()] = Convert.ToDateTime(tempRow[tempColumn.ColumnName.ToString()].ToString()).ToString("yyyyMMddhhmmss"); 
          } 
          else 
          { 
           insRow[tempColumn.ColumnName.ToString()] = ""; 
          } 
         } 
         else 
         { 

          insRow[tempColumn.ColumnName.ToString()] = tempRow[tempColumn.ColumnName.ToString()].ToString(); 
         } 

        } 
        dtTemp.Rows.Add(insRow); 
       } 



      } 
      catch (Exception ex) 
      { 
       throw ex; 
      } 

      return dtTemp; 
     } 

答えて

2

は、私はあなたがフォーマットをそのまま滞在していませんのxlsxを変更して、OleDbDataAdapterおよができないので、上記のエラーが起動したら、あなたは、Excelを使用せず、手動またはプログラム的XLSXファイルを変更するときに問題が存在して見つけることが起こります修正されたファイルを処理するためにExcelファイルを修正することができます。

+0

プログラムでExcelでファイルを再保存する方法があるかどうか知っていますか?これを修正するにはユーザーの介入は必要ありませんか? – ProfessionalAmateur