有没有一种方法可以使用 python 以编程方式拒绝对 word 文档的更改,同时不删除其中的评论?
Is there a way to programmatically reject changes to a word document using python, while not deleting comments from it?
我有一些旧版本的 word 文档(扩展名为“.doc”的 word 文档),所有这些文档中都有很多跟踪更改。大多数更改都有与之关联的评论。
我需要想出一种方法来使用 python 拒绝文档中所做的所有更改,同时保留注释。
我尝试使用新版本的 word 文档(“.docx”文件)进行此操作,没有遇到任何问题。所有的更改都被拒绝了,word 文档中仍然有所有的评论。但是,当我尝试使用旧版本的 word 文档执行此操作时,我所有的评论都被删除了。
我最初使用以下函数和几个不同版本的 word 文件。
def reject_changes(path):
doc = word.Documents.Open(path)
doc.Activate()
word.ActiveDocument.TrackRevisions = False
word.ActiveDocument.Revisions.RejectAll()
word.ActiveDocument.Save()
doc.Close(False)
- 我试过用原来的word文档使用上面的功能
- 我将文件的扩展名更改为“.docx”并尝试了上述功能
- 我复制了文档并将其保存为“.docx”格式。
在所有这些情况下,评论都被删除了。
然后我尝试了以下代码:
def reject_changes(path):
doc = word.Documents.Open(path)
doc.Activate()
word.ActiveDocument.TrackRevisions = False
nextRev = word.Selection.NextRevision()
while nextRev:
nextRev.Reject()
nextRev = word.Selection.NextRevision()
word.ActiveDocument.Save()
doc.Close(False)
出于某种原因,这段代码几乎可以正常工作。但是再次检查了一些文档,我发现虽然大多数评论仍然存在,但仍有一些评论被删除了。
我认为由于评论被删除,它们可能是修订的一部分,在这种情况下,是否可以检查修订是否是评论。如果没有,有人可以建议一种方法来确保文档中拒绝更改的评论不会被删除。
编辑:
因此,我发现当 'Track Changes' 选项处于活动状态时,被删除的评论被添加到文档中。我想它将评论作为修订的一部分。因此,如果 'Track Changes' 选项未激活时进行评论,我的第一个函数就可以很好地工作。
但是,我有大约 20 多个单词的文档(都是 doc 和 docx 文件的混合),每个文档至少有 15 页和超过 50 条评论。
我正在使用 win32com.client
。我不太熟悉与 MS word 一起使用的其他包。任何帮助,将不胜感激。
谢谢!
好的,所以我可以通过以下方式找到解决方法:
- 正在创建选择对象并选择注释标记的文本范围。
- 将注释文本的范围保存到范围对象中。
- 拒绝选定文本的修订。
- 根据在步骤 2 中创建的范围对象获取新文本。
虽然这种方法会花费很多时间,但提取标记文本的最简单方法是确保在单词未跟踪更改时进行注释。
这是我现在使用的代码。
def reject_changes(path, doc_names):
word = win32.gencache.EnsureDispatch('Word.Application')
rejected_changes = []
for doc in doc_names:
#open the word document
wb = word.Documents.Open(rejected_doc)
wb.Activate()
current_doc = word.ActiveDocument
current_doc.TrackRevisions = False
text = ''
#iterating over the comments
for c in current_doc.Comments:
sentence_range = c.Scope #returns a range object of the text marked by comment
select_sentence = sentence_range.Select() #select the sentence marked by sentence_range
nextRev = word.Selection.NextRevision() #checks for the next revision in word
while nextRev:
#if the next revision is not within the sentence_range then skip.
if nextRev.Range.Start < sentence_range.Start or nextRev.Range.End > sentence_range.End:
break
else:
nextRev.Reject()
new_range = current_doc.Range(sentence_range.Start, sentence_range.End)
text = new_range.Text
nextRev = word.Selection.NextRevision()
author = c.Author
rejected_changes.append((doc,author,text,path))
current_doc.Save()
wb.Close(False)
return rejected_changes
我有一些旧版本的 word 文档(扩展名为“.doc”的 word 文档),所有这些文档中都有很多跟踪更改。大多数更改都有与之关联的评论。
我需要想出一种方法来使用 python 拒绝文档中所做的所有更改,同时保留注释。
我尝试使用新版本的 word 文档(“.docx”文件)进行此操作,没有遇到任何问题。所有的更改都被拒绝了,word 文档中仍然有所有的评论。但是,当我尝试使用旧版本的 word 文档执行此操作时,我所有的评论都被删除了。
我最初使用以下函数和几个不同版本的 word 文件。
def reject_changes(path):
doc = word.Documents.Open(path)
doc.Activate()
word.ActiveDocument.TrackRevisions = False
word.ActiveDocument.Revisions.RejectAll()
word.ActiveDocument.Save()
doc.Close(False)
- 我试过用原来的word文档使用上面的功能
- 我将文件的扩展名更改为“.docx”并尝试了上述功能
- 我复制了文档并将其保存为“.docx”格式。
在所有这些情况下,评论都被删除了。
然后我尝试了以下代码:
def reject_changes(path):
doc = word.Documents.Open(path)
doc.Activate()
word.ActiveDocument.TrackRevisions = False
nextRev = word.Selection.NextRevision()
while nextRev:
nextRev.Reject()
nextRev = word.Selection.NextRevision()
word.ActiveDocument.Save()
doc.Close(False)
出于某种原因,这段代码几乎可以正常工作。但是再次检查了一些文档,我发现虽然大多数评论仍然存在,但仍有一些评论被删除了。
我认为由于评论被删除,它们可能是修订的一部分,在这种情况下,是否可以检查修订是否是评论。如果没有,有人可以建议一种方法来确保文档中拒绝更改的评论不会被删除。
编辑:
因此,我发现当 'Track Changes' 选项处于活动状态时,被删除的评论被添加到文档中。我想它将评论作为修订的一部分。因此,如果 'Track Changes' 选项未激活时进行评论,我的第一个函数就可以很好地工作。
但是,我有大约 20 多个单词的文档(都是 doc 和 docx 文件的混合),每个文档至少有 15 页和超过 50 条评论。
我正在使用 win32com.client
。我不太熟悉与 MS word 一起使用的其他包。任何帮助,将不胜感激。
谢谢!
好的,所以我可以通过以下方式找到解决方法:
- 正在创建选择对象并选择注释标记的文本范围。
- 将注释文本的范围保存到范围对象中。
- 拒绝选定文本的修订。
- 根据在步骤 2 中创建的范围对象获取新文本。
虽然这种方法会花费很多时间,但提取标记文本的最简单方法是确保在单词未跟踪更改时进行注释。
这是我现在使用的代码。
def reject_changes(path, doc_names):
word = win32.gencache.EnsureDispatch('Word.Application')
rejected_changes = []
for doc in doc_names:
#open the word document
wb = word.Documents.Open(rejected_doc)
wb.Activate()
current_doc = word.ActiveDocument
current_doc.TrackRevisions = False
text = ''
#iterating over the comments
for c in current_doc.Comments:
sentence_range = c.Scope #returns a range object of the text marked by comment
select_sentence = sentence_range.Select() #select the sentence marked by sentence_range
nextRev = word.Selection.NextRevision() #checks for the next revision in word
while nextRev:
#if the next revision is not within the sentence_range then skip.
if nextRev.Range.Start < sentence_range.Start or nextRev.Range.End > sentence_range.End:
break
else:
nextRev.Reject()
new_range = current_doc.Range(sentence_range.Start, sentence_range.End)
text = new_range.Text
nextRev = word.Selection.NextRevision()
author = c.Author
rejected_changes.append((doc,author,text,path))
current_doc.Save()
wb.Close(False)
return rejected_changes