我想查找XWPFDocument
中某些文字的所有出现并设置其字体。无法理解如何根据Run
或类似的内容进行选择(Scanner
对象?)。
XWPFDocument doc = new XWPFDocument();
try (FileOutputStream fos = new FileOutputStream(new File("c:\\temp\\document1.docx"))){
XWPFParagraph par = doc.createParagraph();
XWPFRun run = par.createRun();
run.setText("Абзац создан командой doc.createParagraph()");
par = doc.createParagraph();
run = par.createRun();
run.setText("Чтобы хорошо читалось, на doc.createParagraph() наложен стиль");
XWPFWordExtractor we = new XWPFWordExtractor(doc);
Scanner scanner = new Scanner(we.getText());
Pattern words = Pattern.compile("doc.createParagraph()");
while (scanner.hasNextLine()) {
String key = scanner.findInLine(words);
run.getTextPosition();
while (key != null) {
scanner.next();
key = scanner.findInLine(words);
}
scanner.nextLine();
}
doc.write(fos);
} catch (Exception e) {
e.printStackTrace();
}
在@AlexisDelahaye回答之后编辑。目前的解决方法是删除现有的运行并创建新的:
XWPFDocument doc = new XWPFDocument();
try (FileOutputStream fos = new FileOutputStream(new File("c:\\temp\\document1.docx"))){
// Простой абзац с текстом
String specText = "doc.createParagraph\\(\\)";
XWPFParagraph par = doc.createParagraph();
XWPFRun run = par.createRun();
run.setText("Абзац создан командой doc.createParagraph()");
par = doc.createParagraph();
run = par.createRun();
run.setText("Чтобы хорошо читалось, на doc.createParagraph() наложен стиль");
// Смена шрифта для вхождения текста в каждый абзац
for (XWPFParagraph curPar : doc.getParagraphs()) {
String parText = curPar.getText();
boolean endWithSpec = parText.endsWith(specText.replace("\\", ""));
curPar.removeRun(0);
for (String curPart : parText.split(specText)) {
XWPFRun r = curPar.createRun();
r.setText(curPart);
r.setFontSize(10);
r = curPar.createRun();
r.setText(specText.replace("\\", ""));
r.setFontSize(20);
}
if (!endWithSpec) {
curPar.removeRun(curPar.getRuns().size() - 1);
}
}
答案 0 :(得分:2)
找到此POI-XWPF quick guide。 你是对的,你需要使用Run对象
特定文本提取
要获取特定的文本位,首先要创建一个 org.apache.poi.xwpf.XWPFDocument。
选择感兴趣的 IBodyElement (表格,段落等),然后从 得到 XWPFRun 。
最后获取文本和属性。
所以你的代码可能看起来像这样
List<XWPFRun> runs = par.getRuns();
for(int i = 0 ; i < runs.size() - 1 ; i++) {
XWPFRun run = runs.get(i);
int index=0;
// a run contains many text so you want to parse them as well :
String text = run.getText(index);
while(text !=null ){
if(text.contains("occurencyYourLookingFor")) {
run.setFontFamily("Arial");
}
text = run.getText(++index);
}
}