如何为同一段落设置定义不同的样式

时间:2019-01-19 15:13:36

标签: apache ms-word apache-poi

我正在尝试转换html文本以生成单词表。它工作得很好,并且除字符样式外,创建的单词文件是正确的。

这是我第一次尝试使用Apache POI。

到目前为止,我已经能够从文本段落中检测到换行(
)标记(请参见下面的代码)。但是我还要检查其他一些标签,例如

  • ,并为每个部分设置正确的运行值。

    例如:
    这是我的文字,,现在以斜体,但也以粗体显示,具体取决于其重要性

    我想我应该解析文本,并对每个部分应用不同的运行,但是我不知道该怎么做。

    private static  XWPFParagraph getTableParagraph(XWPFTableCell  cell,  String text)
    {   
        int fontsize= 11; 
        XWPFParagraph paragraph = cell.addParagraph();
        cell.removeParagraph(0);
        paragraph.setSpacingAfterLines(0);
        paragraph.setSpacingAfter(0);
        XWPFRun myRun1 = paragraph.createRun();
        if (text==null) text="";
        else
        {
            while (true)
            {
                int x = text.indexOf("<br>"); 
                if (x <0) break;
                String work = text.substring(0,x );
                text= text.substring(x+4);
                myRun1.setText(work);
                myRun1.addBreak();
            }
        }
    
        myRun1.setText(text);
        myRun1.setFontSize(fontsize);
        return paragraph;
    }
    
  • 1 个答案:

    答案 0 :(得分:2)

    在转换HTML文本时,切勿仅使用字符串方法继续进行HTMLXMLHTML是标记语言。它们的内容是标记,而不仅仅是纯文本。需要遍历标记以获取所有单个节点及其含义。这种遍历过程绝非易事,因此有特殊的库可供使用。这些库的深处也需要使用字符串方法,但是将它们包装到用于遍历标记的有用方法中。

    例如,可以使用HTML jsoup进行遍历。特别是NodeTraversor使用NodeVisitor对于遍历HTML很有用。

    我的示例创建了一个实现ParagraphNodeVisitor的{​​{1}}。此接口请求方法NodeVisitor在每次public void head(Node node, int depth)在节点头时调用,而NodeTraversor在每次public void tail(Node node, int depth)在节点尾部时调用。在那些方法中,可以实现用于处理单个节点的过程。在我们的案例中,该过程的主要部分是是否需要新的NodeTraversor以及该运行需要哪些设置。

    示例:

    XWPFRun

    结果:

    enter image description here

    免责声明:这是一个显示原理的工作草案。它既未完全准备就绪,也未准备好在生产环境中使用代码。