如何通过Apache Poi添加评论

我正在尝试通过apache poi api向MS Word文档添加评论。

我已经通过使用完成了部分工作:

CTMarkupRange commentStart = paragraph.getCTP().addNewCommentRangeStart();

commentStart.setId(BigInteger.ZERO);

XWPFRun run = paragraph.createRun();

run.setText("text");

CTMarkupRange commentEnd = paragraph.getCTP().addNewCommentRangeEnd();

commentEnd.setId(BigInteger.ZERO);

CTR ctr = paragraph.getCTP().addNewR();

CTMarkup ctMarkup = ctr.addNewCommentReference();

ctMarkup.setId(BigInteger.ZERO);

但是我不知道如何将其链接到真实注释,并且在api文档中也找不到任何相关内容。

有人知道如何解决吗?

回答:

在Office OpenXML Word文档(XWPF)中,注释是CommentsDocument/word/comments.xml*

.docx

ZIP存档中的特殊内容。因此,首先我们需要访问该文档。但是直到现在,它们XWPFdocument只会在创建时读取该软件包的一部分。没有写访问权限,也没有创建该程序包部件的可能性。

因此,我们首先必须提供这样一种可能性,以便/word/comments.xml在* .docx ZIP归档文件中创建程序包部件并对其进行写访问。

在下面的示例中,该方法MyXWPFCommentsDocument createCommentsDocument(XWPFDocument

document)创建包装零件/word/comments.xml及其相关关系。该类MyXWPFCommentsDocument是对该包装部件具有写访问权的包装器类。

import java.io.*;

import org.apache.poi.*;

import org.apache.poi.openxml4j.opc.*;

import org.apache.xmlbeans.*;

import org.apache.poi.xwpf.usermodel.*;

import static org.apache.poi.POIXMLTypeLoader.DEFAULT_XML_OPTIONS;

import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;

import javax.xml.namespace.QName;

import java.math.BigInteger;

import java.util.GregorianCalendar;

import java.util.Locale;

public class CreateWordWithComments {

//a method for creating the CommentsDocument /word/comments.xml in the *.docx ZIP archive

private static MyXWPFCommentsDocument createCommentsDocument(XWPFDocument document) throws Exception {

OPCPackage oPCPackage = document.getPackage();

PackagePartName partName = PackagingURIHelper.createPartName("/word/comments.xml");

PackagePart part = oPCPackage.createPart(partName, "application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml");

MyXWPFCommentsDocument myXWPFCommentsDocument = new MyXWPFCommentsDocument(part);

String rId = "rId" + (document.getRelationParts().size()+1);

document.addRelation(rId, XWPFRelation.COMMENT, myXWPFCommentsDocument);

return myXWPFCommentsDocument;

}

public static void main(String[] args) throws Exception {

XWPFDocument document = new XWPFDocument();

MyXWPFCommentsDocument myXWPFCommentsDocument = createCommentsDocument(document);

CTComments comments = myXWPFCommentsDocument.getComments();

CTComment ctComment;

XWPFParagraph paragraph;

XWPFRun run;

//first comment

BigInteger cId = BigInteger.ZERO;

ctComment = comments.addNewComment();

ctComment.setAuthor("Axel Ríchter");

ctComment.setInitials("AR");

ctComment.setDate(new GregorianCalendar(Locale.US));

ctComment.addNewP().addNewR().addNewT().setStringValue("The first comment.");

ctComment.setId(cId);

paragraph = document.createParagraph();

paragraph.getCTP().addNewCommentRangeStart().setId(cId);

run = paragraph.createRun();

run.setText("Paragraph with the first comment.");

paragraph.getCTP().addNewCommentRangeEnd().setId(cId);

paragraph.getCTP().addNewR().addNewCommentReference().setId(cId);

//paragraph without comment

paragraph = document.createParagraph();

run = paragraph.createRun();

run.setText("Paragraph without comment.");

//second comment

cId = cId.add(BigInteger.ONE);

ctComment = comments.addNewComment();

ctComment.setAuthor("Axel Ríchter");

ctComment.setInitials("AR");

ctComment.setDate(new GregorianCalendar(Locale.US));

ctComment.addNewP().addNewR().addNewT().setStringValue("The second comment.");

ctComment.setId(cId);

paragraph = document.createParagraph();

paragraph.getCTP().addNewCommentRangeStart().setId(cId);

run = paragraph.createRun();

run.setText("Paragraph with the second comment.");

paragraph.getCTP().addNewCommentRangeEnd().setId(cId);

paragraph.getCTP().addNewR().addNewCommentReference().setId(cId);

//write document

document.write(new FileOutputStream("CreateWordWithComments.docx"));

document.close();

}

//a wrapper class for the CommentsDocument /word/comments.xml in the *.docx ZIP archive

private static class MyXWPFCommentsDocument extends POIXMLDocumentPart {

private CTComments comments;

private MyXWPFCommentsDocument(PackagePart part) throws Exception {

super(part);

comments = CommentsDocument.Factory.newInstance().addNewComments();

}

private CTComments getComments() {

return comments;

}

@Override

protected void commit() throws IOException {

XmlOptions xmlOptions = new XmlOptions(DEFAULT_XML_OPTIONS);

xmlOptions.setSaveSyntheticDocumentElement(new QName(CTComments.type.getName().getNamespaceURI(), "comments"));

PackagePart part = getPackagePart();

OutputStream out = part.getOutputStream();

comments.save(out, xmlOptions);

out.close();

}

}

}


这适用于apache poi 3.17。由于apache poi 4.0.0ooxml部分被分开。因此必须有:

...

import org.apache.poi.ooxml.*;

...

import static org.apache.poi.ooxml.POIXMLTypeLoader.DEFAULT_XML_OPTIONS;

...

以上是 如何通过Apache Poi添加评论 的全部内容, 来源链接: utcz.com/qa/398220.html

回到顶部