java - Apache POI 字 : find text and change font

标签 java apache-poi

我想找到XWPFDocument中某些文本的所有出现并设置其字体。无法理解如何基于 Scanner 或类似的东西获取选择(可能是 Run 对象?)。

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

最佳答案

找到这个POI-XWPF quick guide 。 你是对的,你需要使用 Run 对象

Specific Text Extraction

To get specific bits of text, first create a org.apache.poi.xwpf.XWPFDocument.

Select the IBodyElement of interest (Table, Paragraph etc), and from there get a XWPFRun.

Finally fetch the text and properties from that.

所以你的代码可能看起来像这样

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

关于java - Apache POI 字 : find text and change font,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37342488/

相关文章:

java - 在 Java AES 加密中使用提供程序

java - 一旦另一个 spring bean 被初始化,有没有人有一个好的模式来初始化一个 spring bean?

java - 读取 excel 文件 --> 使用 java 的 xlsx 格式

java - 如何在不丢失格式的情况下使用 POI 将一个 .docx 中的某些内容复制到另一个 .docx ?

java - Child 类 Java 中的向下转型参数

Java DecimalFormat 将不正确的十进制数解析为整数

java - 如何使用 java swing 创建捕捉组件?

java - 使用 XSSFWorkbook 创建 xlsx 文件,但在使用方法 createSheet ("String"时出错)

Java apache poi 错误 : java. lang.IllegalArgumentException:未知错误类型:-60

java - java处理word文档的问题