2015-06-03 46 views
10

我已出口使用的HttpContext用表,TR和TD格式從數據庫中的數據。我想讀取相同的文件並轉換爲數據表。如何導入Excel的是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; 
    } 

當使用我收到錯誤的第二連接字符串「外部表不是在connection.Open()預期的格式。」但是當使用第一個時,我在閱讀工作表名稱時出錯。

請告訴我如何讀入紙,或者直接從Excel中的數據。

+0

嗨!你有沒有看過[this](https://github.com/paulyoder/LinqToExcel/blob/master/readme.markdown)? –

+0

如果您將其導出爲html格式(表格中包含trs和tds),爲什麼您將它視爲excel? –

+0

@MladenOršolić:我得到了SAP創建的Excel,它以HTML格式導出到Excel。 – Wanderer

回答

0

我發現這個在線: C# Excel file OLEDB read HTML IMPORT

在這裏,他們說:

除了使用SHEETNAME的,你必須使用 select語句的網頁標題,而不$。 SELECT * FROM [HTMLPageTitle]

在那個崗位他們也鏈接到本手冊,這可能會派上用場,但太長複製到這裏: http://ewbi.blogs.com/develops/2006/12/reading_html_ta.html

如果不工作,我認爲你將不得不重新創建原始Excel所以它仍然是一個Excel文件,而不是HTML(如果在你的情況是在所有可能的)

0

您可能會面臨這個問題,由於不同的原因。對於這其中的一種解決方案,有不同的解決方案是使您的解決方案調試爲x86。以下是如何將其更改爲x86

  • 右鍵單擊Visual Studio中的sloution。從Active solution platform
  • 單擊配置管理器
  • 選擇x86如果有
  • 如果沒有可用的點擊New,然後選擇或鍵入x86並單擊確定。
  • 重建解決方案並運行您的應用程序。

如果此解決方案不能解決您的問題,您可能需要安裝32 bit版本的office system drivers。這是一個完整的article解釋問題。

0

了深入的研究後,我找到了解決辦法。

首先通過使用下面的代碼特定的Excel文件轉換爲HTML頁面。我們不得不下載HTML字符串並提取內容。標籤包含和標籤,但它可能具有樣式屬性。所以首先我們必須避免這些樣式屬性,然後我們可以從表格中獲取所需的內容。

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

這裏我們必須格式化HTML標籤以避免樣式屬性。

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

通過循環後,我們可以發現<tr><td>元素。然後我們可以使用這種方法在<td></td>標籤內獲得內容。

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

然後我們可以將導入的記錄按行插入數據庫。

Reference link here

3

我認爲這Third party dll-(ExcellDataReader)可能會幫助您解決問題。

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(); 
相關問題