2009-02-26 24 views
2

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ファイルを使用して何かを持っているし、私はテンプレート(おそらくいくつかの次元が設定されていません)として使用していますか?

私は得ることができるすべてのおかげで、

答えて

2

残念ながら、それほど簡単ではありません。

セルコメントには、VML描画部分にあるグラフィックスオブジェクトもあります。 VMLは秘密のレガシー仕様であり、承認されたECMA規格には含まれていません。 MicrosoftのOpen XML文書でその文書を見つけることはできますが、それはあまり意味がありません。うまくいけば、マイクロソフトでは、フルセルコメントのサポートと、VMLにも書かれたコントロールのサポートを追加することで、Excel 14でこれを解決することを願っています。

Open XML SDKを使用していないので、コメントを追加できるかどうかは言えません。私はちょうどあなたが正しい方向を指すのを助けるかもしれないと思った。

+0

Yikes。少なくとも私は今どこを見るか知っています。スプレッドシートに含まれているVMLファイルを見ても意味があります。 ありがとうございます。 –

+0

これは正しいです。コメントを追加するにはVMLを追加する必要があります。また、VMLを追加して、Excelと同じようにアイテムに*印を付けると、その名前を変更したり名前を変更したりして、スプレッドシートが破損し、Excelがクラッシュします。 –

0

必要なVML図面を作成する方法を示すhttp://openxmldeveloper.org/forums/thread/7396.aspxにコードサンプルがあるようです。私は今、このコードを試していますが、Excelが開く前にコメントを削除することを決めた何らかの不特定のエラーがまだ出ていますが、進んでいるようです。

関連する問題