OpenXML в Microsoft Excel для комментариев - PullRequest
0 голосов
/ 07 февраля 2019

Я использую последнюю версию Office 365 Excel, 1901. Я обновился до последней версии OpenXml SDK, но не могу понять, как программно читать информацию о многопоточных комментариях, так как все, что я вижу, - это полный сводный комментарий.Даже используя последний пакет OpenXml Nuget.

Если я преобразую документ Excel в файл .zip, я могу увидеть файлы "threadadedComments.xml", в которых есть то, что мне нужно, но я не знаю, как это сделать.программно в C # .NET.

Ответы [ 2 ]

0 голосов
/ 06 марта 2019

Я знаю, вы не следили за VBA, но там новый объект CommentThreaded теперь работает по крайней мере (Excel версия 1906, тестирование июнь 2019).
Я на самом деле тестировал его в Visual Studio C #, но онпо-прежнему не поддерживается.

По состоянию на 15 мая 2019 года новый объект CommentThreaded описан Microsoft .
В моей версии Excel 1906 он полностью поддерживается в VBA.

Вот некоторый VBA-код, который немного поясняет обработку:

Private Sub ExcelsNewCommentThreaded()
    Dim AllCommentsThreaded As Excel.CommentsThreaded
    Dim OneCommentThreaded As Excel.CommentThreaded
    Dim AllReplies As Excel.CommentsThreaded
    Dim OneReply As Excel.CommentThreaded
    Dim r As Range

    Set AllCommentsThreaded = ActiveSheet.CommentsThreaded

    ' loop over all threaded comments of a worksheet and get their info
    For Each OneCommentThreaded In AllCommentsThreaded
        With OneCommentThreaded
            Debug.Print .Author.Name, .Date, .Text
            For Each OneReply In .Replies
                With OneReply
                    Debug.Print .Author.Name, .Date, OneReply.Text
                End With
            Next OneReply
        End With
    Next OneCommentThreaded

    Set r = Selection.Cells(1)

    ' check if the selected cell already contains a threaded comment
    If r.CommentThreaded Is Nothing Then
        r.AddCommentThreaded ("my new comment")
    End If

    With r.CommentThreaded
        ' get text of comment
        Debug.Print .Text

        ' add some replies
        .AddReply ("my reply 1")
        .AddReply ("my reply 2")

        ' change text of comment
        Debug.Print .Text(Text:="text of comment changed")
        Debug.Print .Text

        ' change text of a reply
        .Replies(1).Text Text:="text of reply 1 changed"
        Debug.Print .Replies(1).Text

        ' delete second reply
        .Replies(2).Delete

        ' delete whole comment including its replies
        .Delete
    End With
End Sub
0 голосов
/ 25 февраля 2019

Вы можете получить доступ к контенту программно, если знаете точное местоположение в архиве .zip:

enter image description here

    static class Program
    {
        static void Main(string[] args)
        {
            using (var archive = ZipFile.OpenRead(args[0]))
            {
                var entry = archive.Entries.Where(_ => _.FullName.Equals("xl/comments1.xml", StringComparison.OrdinalIgnoreCase)).FirstOrDefault();
                if (entry != null)
                {
                    var stopwatch = new Stopwatch();
                    stopwatch.Start();
                    var data = new List<string>(Decompress(entry.Open()));
                    var graph = new Graph(data);
                    stopwatch.Watch();
                    Console.ReadLine();
                }
            }
        }

        public static IEnumerable<string> Decompress(Stream stream)
        {
            using (var reader = new StreamReader(stream, Encoding.ASCII))
            {
                string line;
                while ((line = reader.ReadLine()) != null)
                {
                    yield return line;
                }
            }
        }
    }
...