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字符串,再就是记录跨行跨列状态!期待高手!答的好的话会追加分!
另外我做出插件来也会和大家分享!
var reCat = /(\w+)$/g;
var arrdata = data.match(reCat); for (var i = 0; i < arrdata.length; i++)
{
alert(arrdata[i]);
}
类似于java中的group
这里发言,表示您接受了CSDN社区的用户行为准则。
请对您的言行负责,并遵守中华人民共和国有关法律法规,尊重网上道德。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。
拨入碰见一个TR,行数加一,碰见一个TD列数加一,当然这是最简单的没有跨行跨列的情况下.
以下分析中,我直接忽略校验这一步,建议lz如果真要做的话,最好表格能有一个固定格式……
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)");//在需合并的单元格内拟合并的单元格位置
} }}最后还是要说明,没有考虑代码出错的情况,但现实的情况是:随意下载的页面内,不符合语法规范的代码太多太多了……
这个的基本正则是这样的
“(<tr>((<td[\\S\\s]*>([a-zA-Z0-9]+)</td>)+)</tr>)*”
还有对应的跨列colspan?如果是的话其实也可以做啊,无非是得到其中的这两个值,至于简单的打印只要在得到的结果后加个pirintln就可以了
<table>
<tr>
<td rowspan='2'>aaaa</td>
<td>bbbb</td>
</tr>
<tr>
..............
</tr>
<table>
一个tr是excel中一行,td是一列,然后根据html语法,分析tr或者td的属性,相关的估计有height,width,rowspan ,colspan等等。
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();
};
}
具体要什么样子的?不是读出来写到excel里面么?
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();
}}
另外本地使用XML替代方案我已经做出来了!计划做一个Excel<==>HTML双向切换的三方组件。以后只需要完成一方借助组件就可以获取另一方。