2015-06-03 13 views
10

Ho esportato i dati dal database utilizzando HttpContext con la formattazione di table, tr e td. Voglio leggere lo stesso file e convertirlo in datatable.Come importare Excel che è in formato HTML

<add name="Excel03ConString" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='HTML Import;HDR={1};IMEX=1'" /> 

<add name="Excel03ConString" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='Excel 8.0;HDR={1};IMEX=1'" /> 

    private DataTable GetTableFromExcel() 
    { 
     DataTable dt = new DataTable(); 

     try 
     { 
      if (exclFileUpload.HasFile) 
      { 
       string FileName = Path.GetFileName(exclFileUpload.PostedFile.FileName); 
       string Extension = Path.GetExtension(exclFileUpload.PostedFile.FileName); 
       string FolderPath = Server.MapPath(ConfigurationManager.AppSettings["FolderPath"]); 
       //string NewFileName = string.Format("{0}_{1}", DateTime.Now.ToString().Replace("/", "").Replace(" ", "").Replace(":", ""), FileName); 
       string FilePath = Path.Combine(string.Format("{0}/{1}", FolderPath, FileName)); 
       exclFileUpload.SaveAs(FilePath); 
       string conStr = ""; 
       switch (Extension) 
       { 
        case ".xls": //Excel 97-03 
         conStr = ConfigurationManager.ConnectionStrings["Excel03ConString"].ConnectionString; 
         break; 
        case ".xlsx": //Excel 07 
         conStr = ConfigurationManager.ConnectionStrings["Excel07ConString"].ConnectionString; 
         break; 
       } 
       conStr = String.Format(conStr, FilePath, true); 
       OleDbConnection connExcel = new OleDbConnection(conStr); 
       OleDbCommand cmdExcel = new OleDbCommand(); 
       OleDbDataAdapter oda = new OleDbDataAdapter(); 

       cmdExcel.Connection = connExcel; 

       connExcel.Open(); 
       DataTable dtExcelSchema; 
       dtExcelSchema = connExcel.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); 
       string SheetName = dtExcelSchema.Rows[0]["TABLE_NAME"].ToString(); 
       connExcel.Close(); 

       connExcel.Open(); 
       cmdExcel.CommandText = "SELECT * From [" + SheetName + "]"; 
       oda.SelectCommand = cmdExcel; 
       oda.Fill(dt); 
       connExcel.Close(); 
       File.Delete(FilePath); 

      } 
     } 
     catch (Exception ex) 
     { 

     } 
     return dt; 
    } 

Quando si utilizza la seconda stringa di connessione che sto ottenendo l'errore "tabella esterna non è nel formato previsto sul connection.Open()." Ma quando uso il primo, sto ricevendo errori nella lettura del nome del foglio.

Per favore dimmi come leggere il foglio o, direttamente, i dati da Excel.

+0

Ciao! Hai visto [questo] (https://github.com/paulyoder/LinqToExcel/blob/master/readme.markdown)? –

+0

Se lo hai esportato in formato html come dici (tabella con trs e tds) perché lo tratti come Excel? –

+0

@ MladenOršolić: Ricevo l'Excel creato da SAP esportato come HTML in Excel. – Wanderer

risposta

0

ho trovato questo in linea: C# Excel file OLEDB read HTML IMPORT

Qui dicono:

Invece di usare lo sheetname, è necessario utilizzare il titolo della pagina nella Select senza il $. SELECT * FROM [HTMLPageTitle]

In quel post si collegano anche a questo manuale, che può rivelarsi utile, ma è troppo lungo per copiare qui: http://ewbi.blogs.com/develops/2006/12/reading_html_ta.html

Se questo non funziona, ho Penso che dovrai ricreare l'originale excel in modo che rimanga un file excel e non HTML (se ciò è possibile nel tuo scenario)

0

Potresti dover affrontare questo problema per diversi motivi. Ci sono diverse soluzioni per questo uno di loro è quello di rendere la soluzione di debug come x86. Ecco come puoi cambiarlo in x86.

  • Fare clic con il pulsante destro del mouse su Sloution da Visual Studio.
  • configurazione Fare clic su Gestione
  • Selezionare x86 da Active solution platform se disponibile
  • Se non disponibile cliccare New e selezionare o digitare x86 e cliccare su OK.
  • Ricostruisci la soluzione ed esegui l'applicazione.

Se questo problema non risolve il problema, potrebbe essere necessario installare la versione 32 bit di office system drivers. Ecco un completo article che spiega il problema.

0

Dopo una ricerca approfondita ho trovato la soluzione.

Prima converti il ​​particolare file di Excel in una pagina html utilizzando il seguente codice.

File.Move(Server.MapPath("~/Foldername/ExcelName.xls",Path.ChangeExtension(Server.MapPath("~/Foldername/ExcelName.xls"), ".html")); 

dobbiamo scaricare la stringa HTML ed estrarre il contenuto. tag contiene e tag ma potrebbe avere proprietà di stile. Quindi prima dobbiamo evitare queste proprietà di stile e dopo aver ottenuto il contenuto richiesto dalla tabella.

string url = Server.MapPath("~/FolderName/Excelname.html"); 
WebClient wc = new WebClient(); 
string fileContent = wc.DownloadString(url); 

Qui dobbiamo formattare i tag HTML per evitare le proprietà di stile.

const string msgFormat = "table[{0}], tr[{1}], td[{2}], a: {3}, b: {4}"; 
const string table_pattern = "<table.*?>(.*?)</table>"; 
const string tr_pattern = "<tr.*?>(.*?)</tr>"; 
const string td_pattern = "<td.*?>(.*?)</td>"; 
const string a_pattern = "<a href=\"(.*?)\"></a>"; 
const string b_pattern = "<b>(.*?)</b>"; 

Dopo attraverso looping possiamo trovare <tr> e <td> elementi. Quindi possiamo ottenere contenuti all'interno dei tag <td></td> utilizzando questo metodo.

private static List<string> GetContents(string input, string pattern) 
{ 
    MatchCollection matches = Regex.Matches(input, pattern, RegexOptions.Singleline); 
    List<string> contents = new List<string>(); 
    foreach (Match match in matches) 
    contents.Add(match.Value); 
    return contents; 
} 

Quindi possiamo inserire i record importati nel database per ogni riga.

Reference link here

3

Credo che questo Third party dll-(ExcellDataReader) può aiutare a risolvere il problema.

FileStream stream = File.Open(filePath, FileMode.Open, FileAccess.Read); 

//1. Reading from a binary Excel file ('97-2003 format; *.xls) 
IExcelDataReader excelReader = ExcelReaderFactory.CreateBinaryReader(stream); 
//... 
//2. Reading from a OpenXml Excel file (2007 format; *.xlsx) 
IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream); 
//... 
//3. DataSet - The result of each spreadsheet will be created in the result.Tables 
DataSet result = excelReader.AsDataSet(); 
//... 
//4. DataSet - Create column names from first row 
excelReader.IsFirstRowAsColumnNames = true; 
DataSet result = excelReader.AsDataSet(); 

//5. Data Reader methods 
while (excelReader.Read()) 
{ 
    //excelReader.GetInt32(0); 
} 

//6. Free resources (IExcelDataReader is IDisposable) 
excelReader.Close(); 
Problemi correlati