2011-01-10 1 views
2

J'ai écrit un code qui peut lire un fichier Excel 2007 à l'aide de Microsoft Data Access Engine l'extrait de code ci-dessous fonctionne correctement pour la plupart des fichiers, mais il fonctionne pour la plupart des les fichiers Excel sont .xlsx, .xls mais quand il échoue à objConn.Open(); pour les fichiers Excel qui ont des problèmes de formatage Excel s'il vous plaît se référer à l'image ci-dessousErreur Microsoft OLEDB Tableau externe n'est pas dans le format attendu

Excel file with formatting errors

Il a échoué à ouvrir la connexion ole Db erreur indiquant Table externe n'est pas dans le format attendu. Un autre problème avec cette procédure d'importation est que

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

n'est pas en mesure de lire des feuilles en commençant par les espaces d'aide pour résoudre cette question serait très appréciée.

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

Répondre

2

J'arrive à trouver le problème existe lorsque vous modifiez le fichier XLSX manuellement ou par programmation sans utiliser Excel une fois que vous modifiez le xlsx le format ne reste pas intact et l'erreur mentionnée ci-dessus vient parce que OleDbDataAdapter ne peut pas pour gérer le fichier modifié et Excel lui-même peut réparer les fichiers corrompus montre le fichier comme prévu.

+0

Savez-vous s'il existe un moyen de réenregistrer par programme le fichier avec Excel? Alors que cela ne nécessite pas d'intervention de l'utilisateur pour résoudre ce problème? – ProfessionalAmateur

Questions connexes