2

Excel2007スプレッドシートのセルにコメントを追加しようとしています。私はOpenXmlSDK2.0を使用しています。

私の使用例は次のとおりです。OpenXMLドキュメントを最初から作成するのではなく、コピーして開始点として使用するテンプレートExcelファイルを作成しました。テンプレートファイルのセルA1にコメントがあるため、ExcelですでにWorksheetCommentPartが作成されています。

今私の問題は、コメント部分にコメントノードを追加すると、スプレッドシートが読み込まれず、Excelが回復するかどうかを尋ねるということです。

本当に気になるのは、A1の元のコメントがまだ残っているのに、プログラムで追加したコメントがなくなってしまったことです。

これが私が使っているコードです:

using(MemoryStream SpreadsheetStream = new 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」は新しい行を作成しますが、関連する部分は次のとおりです(「comment」はコメント文字列、「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ファイルをテンプレートとして使用していることと関係がありますか(一部のディメンションが設定されていない可能性があります)?

私が得ることができるどんな助けにも感謝します。

4

2 に答える 2

0

http://openxmldeveloper.org/forums/thread/7396.aspxに、必要な VML 描画を作成する方法を示すコード サンプルがあるようです。私は今このコードを試しており、進行しているように見えますが、Excel が開く前にコメントを削除することを決定する何らかの未特定のエラーがまだ発生しています...

于 2009-12-02T02:54:47.600 に答える