如何导入 HTML 格式的 Excel

Posted

技术标签:

【中文标题】如何导入 HTML 格式的 Excel【英文标题】:How to import Excel which is in HTML format 【发布时间】:2015-08-17 06:49:00 【问题描述】:

我已经使用 HttpContext 将数据从数据库中导出,格式为 table、tr 和 td。我想读取同一个文件并转换成数据表。

<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 中的数据。

【问题讨论】:

嗨!你见过this吗? 如果你把它导出成你说的html格式(带有trs和tds的表格)你为什么把它当作excel呢? @MladenOršolić:我正在获取由 SAP 创建的 Excel,它以 HTML 格式导出到 Excel。 您可以在记事本中打开它并通过添加数据样本来更新您的问题吗? 【参考方案1】:

我认为这个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();

【讨论】:

【参考方案2】:

我在网上找到了这个: C# Excel file OLEDB read HTML IMPORT

他们说:

您必须使用页面标题,而不是使用工作表名称 不带 $ 的 select 语句。选择 * 从 [HTMLPageTitle]

在那篇文章中,他们还链接到本手册,这可能会派上用场,但太长,无法在此处复制: http://ewbi.blogs.com/develops/2006/12/reading_html_ta.html

如果这不起作用,我认为您将不得不重新创建原始 excel,因此它仍然是一个 excel 文件,而不是 HTML(如果在您的方案中完全可能的话)

【讨论】:

【参考方案3】:

由于不同的原因,您可能会遇到此问题。有不同的解决方案,其中之一是将您的解决方案调试为x86。以下是如何将其更改为 x86

右键单击 Visual Studio 中的 sloution。 点击配置管理器 从Active solution platform 中选择x86(如果有) 如果不可用,请单击New 并选择或输入x86 并单击确定。 重建解决方案并运行您的应用程序。

如果这个deos不能解决你的问题,你可能需要安装32 bit版本的office system drivers。这是一个完整的article 解释问题。

【讨论】:

【参考方案4】:

经过深入研究,我找到了解决方案。

首先使用以下代码将特定的 Excel 文件转换为 html 页面。

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

我们必须下载 HTML 字符串并提取内容。 tag 包含 和 标记,但它可能具有样式属性。所以首先我们必须避免这些样式属性,然后才能从表格中获取所需的内容。

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

通过循环我们可以找到&lt;tr&gt;&lt;td&gt;元素。那么我们就可以通过这个方法获取&lt;td&gt;&lt;/td&gt;标签内的内容了。

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

【讨论】:

以上是关于如何导入 HTML 格式的 Excel的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式从iOS中的Excel工作表导入数据[复制]

如何将EXCEL格式的项目计划表转换成Project格式文件

SQLyog查询数据后如何导到excel

如何将excel中的数据导入hive仓库中

excel格式文件怎么导入至mdb文件?

如何把一个excel文件的数据导入另一个excel文件?