htlm中table标签转成DataTable,复制可直接使用
using HtmlAgilityPack;//需在包管理其中下载
public static DataTable HtmlToDataTable(string html)
{
const string nulltxt = "everything is ok";
DataTable dt = new DataTable();
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
var tList = doc.DocumentNode.SelectNodes("//table");
if (tList != null)
{
var table = tList[0];
var rows = table.SelectNodes("//tr");
if (rows != null)
{
var colCount = 0;
foreach (var td in rows[0].ChildNodes.Where(m => m.OriginalName.ToLower() == "td"))
{
var attr = td.Attributes["colspan"];
var colspan = (attr != null) ? int.Parse(attr.Value) : 1;
colCount = colCount + colspan;
}
var rowCount = rows.Count;
var arr = new string[rowCount][];
for (var r = 0; r < rowCount; r++)
{
arr[r] = new string[colCount];
}
//填充数据
for (var row = 0; row < rowCount; row++)
{
var tr = rows[row];
var cols = tr.ChildNodes.Where(m => m.OriginalName.ToLower() == "td").ToList();
for (var column = 0; column < cols.Count; column++)
{
var cAttr = cols[column].Attributes["colspan"];
var colspan = (cAttr != null) ? int.Parse(cAttr.Value) : 1;
var rAttr = cols[column].Attributes["rowspan"];
var rowspan = (rAttr != null) ? int.Parse(rAttr.Value) : 1;
var text = string.IsNullOrEmpty(cols[column].InnerText) ? nulltxt : cols[column].InnerText;
var startColumn = 0;
for (var i = 0; i < rowspan; i++)
{
for (var j = 0; j < colspan; j++)
{
var d = startColumn == 0 ? column : startColumn;
if (string.IsNullOrEmpty(arr[row + i][d + j]))
arr[row + i][d + j] = text;
else
{
var t = column + j + 1;
startColumn = t;
while (true)
{
if (string.IsNullOrEmpty(arr[row][t]))
{
arr[row][t] = text;
break;
}
t++;
}
}
}
}
}
}
for (var i = 0; i < arr.Length; i++)
{
if (i == 0)
{
for (var j = 0; j < arr[i].Length; j++)
{
var columnTxt = arr[i][j] == nulltxt ? "Column" + j : arr[i][j];
dt.Columns.Add(columnTxt);
}
}
else
{
var row = dt.NewRow();
for (var k = 0; k < arr[i].Length; k++)
{
var columnTxt = arr[i][k] == nulltxt ? "" : arr[i][k];
row[k] = columnTxt;
}
dt.Rows.Add(row);
}
}
}
}
return dt;
}