[英]OpenXML in Microsoft Excel for Comments
我正在運行最新的Office 365 Excel版本,1901。我已經更新到最新的OpenXml SDK但我無法弄清楚如何以編程方式讀取有關線程注釋的信息,因為我所看到的只是一個完整的摘要注釋。 即使使用最新的OpenXml Nuget包。
如果我將Excel文檔轉換為.zip文件,我可以看到具有我需要的“threadedComments.xml”文件,但不知道如何在C#.NET中以編程方式進行。
我知道,你沒有注意VBA,但是新的CommentThreaded
對象現在起作用了(Excel版本1906,測試於2019年6月)。
我實際上在Visual Studio C#中測試過它,但它似乎仍然不受支持。
截至2019年5月15日, Microsoft描述了新對象CommentThreaded
。
在我的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
如果您知道.zip archieve中的確切位置,則可以通過編程方式訪問內容:
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;
}
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.