我有一些Word文档(扩展名为'.doc'的Word文档)的旧版本,所有这些文档中都有很多跟踪的更改。大多数更改都有与之相关的注释。
我需要找出一种使用python拒绝文档中所做的所有更改,同时保留注释的方法。
我用新版本的word document('。docx'文件)进行了尝试,没有遇到任何问题。所有更改均被拒绝,而单词一词仍然包含所有注释。但是,当我尝试使用旧版本的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)
在所有这些情况下,评论均被删除。
然后我尝试了以下代码:
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)
由于某种原因,该代码几乎可以正常工作。但是,在再次检查了很少的文档后,我发现尽管大多数评论仍然存在,但仍有一些被删除。
我认为,由于注释已被删除,在这种情况下,它们很可能是修订的一部分,因此可以检查修订是否为注释。如果不是,请问有人可以提出一种方法来确保在拒绝更改时不会在文档中删除任何评论。
编辑:
因此,我发现当“跟踪更改”选项处于活动状态时,已删除的注释已添加到文档中。我想它已将评论作为修订的一部分。因此,如果“跟踪更改”选项未激活,则在做出注释的情况下,我的第一个功能运行良好。
但是,那时我大约有二十多个word文档(它们都是doc和docx文件的混合),每个文档至少有十五页和五十多个注释。
我正在使用win32com.client
。我对使用MS Word的其他软件包不太熟悉。任何帮助,将不胜感激。
谢谢!
答案 0 :(得分:0)
好的,因此我可以通过以下方法解决此问题:
这种方法需要花费很多时间,而提取标记文本的最简单方法是确保在单词未跟踪更改时进行注释。
这是我现在正在使用的代码。
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