poi-tl icon indicating copy to clipboard operation
poi-tl copied to clipboard

请问可以解析html标签吗?

Open zixiawallace opened this issue 5 years ago • 6 comments

Sayi您好: 现在这版本貌似不支持html的标签解析,比如p标签,u 标签,sup 标签等。如果内容里面包含html格式,则生成的word也是带有这些标签无法解析的。 另外,比如一个{{content}},它的值是“巴拉巴拉巴拉 u 下划线 /u "这种,我看通过Style设置的是完整的content的值,而不是'u'标签内的值,请问这种怎么处理呢?

zixiawallace avatar Apr 23 '19 07:04 zixiawallace

你好,暂时不支持解析,但的确是个好想法

Sayi avatar Apr 24 '19 10:04 Sayi

我在网上找了一个解析html内容的插件,不知道是否需要。

LuciferWeidy avatar Mar 12 '20 04:03 LuciferWeidy

我在网上找了一个解析html内容的插件,不知道是否需要。

请问可否共享呢?目前自己解析的,感觉会有问题。有完善的插件最好。

xuwangcheng14 avatar Mar 22 '20 13:03 xuwangcheng14

找到一种结果很完美的解决办法。 把富文本的地方当成引入外部word,如{{+html}} 然后定义变量的时候 param.put("html", new DocxRenderData(此处是一个由HTML转换为word的InputStream)) InputStream 我是用了 AsposeWord 转换的:

Document doc = new Document(); DocumentBuilder builder = new DocumentBuilder(doc); builder.insertHtml(html); ByteArrayOutputStream out = new ByteArrayOutputStream(); doc.save(out, SaveFormat.DOCX);

最后把 OutputStream 转为 InputStream 供 new DocxRenderData() 使用。 效果完美!当然了,AsposeWord 是收费的。

songlai avatar Nov 24 '20 11:11 songlai

找到一种结果很完美的解决办法。 把富文本的地方当成引入外部word,如{{+html}} 然后定义变量的时候 param.put("html", new DocxRenderData(此处是一个由HTML转换为word的InputStream)) InputStream 我是用了 AsposeWord 转换的:

Document doc = new Document(); DocumentBuilder builder = new DocumentBuilder(doc); builder.insertHtml(html); ByteArrayOutputStream out = new ByteArrayOutputStream(); doc.save(out, SaveFormat.DOCX);

最后把 OutputStream 转为 InputStream 供 new DocxRenderData() 使用。 效果完美!当然了,AsposeWord 是收费的。

我搞不懂转为inputStream后怎么使用

799452017 avatar Apr 09 '21 01:04 799452017

写了个插件,因为引入了一些依赖,不适于通过pull request提交,作为一个扩展包。 地址:https://github.com/draco1023/poi-tl-ext 有兴趣的可以试试,通过富文本编辑器得到的html大部分效果都实现了,部分特性后续完善,欢迎交流反馈。

draco1023 avatar Apr 10 '21 14:04 draco1023

基于jsoup解析html格式元素,为自定义结构元素,消除各种值嵌套关系,然后转换格式支持,输出为word段落


//

public static ParagraphTree readDomParagraph(Element element) {
		
    ParagraphTree elementTree = new ParagraphTree();
    String sub_style = element.attr("style");// 样式
    if(sub_style.trim().length() != 0) {
        String[] its = sub_style.split(";");
        for(int j=0;j<its.length;j++) {
            String[] n_v = its[j].split(":");
            elementTree.addStyle(n_v[0], n_v[1]);//
        }
    }
    String tag = element.tagName();
    List<Node> nodes = element.childNodes();
    if (element.childrenSize() == 0) {
        elementTree.setTag(tag);
        elementTree.setText(element.text());
        return elementTree;
    }
    for(int t=0;t<nodes.size();t++) {
        Node node = nodes.get(t);
        if(node instanceof TextNode) {
            ParagraphTree newTree = new ParagraphTree();
            newTree.setText(node.outerHtml());
            newTree.setTag(tag);
            newTree.setStyle(elementTree.getStyle());// TODO: 核实属性是否正确 引用父对象
            elementTree.addChild(newTree);
        }else if(node instanceof Element) {
            Element childElement = (Element)node;
            ParagraphTree clindTree = readDomParagraph(childElement);// 进入【递归】处理
            elementTree.addChild(clindTree);// 需要先构建子节点信息
        }
    }
    return elementTree;
}

xyjincan avatar Jun 15 '23 10:06 xyjincan