2011-01-10 13 views
2

Ich habe einen Code geschrieben, der eine Excel 2007-Datei mit Microsoft Data Access Engine lesen kann, funktioniert das folgende Code-Snippet für die meisten Dateien, aber es funktioniert für die meisten von die Excel-Dateien dh .xlsx, .xls aber wenn es bei objConn.Open() fehlschlägt; für Excel-Dateien, die Excel-Formatierungsprobleme haben unterMicrosoft OLEDB-Fehler Externe Tabelle ist nicht im erwarteten Format

auf das Bild, entnehmen Sie bitte

Excel file with formatting errors

Er scheiterte die OLE DB-Verbindung unter Angabe Fehler Externe Tabelle öffnen würde, ist nicht im erwarteten Format. Ein weiteres Problem bei diesem Import-Vorgang ist, dass

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

nicht in der Lage ist, Blätter zu lesen, mit Leerzeichen beginnen jede Hilfe mit der Lösung dieser Frage würde sehr geschätzt werden.

 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; 
     } 

Antwort

2

ich passieren, um herauszufinden, das Problem besteht, wenn Sie die xlsx-Datei manuell oder programmatisch ändern, ohne Excel, wenn Sie die xlsx ändern das Format nicht intakt ist bleiben und der oben erwähnte Fehler aufkommt, weil OleDbDataAdapter nicht in der Lage ist Um die geänderte Datei und Excel selbst zu behandeln kann die beschädigten Dateien reparieren zeigt die Datei wie erwartet.

+0

Wissen Sie, ob es eine Möglichkeit gibt, die Datei programmgesteuert erneut in Excel zu speichern? Es ist also kein Benutzereingriff erforderlich, um das Problem zu beheben. – ProfessionalAmateur

Verwandte Themen