Excel 2007スプレッドシートのセルにコメントを追加しようとしています。私はそうするためにOpenXml SDK 2.0を使用しています。OpenXML SDKを使用したExcelスプレッドシートでのセルコメントの作成
私の使用例は次のとおりです。 OpenXMLドキュメントを最初から作成するのではなく、コピーしてそれを私の出発点として使用するテンプレートExcelファイルを作成しました。私のテンプレートファイルは、Excelがすでに私のためにWorksheetCommentPartを作成したように、セルA1にコメントを持っています。
私の問題は、コメントノードにコメントノードを追加すると、スプレッドシートが読み込まれず、回復するかどうかを尋ねるExcelの質問です。
本当に私が気になるのは、A1の元のコメントはまだ残っていますが、プログラムで追加したコメントはなくなっています。
ここで私が働いているコードです:(MemoryStreamをspreadsheetStream =新しいのMemoryStream()){ GetGradebookSpreadsheetTemplate(spreadsheetStream)を使用して
は、
using (SpreadsheetDocument spDoc = SpreadsheetDocument.Open(spreadsheetStream, true))
{
WorkbookPart wbPart = spDoc.WorkbookPart;
WorksheetPart wsPart = wbPart.WorksheetParts.First();
SheetData sheet = wsPart.Worksheet.GetFirstChild<SheetData>();
Comments comments = wsPart.WorksheetCommentsPart.Comments;
comments.Descendants<Author>().First().Text = string.Format("{0}, {1}", instructor.LastName, instructor.FirstName);
comments.Descendants<Text>().First().Text = string.Format("{0}, {1}", instructor.LastName, instructor.FirstName);
List<DefinedName> definedNames = new List<DefinedName>();
definedNames.Add(CreateDefinedName("COLWeb_Gradebook", sheet.NamespaceURI, "Gradebook", "1", "A"));
uint index = 4;
foreach (User u in users)
CreateUserDataRow(index++, definedNames, comments.CommentList, sheet, u, coursesForUsers[u], assignments, submissions[u]);
Cell lastCell = sheet.Descendants<Cell>().Last();
OpenXmlElement dimensionsElement = wsPart.Worksheet.Elements().Where(x => x.LocalName == "dimension").First();
dimensionsElement.SetAttribute(new OpenXmlAttribute("ref", null, "A1:" + lastCell.CellReference));
comments.Save();
wsPart.Worksheet.Save();
wbPart.Workbook.Save();
}
return spreadsheetStream.ToArray();
}
そして「CreateUserDataRow」新しい行を作成しますが、関連する部分は、「コメント」は、私のコメント文字列であり、「c」は、私がについてのコメントを作成したい私のセルです(あります):
if (!string.IsNullOrEmpty(comment))
{
List<OpenXmlElement> runs = new List<OpenXmlElement>();
foreach (string row in comment.Split(new string[] { "<p>", "</p>" }, StringSplitOptions.RemoveEmptyEntries))
{
string trimmed = row.Trim();
if (!string.IsNullOrEmpty(trimmed))
{
string escaped = System.Security.SecurityElement.Escape(trimmed);
runs.Add(new Run(new RunProperties(), new Text(escaped)));
}
}
Comment commentCell = new Comment();
commentCell.Reference = c.CellReference;
commentCell.AuthorId = 0;
commentCell.AppendChild(new CommentText(runs));
comments.AppendChild(commentCell);
}
今まで私の目を見ることができるように、とKDiff3のは、そのことについては、私のファイルは、私はExcelを開いて、細胞へのコメントを入れていた場合、出力されるファイルとほとんど同じですExcelで手作業で
誰かがOpenXmlでセルにコメントを付ける良い例はありますか?関係について多分知っておくべきことがありますか?それは私が作成したExcelファイルを使用して何かを持っているし、私はテンプレート(おそらくいくつかの次元が設定されていません)として使用していますか?
私は得ることができるすべてのおかげで、
Yikes。少なくとも私は今どこを見るか知っています。スプレッドシートに含まれているVMLファイルを見ても意味があります。 ありがとうございます。 –
これは正しいです。コメントを追加するにはVMLを追加する必要があります。また、VMLを追加して、Excelと同じようにアイテムに*印を付けると、その名前を変更したり名前を変更したりして、スプレッドシートが破損し、Excelがクラッシュします。 –