1

我正在尝试了解从 html 表中提取数据并将其导入 sql 表的正确或最佳方法。每周我们都会收到一个 html 文档,我必须将其插入到表格中。我通常只是使用sql管理将其导入空白表,然后将其与当前表合并。我知道一些 c#,所以我想创建一个导入器来自动化一点。

我正在考虑只阅读每一行并通过寻找并插入这样的数据。这是最好的方法,还是有更好的方法?

谢谢

这是html文件的示例。第一列是列名。

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<style>
    br
    {mso-data-placement:same-cell;}
</style>
</head>
<body>
<table border="1">
<tr><td><b>#</b></td>
<td><b>Asset Manager</b></td>
<td><b>Billing Address</b></td>
<td><b>Billing City</b></td>
<td><b>Billing State</b></td>
<td><b>Billing Zip Code</b></td>
<td><b>Contract Amount</b></td>
<td><b>DUNS Number</b></td>
<td><b>FEIN</b></td>
</tr>
<tr>
<td>1</td>
<td  style="mso-number-format:\@">Jim Bob</td>
<td  style="mso-number-format:\@">2500 N. Park Pkwy, Suite 600</td>
<td  style="mso-number-format:\@">Plano</td>
<td>Texas</td>
<td  style="mso-number-format:\@">75093</td>
<td>$0.00</td>
<td  style="mso-number-format:\@"></td>
<td  style="mso-number-format:\@"></td>
</tr>

</table>
</body>
</html>

到目前为止,我创建了一个按钮来获取文档名称。还将 SQLConnection 设置为正确的服务器。

private void buttonBrowse_Click(object sender, EventArgs e)
{
        var DB = new System.Windows.Forms.OpenFileDialog();
        if (DB.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            string fileToOpen = DB.FileName;
            textBoxImport.Text = fileToOpen;

        }
    }
4

5 回答 5

3

正如其他人提到的,您可以使用HtmlAgilityPack.

这是一个例子:

DTO:

public class Customer
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Address { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string Zip { get; set; }
    public decimal Amount { get; set; }
    // etc
}

用法:

var data = @"<html>
<head>
    <meta http-equiv=""Content-Type"" content=""text/html; charset=UTF-8"" >
<style>
    br
    {mso-data-placement:same-cell;}
</style>
</head>
<body>
<table border=""1"">
<tr><td><b>#</b></td>
<td><b>Asset Manager</b></td>
<td><b>Billing Address</b></td>
<td><b>Billing City</b></td>
<td><b>Billing State</b></td>
<td><b>Billing Zip Code</b></td>
<td><b>Contract Amount</b></td>
<td><b>DUNS Number</b></td>
<td><b>FEIN</b></td>
</tr>
<tr>
<td>1</td>
<td  style=""mso-number-format:\@"">Jim Bob</td>
<td  style=""mso-number-format:\@"">2500 N. Park Pkwy, Suite 600</td>
<td  style=""mso-number-format:\@"">Plano</td>
<td>Texas</td>
<td  style=""mso-number-format:\@"">75093</td>
<td>$0.00</td>
<td  style=""mso-number-format:\@""></td>
<td  style=""mso-number-format:\@""></td>
</tr>

</table>
</body>
</html>";

string xmlData;

// Create the document   
var document = new HtmlDocument();
document.LoadHtml(data);
document.OptionOutputAsXml = true;

// Write it to Xml so we can use XDocument Linq
using(var stream = new StringWriter())
using(var writer = XmlWriter.Create(stream))
{
    document.Save(writer);
    xmlData = stream.ToString();
}

// Use XDocument Linq to parse the xml into Customer objects
var customers = 
    XDocument.Parse(xmlData)
            .XPathSelectElements("//table/tr")
            .Skip(1)
            .Select(x => new Customer {
                Id     =     int.Parse(x.Elements("td").First().Value),
                Name   =               x.Elements("td").Skip(1).First().Value,
                Address=               x.Elements("td").Skip(2).First().Value,
                City   =               x.Elements("td").Skip(3).First().Value,
                State  =               x.Elements("td").Skip(4).First().Value,
                Zip    =               x.Elements("td").Skip(5).First().Value,
                Amount = decimal.Parse(x.Elements("td").Skip(6).First().Value,
                                       System.Globalization.NumberStyles.Currency)
            });
于 2013-07-03T14:16:26.813 回答
1

适合解析 HTML 的是 HtmlAgility Pack。这里

于 2013-07-03T13:50:53.970 回答
1

如果您必须接收 HTML 格式的文件,我会研究可以将 HTML 解析为可用文档结构的第三方库(例如HTMLAgilityPack)。

使用库,您可以遍历文档并从节点中提取值,而无需尝试使用丑陋的代码解析它们。

我将首先创建一个代表表中一行的类。给它代表表格标题的属性。然后使用 HTML 库获取所需的值并创建所述类的实例,设置属性值,并将它们添加到集合中。

最后,打开与数据库的连接。循环遍历类的集合,并使用准备好的语句将它们的数据一一插入到您的数据库中。

使用SqlConnection该类时,请确保应用适当的处理技术并利用该using语句,以便很好地清理您的连接。

于 2013-07-03T13:52:49.947 回答
0

您可以使用HtmlAgilityPack解析 Html 并将其读入DataTable对象。如果要传输大量数据,则可以使用常规插入或SqlBulkCopy轻松地将 DataTable 写入数据库。

于 2013-07-03T13:50:45.337 回答
0

这就是您如何将 HTML 表的内容加载到数据表中的方法,然后您可以从数据表更新您的真实表...这可能是一个好的开始,试一试,您可以复制粘贴它以运行控制台应用程序

namespace ConsoleApplication4   {
    class Program
{
    static void Main(string[] args)
    {
        XmlDocument doc = new XmlDocument();

    doc.LoadXml(@"<table border='1' cellpadding='0' cellspacing='0'>
                <tr>
                <td width='50%'>cell 1a</td>
                <td width='50%'>cell 1b</td>
                </tr>
                <tr>
                <td width='50%'>cell 2a</td>
                <td width='50%'>cell 2b</td>
                </tr>
                </table>");

    DataTable dt = new DataTable();

    dt.Columns.Add("Col1");

    dt.Columns.Add("Col2");

    foreach (XmlNode ndRow in doc.DocumentElement.ChildNodes)
    {
    DataRow dr = dt.NewRow();
    for (int colIndex = 0; colIndex < ndRow.ChildNodes.Count; colIndex++)
    dr[colIndex] = ndRow.ChildNodes[colIndex].InnerText;
    dt.Rows.Add(dr);
    }

    foreach (DataRow r in dt.Rows) {
        Console.Write(r[0] + " --- " + r[1] );
        Console.WriteLine("");
    }

    Console.ReadLine();

}
    }
}
于 2013-07-03T14:28:04.063 回答