【问题标题】:Different results for the same comparison in Microsoft Word on different machines using VBScript使用 VBScript 在不同机器上的 Microsoft Word 中进行相同比较的不同结果
【发布时间】:2022-12-09 17:52:50
【问题描述】:

我需要比较两个文本,我正在使用以下脚本使用 MS Word:

dim ORIGINAL
dim REVISED
dim WORD_COMPARE
dim objWord

Set objWord = CreateObject("Word.Application")  
objWord.DisplayAlerts = WdAlertsNone        
objWord.Visible = True

set ORIGINAL = objWord.Documents.Open(WScript.Arguments.Unnamed.Item(0), False, True, False)    ' ORIGINAL DOCX         
Set REVISED = objWord.Documents.Open(WScript.Arguments.Unnamed.Item(1), False, False, False)    ' MODIFIED.DOCX     

dim wordCompareResultFilePath:wordCompareResultFilePath = WScript.Arguments.Item(3)       ' FILE RESULT PATH

Set WORD_COMPARE =_
    objWord.CompareDocuments(_      
        ORIGINAL,_
        REVISED,_
        1,_
        1,_
        False,_
        False,_
        true,_ 
        False,_
        False,_
        True,_
        False,_
        False,_
        False,_
        True, _
        "COMPARER_USER",_
        False)
        
dim printLines:printLines=""    
for each revision in REVISED.Revisions           
    'printLines =  printLines & original.range(revision.range.paragraphs.item(1).range.start).paragraphs.item(1).range.text & vbCrLf         ' GET THE ORIGINAL PARAGRAPH       
    printLines =  printLines & revision.range.paragraphs.item(1).range.start & vbCrLf   
next
                     


Set stream = CreateObject("ADODB.Stream")
stream.Open
stream.Type     = 2 'text
stream.Position = 0
stream.Charset  = "utf-8"
stream.WriteText printLines
stream.SaveToFile wordCompareResultFilePath, 2
stream.Close

ORIGINAL.Close False  
REVISED.Close False 
objWord.Quit
WScript.Quit Err.Number

要执行它,我在 cmd 中使用以下 .bat 文件:

cscript.exe "C:\Users\x\Desktop\comparer\comparer_step1.vbs" "C:\Users\x\Desktop\comparer\original.docx" "C:\Users\x\Desktop\comparer\modificado12.docx" "C:\Users\AdminRPozuelo\Desktop\comparer\87a0ba51-d28e-48b1-8c93-c57e276b72d3.docx") 

我用它来执行比较并获得例如索引 修订以便在原件中使用以获取原始文本(脚本中的 foreach 行)。据我所知,Word 女士返回两个修订,用于简单的替换插入和删除(或删除和插入,取决于如何指定参数)。当我在我的本地机器上执行它时工作正常并且我得到以下索引进行简单更改(替换),据我所知是好的,因为索引应该是相同的:

但是,当我在其他机器上使用它时,即使使用相同的 MS Word 版本(msword 2019)也会返回不同的结果,例如在带有 MSWord 2016 的 Microsoft 服务器中,相同的更改返回以下索引:

因此我的问题是:为什么这一行在不同的机器上为相同的文本生成不同的索引:

revision.range.paragraphs.item(1).range.start

我怀疑我需要在比较中指定更多参数。 有人可以帮助我吗?

非常感谢你提前。

附言我为我的英语道歉,莎士比亚此刻一定在他的坟墓里翻滚。

【问题讨论】:

  • 对不起,我刚刚更改了它。
  • 您何时何地运行脚本?它是在网络服务器上还是在服务应用程序上?
  • 我都尝试了相同的结果。
  • 当您手动运行它时(不是从服务应用程序)它是否正常工作?

标签: ms-word vbscript server-side office-automation com-automation


【解决方案1】:

Microsoft 目前不推荐也不支持来自任何无人值守、非交互式客户端应用程序或组件(包括 ASP、ASP.NET、DCOM 和 NT 服务)的 Microsoft Office 应用程序自动化,因为 Office 可能表现出不稳定的行为和/或在此环境中运行 Office 时出现死锁。

如果您正在构建在服务器端上下文中运行的解决方案,您应该尝试使用已针对无人值守执行进行安全处理的组件。或者,您应该尝试找到至少允许部分代码在客户端运行的替代方案。如果您使用来自服务器端解决方案的 Office 应用程序,该应用程序将缺少许多成功运行所必需的功能。此外,您将承担整体解决方案稳定性的风险。在 Considerations for server-side Automation of Office 文章中阅读更多相关信息。

如果您只处理开放 XML 文档,您可以考虑改用 Open XML SDK,有关详细信息,请参阅Welcome to the Open XML SDK 2.5 for Office。或者只考虑使用专为服务器端执行而设计的第三方组件。

【讨论】:

    猜你喜欢
    • 2017-10-06
    • 2021-08-21
    • 2016-11-08
    • 2020-06-23
    • 1970-01-01
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    相关资源
    最近更新 更多