Apach POI Word:查找文本并更改字体

时间:2016-05-20 09:04:59

标签: java apache-poi

我想查找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);
            }
        }

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);
      }
   }