إنشاء تعليقات الخلايا في جدول بيانات Excel باستخدام OpenXML SDK

StackOverflow https://stackoverflow.com/questions/592189

  •  09-09-2019
  •  | 
  •  

سؤال

أحاول إضافة تعليقات إلى الخلايا في جدول بيانات Excel 2007.أنا أستخدم OpenXml SDK 2.0 للقيام بذلك.

حالة الاستخدام الخاصة بي هي:لقد قمت بإنشاء ملف Excel لقالب قمت بنسخه واستخدامه كنقطة بداية، بدلاً من إنشاء مستند OpenXML من البداية.يحتوي ملف القالب الخاص بي على تعليق في الخلية A1 بحيث يكون Excel قد قام بالفعل بإنشاء WorksheetCommentPart لي.

مشكلتي الآن هي أنه عندما أقوم بإضافة عقد التعليق إلى جزء التعليقات، لا يتم تحميل جدول البيانات ويسألك Excel عما إذا كنت أرغب في الاسترداد.

ما يزعجني حقًا هو أن تعليقي الأصلي في A1 لا يزال موجودًا، لكن أي تعليقات أضفتها برمجيًا قد اختفت!

إليك الكود الذي أعمل معه:

باستخدام (MemoryStream TermsheetStream = new MemoryStream ()) {getGradeBookSpreadSheetTemplate (جدول البيانات) ؛

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 الذي قمت بإنشائه ثم أستخدمه كقالب (ربما لم يتم تعيين بعض الأبعاد)؟

شكرا على أي مساعدة يمكنني الحصول عليها.

هل كانت مفيدة؟

المحلول

لسوء الحظ، فإنه ليس بهذه البساطة.

تحتوي تعليقات الخلية أيضًا على كائن رسومي موجود في جزء رسم VML.VML عبارة عن مواصفات قديمة مشفرة وليست ضمن معيار ECMA المعتمد.يمكنك العثور على وثائق عنها في مستندات Microsoft Open XML، ولكنها ليست جميلة.نأمل أن تعالج Microsoft هذا الأمر في Excel 14 عن طريق إضافة دعم كامل لتعليقات الخلية بالإضافة إلى دعم عناصر التحكم المكتوبة أيضًا في VML.

ومع ذلك، لم أستخدم Open XML SDK ولا أستطيع أن أقول ما إذا كان من الممكن إضافة تعليقات معها أم لا.اعتقدت أن هذا قد يساعدك في توجيهك في الاتجاه الصحيح.

نصائح أخرى

يبدو أن هناك نموذج التعليمات البرمجية في http://openxmldeveloper.org/forums/thread/7396.aspx والذي يوضح كيفية إنشاء رسم VML المطلوب.أحاول الآن تجربة هذا الرمز، ويبدو أنني قد أحرزت تقدمًا، على الرغم من أنني ما زلت أتلقى نوعًا من الخطأ غير المحدد الذي يقرر فيه Excel إسقاط التعليقات قبل الفتح...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top