我正在尝试了解从html表中提取数据并将其导入sql表的正确或最佳方法。每周我们都会得到一个必须插入表格的html文档。我通常只使用sql管理将其导入空白表,然后将其与当前表合并。我知道一些c#所以我想创建一个自动导入器。
我正在考虑只读取每一行并通过寻找并插入这样的数据。这是最好的方式,还是有更好的方法呢?
由于
以下是html文件的示例。第1列是列名。
<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;
}
}
答案 0 :(得分: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)
});
答案 1 :(得分:1)
解析HTML的好处是HtmlAgility Pack。 Here
答案 2 :(得分:1)
如果必须以HTML格式接收文件,我会查看可以将HTML解析为可用文档结构的第三方库(例如HTMLAgilityPack)。
使用库,您可以遍历文档并从节点中提取值,而不必尝试用丑陋的代码解析它们。
我首先要创建一个表示表中一行的类。为它提供表示表格标题的属性。然后使用HTML库获取所需的值并创建所述类的实例,设置属性值,并将它们添加到集合中。
最后,打开与数据库的连接。循环遍历类集合,并使用预处理语句将数据逐个插入数据库。
使用SqlConnection
类时,请确保使用正确的处理技巧并利用using
语句,以便很好地清理您的连接。
答案 3 :(得分:0)
您可以使用HtmlAgilityPack来解析Html并将其读入DataTable对象。然后,如果要传输大量数据,可以使用常规插入或SqlBulkCopy轻松地将DataTable写入数据库。
答案 4 :(得分: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();
}
}
}