2009-02-26 7 views
2

Excel 2007 스프레드 시트의 셀에 주석을 추가하려고합니다. OpenXml SDK 2.0을 사용하고 있습니다.OpenXML SDK를 사용하여 Excel 스프레드 시트에서 셀 주석 만들기

사례 : OpenXML 문서를 처음부터 만들지 않고 필자가 복사하여 사용하는 템플릿 Excel 파일을 만들었습니다. 내 템플릿 파일에 A1 셀에 주석이있어서 Excel이 이미 나를 위해 WorksheetCommentPart를 만들었습니다.

내 문제는 주석 부분에 주석 노드를 추가 할 때 스프레드 시트가로드되지 않고 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 문서에서이 문서를 찾을 수 있지만 그다지 좋지 않습니다. Microsoft는 Excel 14에서도 VML에 작성된 컨트롤을 지원할뿐 아니라 전체 셀 주석 지원 기능을 추가하여이 문제를 해결하기를 바랍니다.

그렇다고해서 Open XML SDK를 사용하지 않았기 때문에 주석을 추가 할 수 있는지 여부를 말할 수는 없습니다. 나는 이것이 당신을 올바른 방향으로 인도하는 데 도움이 될 것이라고 생각했습니다.

+0

Yikes. 적어도 나는 지금 어디에서보아야하는지 알고 있습니다. 이제 내 스프레드 시트에 포함 된 VML 파일을보고 있지만 의미가 있습니다. 감사합니다. –

+0

이것은 맞습니다. 주석을 추가하려면 VML을 추가해야합니다.또한 VML을 추가하고 * Excel *과 같은 항목에 * 번호를 붙이지 않거나 레이블을 지정하지 않으면 이름이 바뀌고 이름이 바뀌어 이후에 스프레드 시트가 손상되어 Excel = Yuk!이 (가) 손상됩니다. –

0

http://openxmldeveloper.org/forums/thread/7396.aspx에 필요한 VML 도면을 만드는 방법을 보여주는 코드 샘플이있는 것 같습니다. 나는이 코드를 지금 시도하고 있는데, Excel이 열리기 전에 주석이 떨어지는 것을 결정하는 일종의 불특정 오류가 여전히 발생하고 있지만, 앞으로 나아갈 것으로 보인다 ...

관련 문제