1

我正在开发一个软件,它正在读取Word文档(XWPF),根据用户之前的配置更改语法,并将修改后的文本写回文档中。

为此,我使用了 Apache POI (3.10)。在大多数情况下,它按预期工作,但在极少数情况下,情况并非如此。

更具体地说,代码逐段遍历整个文档。我的代码通过设置运行的文本来更改段落的内容。

为了更好地了解我在说什么:

    XWPFDocument oldDoc = document;
    Iterator<XWPFParagraph> iterator = document.getParagraphsIterator();
    int length = title.length();
    int counter = 0;

    while(iterator.hasNext())
    {
        XWPFParagraph paragraph = iterator.next();
        List<XWPFRun> runs = paragraph.getRuns();
        for(int i = 0; i < runs.size(); i++)
        {
            String text = runs.get(i).toString();
            if(text.contains(title)) {
                runs.get(i).setText(StringFunctions.fromMultiFemaleToSingleMale(text, title, length), 0); 
            }
        }

        document.setParagraph(paragraph, counter);
        counter++;
    }

如您所见,我将段落的每一个运行都放入我的转换方法中,并覆盖运行的文本。在这一点上没有问题(我认为)。

我的问题是,有两三个句子(或段落)在运行时不会返回整个文本。下面是一个例子。

para.getText () 返回: Alle Beteiligten weisen daher den Notar gem。§ 53 BeurkG an, die Umschreibung gemäß dieser Vollmacht durch Eigenurkunde erst zu veranlassen, nachdem der Verkäufer den Eingang des geschuldeten Betrages originalschriftlich bestätigt haben oder hilfsweise die Käuferinnen die Zahlung des vereinbarten Kaufpreises duch.bank.

而paragraph.getRuns() 的串联返回:Alle Beteiligten weisen daher den Notar gem。§ 53 BeurkG an, die Umschreibung gemäß dieser Vollmacht durch Eigenurkunde erst zu veranlassen, nachdem die Verkäufer den Eingang des geschuldeten Betrages originalschriftlich bestätigt haben oder hilfsweise die Käuferinnen die Zahlung des vereinbarten Kaufpreises (jeweils ohne Zinsen)

你可以在这里看到,最后三个词不见了。由于我正在访问运行,因此最后一部分将被忽略并且永远不会被我的方法转换。但在这种情况下,我需要转换最后一个单词以使其语法正确。

有没有人经历过类似的事情?

我试图找到一种解决方法,但我没有找到。我的一位同事与我谈论了这一点,并提到他经历过类似的事情,有时在 Word 文档的类似 XML 的结构中存在类似缺陷,Word 仍然可以使用它,但 POI 不太好. 这听起来不太可能,因为我使用的文档曾经是旧的 Word 格式 (.doc),并在 Word 2007 中保存为 .docx。

4

1 回答 1

0

在 3.17 中仍然可以观察到。

如果我的word文档有这样的遗漏:

Mr. Fancy Employee
Big Firm Manager
Nice Street 1       
1234 Best City              
                            McFly Martin
                            301 Clontarf Road
3 - Dublin Irland


Order Confirmation
Dear McFly Martin,
We confirm to having received your order (Vote ID: ${name}) on the 23.08.2014 18:23. Your payment amounts to £300.0.



Best regards,


Fancy Employee
Big Firm Manager

但是我通过 wordExtractor.getText() 遗漏了一件事

Mr. Fancy Employee
Big Firm Manager
Nice Street 1       
1234 Best City              


 -  


Order Confirmation
Dear  ,
We confirm to having received your order (Vote ID: ) on the . Your payment amounts to £.



Best regards,


Fancy Employee
Big Firm Manager

另一个错过了点亮所有 getRuns()

Mr. Fancy Employee
Big Firm Manager
Nice Street 1
1234 Best City
null

null
 -


null
null
Order Confirmation
Dear 

,
We confirm to having received your order (
Vote 
ID: 
)
 on the 
. Your payment amounts to
 £
.
null
null
null
Best regards,
null
null
Fancy Employee
Big Firm Manager
于 2018-07-29T20:53:52.650 回答