提问者:小点点

在粗体句子中创建字符串-ApachePOI


当字符串在句子中时,如何将其加粗?

我刚刚开始使用ApachePOI4小时前,想:

  1. 在Word文档(. docx/XWPF)中定位不同的字符串
  2. 将字符串替换为map的值
  3. 如果字符串有特殊标志,则使值显示为粗体。

我试图首先通过迭代段落(而不是运行)来解决这个问题,但它不起作用。我从这篇文章中得到了我当前的解决方案。

前两步一切都很好,现在我想让每个包含特殊标志的值(如${键:粗体}${score:粗体})粗体。我尝试创建一个新的XWPFRun来编写粗体字符串,它只是不适用于下面的代码…

ParagraphFieldReplacer.java(目前正在进行步骤1和2)

import java.util.List;
import java.util.Map;

import org.apache.poi.ooxml.POIXMLException;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;

public final class ParagraphFieldReplacer {
    
    public static void replace(final Student student, final XWPFDocument document, final Map<String, FormatObject> fields) {
        final List<XWPFParagraph> paragraphs = document.getParagraphs();
        for (final XWPFParagraph paragraph : paragraphs)
            replaceParagraph(student, paragraph, fields);
    }
    
    private static void replaceParagraph(final Student student, final XWPFParagraph paragraph, final Map<String, FormatObject> fields) throws POIXMLException {
        List<XWPFRun> runs;
        String paragraphtext;
        String runsText;
        XWPFRun nextRun;
        String target;
        XWPFRun run;
        for (final String key : fields.keySet()) {
            paragraphtext = paragraph.getText();
            if (!(paragraphtext.contains("${")))
                return;
            target = "${" + key + "}";
            if (!(paragraphtext.contains(target)))
                continue;
            runs = paragraph.getRuns();
            for (int i = 0; i < runs.size(); i++) {
                run = runs.get(i);
                runsText = run.getText(0);
                if (runsText.contains("${") || (runsText.contains("$") && runs.get(i + 1).getText(0).substring(0, 1).equals("{"))) {
                    while (!(openTagCountIsEqualCloseTagCount(runsText))) {
                        nextRun = runs.get(i + 1);
                        runsText = runsText + nextRun.getText(0);
                        paragraph.removeRun(i + 1);
                    }
                    if (!(runsText.contains(target)))
                        run.setText(runsText, 0);
                    else {
                        final FormatObject format = fields.get(key);
                        final String handle = format.handle(student);
                        run.setText(runsText.replace(target, handle), 0);
                    }
                }
            }
        }
    }
    
    private static boolean openTagCountIsEqualCloseTagCount(final String runText) {
        final int openTagCount = (runText.split("\\$\\{", -1).length - 1);
        final int closeTagCount = (runText.split("}", -1).length - 1);
        return (openTagCount == closeTagCount);
    }
    
}

FormatObject.java

public final class FormatObject {
    
    private boolean bold;
    private FormatHandler<Student, String> handler;
    
    public FormatObject(final FormatHandler<Student, String> handler, final boolean bold) {
        this.handler= handler;
        this.bold = bold;
    }
    
    public boolean isBold() {
        return bold;
    }
    
    public String handle(final ZertifikationsStudent student) {
        return handler.handle(student);
    }
    
}

FormatHandler.java

@FunctionalInterface
public interface FormatHandler<P, R> {
    
    public R handle(P p);
    
}

感谢阅读/帮助!


共1个答案

匿名用户

我前几天弄的!

将其加粗的最佳方法是在文档本身中将格式指示符加粗。

另一种方法是创建一个新的XWPFRun并将其设置为粗体。文本应该是键的值。之后,您可以将所有固定的XWPFRun添加到ArrayList中,并在删除所选段落中的每次运行后重新插入它们。然后,您可以删除包含格式指示符的旧普通XWPFRun