当字符串在句子中时,如何将其加粗?
我刚刚开始使用ApachePOI4小时前,想:
我试图首先通过迭代段落(而不是运行)来解决这个问题,但它不起作用。我从这篇文章中得到了我当前的解决方案。
前两步一切都很好,现在我想让每个包含特殊标志的值(如${键:粗体}
或${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);
}
感谢阅读/帮助!
我前几天弄的!
将其加粗的最佳方法是在文档本身中将格式指示符加粗。
另一种方法是创建一个新的XWPFRun
并将其设置为粗体
。文本应该是键的值。之后,您可以将所有固定的XWPFRun
添加到ArrayList
中,并在删除所选段落中的每次运行后重新插入它们。然后,您可以删除包含格式指示符的旧普通XWPFRun
。