.net c#将html Table表格转为DataTable

版权:原创 更新时间:1年以上
[该文章底部包含文件资源,可根据自己情况,决定是否下载资源使用,时间>金钱,如有需要,立即查看资源]

项目需要将html table 表格转换为Datatable对象,表格信息如下:

    <table>
        <tbody>
            <tr>
                <th>标题</th>
                <th>内容</th>
            </tr>
            <tr>
                <td>Animate(Image, EventHandler)</td>
                <td>将多帧图像显示为动画。</td>
            </tr>
            <tr>
                <td>CanAnimate(Image)</td>
                <td>返回一个布尔值,该值指示指定图像是否包含基于时间的帧。</td>
            </tr>
            <tr>
                <td>Equals(Object)</td>
                <td>确定指定对象是否等于当前对象。(继承自   Object)</td>
            </tr>
            <tr>
                <td>GetHashCode()</td>
                <td>作为默认哈希函数。(继承自   Object)</td>
            </tr>
            <tr>
                <td>GetType()</td>
                <td>获取当前实例的 Type。(继承自   Object)</td>
            </tr>
            <tr>
                <td>MemberwiseClone()</td>
                <td>创建当前 Object 的浅表副本。(继承自   Object)</td>
            </tr>
            <tr>
                <td>StopAnimate(Image, EventHandler)</td>
                <td>终止正在运行的动画。</td>
            </tr>
            <tr>
                <td>ToString()</td>
                <td>返回表示当前对象的字符串。(继承自   Object)</td>
            </tr>
            <tr>
                <td>UpdateFrames()</td>
                <td>使该帧在当前正被动画处理的所有图像中前移。 新帧在下一次呈现图像时绘制。</td>
            </tr>
            <tr>
                <td>UpdateFrames(Image)</td>
                <td>使帧在指定的图像中前移。 新帧在下一次呈现图像时绘制。 此方法只适用于包含基于时间的帧的图像。</td>
            </tr>
        </tbody>
    </table>

    <table border="1">
        <tr>
            <th>1</th>
            <th>2</th>
            <th>3</th>
            <th>4</th>
            <th>5</th>
            <th>6</th>
        </tr>
        <tr>
            <td rowspan="3">1</td>
            <td>2</td>
            <td>3</td>
            <td>4</td>
            <td>5</td>
            <td>6</td>
        </tr>
        <tr>
            <td>7</td>
            <td rowspan="2" colspan="3">8</td>
            <td>9</td>
        </tr>
        <tr>
            <td>10</td>
            <td>11</td>
        </tr>
    </table>

一个是正常的table,另外一个带有 rowspan 和 colspan ,这种情况就比较复杂.查询相关资料,发现使用HtmlAgility 类库,可以非常方便的进行HTML解析.

核心代码如下:

                DataTable dt = new DataTable();
                //获取所有的td行信息
                var rowlist = docchild.DocumentNode.SelectNodes("//tr[td]");
                if (rowlist == null) { continue; }
                //取第一行的数据,来确定总的列数
                var colcount = 0;
                foreach (var td in rowlist[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 headers = docchild.DocumentNode.SelectNodes("//tr/th");
                //如果最大的行数和标题列数相同,则取标题,其它则重新设置
                bool setcol = false;
                if (headers != null)
                {
                    if (headers.Count == colcount) { foreach (HtmlNode header in headers) { dt.Columns.Add(header.InnerText); } setcol = true; }
                }
                if (!setcol)
                {
                    for (var i = 1; i <= colcount; i++) { dt.Columns.Add("列" + i.ToString()); }
                }
                var arr = new string[rowlist.Count][];
                for (var r = 0; r < rowlist.Count; r++)
                {
                    arr[r] = new string[colcount];
                }
                for (var row = 0; row < rowlist.Count; row++)
                {
                    var cols = rowlist[row].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) ? "" : 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++)
                {
                    var row = dt.NewRow();
                    for (var k = 0; k < arr[i].Length; k++)
                    {
                        var columnTxt = arr[i][k] == "" ? "" : arr[i][k];
                        row[k] = columnTxt;
                    }
                    dt.Rows.Add(row);
                }
                listtd.Add(dt);

转化后的效果如下:

下面是随便复制一个含有多个HTML table的页面内容,然后进行转换:

附件:下载该文件资源,减少时间成本(增值服务)
.net c#将html Table表格转为DataTable
HtmlAgility.dll 为第三方控件,版权归原开发者所有,如果商用,请慎重,避免版权纠纷
不商用,只限学习使用,使用后请删除
上传者拥有该资源完整版权,下载既表明已授权您可以进行报备商用,无报备或者使用后报备,视为侵权,报备后使用,为合法有效使用,报备方式,下载后,在下载列表,点击报备,填写使用场景即可
File Source
.rar
314.15 KB
文件部分展示图(单击放大)
.net c#将html Table表格转为DataTable.net c#将html Table表格转为DataTable.net c#将html Table表格转为DataTable
留言
该资源可下载
File Source
.rar
314.15 KB
.net c#将html Table表格转为DataTable.net c#将html Table表格转为DataTable.net c#将html Table表格转为DataTable
最新结算
股权转让协议意向书模板
类型: .docx 金额: CNY 2.23¥ 状态: 待结算 详细>
股权转让协议意向书模板
类型: .docx 金额: CNY 0.28¥ 状态: 待结算 详细>
CSS3图片向上3D翻转渐隐消失特效
类型: .rar 金额: CNY 0.29¥ 状态: 待结算 详细>
CSS3图片向上3D翻转渐隐消失特效
类型: .rar 金额: CNY 2.31¥ 状态: 待结算 详细>
.net c# 将金额转人名币大写金额
类型: .rar 金额: CNY 2.39¥ 状态: 待结算 详细>
.net c# 将金额转人名币大写金额
类型: .rar 金额: CNY 0.3¥ 状态: 待结算 详细>
合伙退伙协议书范本模板
类型: .doc 金额: CNY 2.23¥ 状态: 待结算 详细>
合伙退伙协议书范本模板
类型: .doc 金额: CNY 0.28¥ 状态: 待结算 详细>
合伙退伙协议书范本模板
类型: .doc 金额: CNY 2.23¥ 状态: 待结算 详细>
合伙退伙协议书范本模板
类型: .doc 金额: CNY 0.28¥ 状态: 待结算 详细>
我们力求给您提供有用的文章,再此基础上,会附加营收资源,不做任何广告,让平台可以更好发展 若您发现您的权利被侵害,或使用了您的版权,请发邮件联系 sunlifel@foxmail.com ggbig觉得 : 不提供源码的文章不是好文章
合作伙伴
联系我们
  • QQ:21499807
  • 邮箱:sunlifel@foxmail.com
  • QQ扫一扫加QQ
    QQ扫一扫
Copyright 2023-2024 ggbig.com·皖ICP备2023004211号-1
打赏文章