В следующем примере C # показано, как это сделать с помощью Open XML SDK:
public void CreateComment()
{
// Let's say we have a document called Comments.docx with a single
// paragraph saying "Hello World!".
using WordprocessingDocument wordDocument = WordprocessingDocument.Create(
"Comments.docx", WordprocessingDocumentType.Document);
MainDocumentPart mainDocumentPart = wordDocument.AddMainDocumentPart();
mainDocumentPart.Document =
new Document(
new Body(
new Paragraph(
new Run(
new Text("Hello World!")))));
// Our MainDocumentPart needs to have a related WordprocessingCommentsPart,
// which you see as the comments.xml file. That file needs to have a
// w:comments root element.
// The next line of code is the key step that adds the comments.xml file
// and the required relationships and content types. To add individual
// w:comment elements, we need the root w:comments element.
var commentsPart = mainDocumentPart.AddNewPart<WordprocessingCommentsPart>();
commentsPart.Comments = new Comments();
// The rest of the code just shows how you would use the Open XML SDK
// to add a comment.
// So say we want to comment on the whole paragraph. As a first step,
// we create a comment and add it to the w:comments root element.
var comment = new Comment(new Paragraph(new Run(new Text("This is my comment."))))
{
Id = "1",
Author = "Thomas Barnekow"
};
commentsPart.Comments.AppendChild(comment);
// Then, we need to add w:commentRangeStart and w:commentRangeEnd
// elements to the text on which we want to comment. In this example,
// we are getting "some" w:p element and some first and last w:r
// elements and insert the w:commentRangeStart before the first and
// the w:commentRangeEnd after the last w:r.
Paragraph p = mainDocumentPart.Document.Descendants<Paragraph>().First();
Run firstRun = p.Elements<Run>().First();
Run lastRun = p.Elements<Run>().Last();
firstRun.InsertBeforeSelf(new CommentRangeStart { Id = "1" });
CommentRangeEnd commentRangeEnd = lastRun.InsertAfterSelf(new CommentRangeEnd { Id = "1" });
commentRangeEnd.InsertAfterSelf(new Run(new CommentReference { Id = "1" }));
}
Таким образом, если вы можете использовать Open XML SDK, очень легко добавить часть comments.xml. Если вы не можете использовать SDK, вам придется написать собственный код, чтобы создать тот же эффект. Для этого вам нужно понять, где вносить какие изменения.
Первый шаг - создать файл comments.xml в папке / word. Пустой файл comments.xml должен выглядеть следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<w:comments xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
</w:comments>
Далее необходимо установить связь между MainDocumentPart (documents.xml) и WordprocessingCommentsPart (comments.xml). Для этого вам нужно создать или изменить файл document.xml.rels, содержащийся в папке / word / _rels. Для документа, созданного в приведенном выше примере, document.xml.rels имеет следующее содержимое (т. Е. Одну связанную дочернюю часть):
<?xml version="1.0" encoding="utf-8"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
<Relationship Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments" Target="/word/comments.xml" Id="Rf416c937546c47ef" />
</Relationships>
Последний файл для рассмотрения - [Content_Types] .xml вкорень пакета. Добавив часть comments.xml с Open XML SDK в приведенном выше примере, она имеет следующее содержимое:
<?xml version="1.0" encoding="utf-8"?>
<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
<Default Extension="xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml" />
<Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml" />
<Override PartName="/word/comments.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml" />
</Types>
Обратите внимание на последний дочерний элемент, который переопределяет тип содержимого / word/comments.xml part.