在我的项目中,我使用 Word 作为模板。我的主管将修改此模板并在其中发表评论。当程序生成最终文档时,需要删除模板中的所有注释。下面是我写的代码。不过,它只是删除了部分评论内容,并没有完全删除。
package com.office;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
public class BookmarkSetter {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("f:\\test.docx");
XWPFDocument document = new XWPFDocument(fis);
List<XWPFParagraph> paragraphList = document.getParagraphs();
for (XWPFParagraph paragraph : paragraphList) {
List<CTMarkupRange> start = paragraph.getCTP().getCommentRangeStartList();
for (int i = start.size() - 1; i >= 0; --i) {
paragraph.getCTP().removeCommentRangeStart(i);
}
List<CTMarkupRange> end = paragraph.getCTP().getCommentRangeEndList();
for (int i = end.size() - 1; i >= 0; --i) {
paragraph.getCTP().removeCommentRangeEnd(i);
}
}
// Save changes
FileOutputStream out = new FileOutputStream("f:\\test1.docx");
document.write(out);
out.close();
}
}
文字注释的存储方式如下:
在
/word/document.xml
:
...
<w:p ...
...
<w:commentRangeStart w:id="..."/>
...
<w:p ...
...
<w:commentRangeEnd w:id="..."/>
...
<w:r ...
...
<w:commentReference w:id="..."/>
</w:r>
...
其中
commentRangeStart
和 commentRangeEnd
标记注释的文本部分。运行元素中的 commentReference
指向存储在 /word/comments.xml
中的注释。
您的代码已经删除了所有
commentRangeStart
和 commentRangeEnd
标记,但缺少删除 commentReference
s。
因此:
...
for (XWPFParagraph paragraph : document.getParagraphs()) {
// remove all comment range start marks
for (int i = paragraph.getCTP().getCommentRangeStartList().size() - 1; i >= 0; i--) {
paragraph.getCTP().removeCommentRangeStart(i);
}
// remove all comment range end marks
for (int i = paragraph.getCTP().getCommentRangeEndList().size() - 1; i >= 0; i--) {
paragraph.getCTP().removeCommentRangeEnd(i);
}
// remove all comment references
for (int i = paragraph.getRuns().size() - 1; i >=0; i--) {
XWPFRun run = paragraph.getRuns().get(i);
if (run.getCTR().getCommentReferenceList().size() > 0) {
paragraph.removeRun(i);
}
}
}
...
但是另外
/word/comments.xml
中的评论也应该被删除:
那就是:
...
// remove all document comments
XWPFComments comments = document.getDocComments();
for (int i = comments.getComments().size() - 1; i >=0; i--) {
comments.removeComment(i);
}
...