HTMLtable表转C#DataTable

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;
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值