String aa="<tr><td>11</td><td>12</td></tr>"
+"<tr><td>21</td><td>22</td></tr>"
+"<tr><td>31</td><td>32</td></tr>";
输入一个table HTML字符串,按表格格式打印
简单格式:
11  12
21  22
31  32
跨行跨列  11跨2列,12跨2行
 11    12
21 22  
31 32  33说明:tr td标签可能有属性,如<td width="" style="clor:red">等。
我正在做一个HTML文本抓取生成Excel的插件,需要扫描整个HTML表格,得出表头 表数据 适应多种情况,包括跨列跨行等。
向各位高手求教了!
有什么想法或者代码片段,欢迎分享啊!
个人觉得难点是分析HTML字符串,再就是记录跨行跨列状态!期待高手!答的好的话会追加分!
另外我做出插件来也会和大家分享!

解决方案 »

  1.   

    /<td.*?>(\d*?)<\/td>/js中的正则! 你试试 !!然后可以取出你想要的数字   具体如何取出想要的数字 看下面的例子
      var reCat = /(\w+)$/g;   
        var arrdata = data.match(reCat);    for (var i = 0; i < arrdata.length; i++)
        {
            alert(arrdata[i]);
        }  
    类似于java中的group
      

  2.   

    很久没接分每天回帖即可获得10分可用分!小技巧:教您如何更快获得可用分  
    这里发言,表示您接受了CSDN社区的用户行为准则。 
    请对您的言行负责,并遵守中华人民共和国有关法律法规,尊重网上道德。 
    转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。 
     
      

  3.   

    当然不能只用正则表达式了!我是用正则流式解析字符串.然后用变量什么的记录解析的结果.
    拨入碰见一个TR,行数加一,碰见一个TD列数加一,当然这是最简单的没有跨行跨列的情况下.
      

  4.   

    是否table嵌套,是否100%符合html语法?
      

  5.   

    首先声明,个人认为lz这种程序有些吃力不讨好,毕竟html的语法太灵活,要是不事先对html代码做检查的话,程序健壮性会大打折扣,如果做校验,就涉及到lz要的正则表达式,但这个正则表达式太复杂,不好写,再加上网上不少网页本身就存在语法错误,这个校验,难做啊……
    以下分析中,我直接忽略校验这一步,建议lz如果真要做的话,最好表格能有一个固定格式……
      

  6.   

    这个问题的难点在于单元格可能跨行跨列,具体跨行跨列的个数可以利用查找td或th后的colspan、rowspan标签之后的数字来获得,我处理的思路是,写入excel文件分2遍进行,第一遍在遇到跨行跨列的单元格,只在其左上方单元格内记录其值,其他包含的单元格内标注与哪个单元格合并,第二遍合并所有需要合并的单元格。
      

  7.   

    给出一个简单的伪代码:
    while(htnl代码流未结束)
    {
      string str=读入一个<>或<>内的内容;//保证标签内容的完整性
      int row,line;//指示当前要写入excel格的位置;
      if(str中包含table){
        row=0;
        line=0;//初始化
      }
      else if(str中包含tr){
        row+=1;//换行
        line=0;//列清零
      }
      else if(str中包含td){//具体到单元格了
        line+=1;//后面一个格
        if(str中包含colspan)//多列
           int colspan=colspan标签后的值;
        if(str中包含rowspan)//多行
           int rowspan=rowspan标签后的值;
        string data=读入下一个</td>前的所有内容;
        string temp=读入excel文件中[row,line]单元格的内容;
        while(strcmp(temp,"")!=0){//当前单元格有内容
          line+=1;//向后顺延
          temp=读入excel文件中[row,line]单元格的内容;
        }
        write(row,line,data);//将temp的内容写入excel中[row,line]的单元格内
        for(int i=1;i<colspan;i++){
            write(row,line+i,"(row,line)");//在需合并的单元格内拟合并的单元格位置,这时不需要判断单元格是否为空,除非代码错误
        }
        for(int i=1;i<rowspan;i++){
            write(row+i,line,"(row,line)");//在需合并的单元格内拟合并的单元格位置
        }  }}最后还是要说明,没有考虑代码出错的情况,但现实的情况是:随意下载的页面内,不符合语法规范的代码太多太多了……
      

  8.   

    这个你得去看看正则的 适配,贪婪,惰性!"<tr><td>11</td><td>12</td></tr>"
    这个的基本正则是这样的
    “(<tr>((<td[\\S\\s]*>([a-zA-Z0-9]+)</td>)+)</tr>)*”
      

  9.   

    你说的跨行是指其中rowspan属性决定的吗?
    还有对应的跨列colspan?如果是的话其实也可以做啊,无非是得到其中的这两个值,至于简单的打印只要在得到的结果后加个pirintln就可以了
      

  10.   

    试试把table的片段转化成一个xml文件,然后根据HTML语法分析进行打印,例如
    <table>
      <tr>
          <td rowspan='2'>aaaa</td>
          <td>bbbb</td>
      </tr>
      <tr>
       ..............
      </tr>
    <table>
    一个tr是excel中一行,td是一列,然后根据html语法,分析tr或者td的属性,相关的估计有height,width,rowspan ,colspan等等。
      

  11.   


    String aa="<tr><td>11</td><td>12</td></tr>"
                +"<tr><td>21</td><td>22</td></tr>"
                +"<tr><td>31</td><td>32</td></tr>";
    Pattern p=Pattern.compile("<td[^/]*>(\\d+)</td>");
    Matcher m=p.matcher(aa);
    while(m.find()){
    System.out.print(m.group(1)+" ");
        if("</tr>".equals(aa.substring(m.end(),m.end()+5))){
        System.out.println();
        };
    }
      

  12.   

    特别感谢你的思路!转换成XML简单多了,省略了解析过程,一下子把解析这个难点避免了!当然前提是HTML编码要严谨的代码风格,不出现不符合XML的情况。
      

  13.   


    具体要什么样子的?不是读出来写到excel里面么?
      

  14.   

    不跨行列的:
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;public class test { public test() { String aa = "<tr><td>11</td><td>12</td></tr>"
    + "<tr><td>21</td><td>22</td></tr>"
    + "<tr><td>31</td><td>32</td></tr>";
    Pattern pTr = Pattern.compile("<tr.*?>.*?<\\s*/tr.*?>");
    Matcher mTr = pTr.matcher(aa);
    Pattern pTd = Pattern.compile("<td.*?>.*?<\\s*/td.*?>");
    Matcher mTd = null;
    while (mTr.find()) {
    mTd = pTd.matcher(mTr.group());
    while (mTd.find()) {
    System.out.print(mTd.group().replaceAll("<.*?>", "") + "\t");
    }
    System.out.println();
    }
    } public static void main(String[] args) {
    new test();
    }}
      

  15.   

    刚改一个昵称,测试一下!大家多支持!
    另外本地使用XML替代方案我已经做出来了!计划做一个Excel<==>HTML双向切换的三方组件。以后只需要完成一方借助组件就可以获取另一方。
      

  16.   

    这里发言,表示您接受了CSDN社区的用户行为准则。