几年来,我们已经在我们的应用程序中快速运行了这几行代码(以及Office,2003,2007和2010等多个版本).目的是在Word文档中执行一种邮件合并,用数据库中的名称,地址等替换字段占位符:
Dim w As Word.Application
Dim d As Microsoft.Office.Interop.Word.Document = Nothing
Run Code Online (Sandbox Code Playgroud)
...
Dim f As Microsoft.Office.Interop.Word.Field
For Each f In d.Fields
f.Select()
If fieldName = w.Selection.Text Then
f.Result.Text = value
End If
Next
Run Code Online (Sandbox Code Playgroud)
但是,运行Office 2013的用户在该行上报告此错误f.Result.Text = value:
System.Runtime.InteropServices.COMException(0x800A17EC):您不能编辑此选择,因为它受到保护.
因此,这仅在用户运行Office 2013时才会发生,并且此错误的联机帮助很少.
文档的任何部分都不受保护,用户可以直接在Word中编辑文档而不会出现任何问题.
我们的一些客户遇到了一个我们无法在内部重现的问题:Out软件使用MS-Word生成套用信函.由于我们的一些客户使用Office 2013,此功能将不再起作用.
我们尝试重现这一点并检测到受影响的系统上的Word不会从命令行启动.从startmenu工程中的链接开始.它还可以从命令行启动Excel.
有谁知道问题是什么以及如何解决?
我正在使用Word 2013自动创建一个报告作为docx,然后将其保存为pdf格式.
但是当我调用函数SaveAs2()时,脚本会弹出"另存为"窗口并抛出此异常:
(-2147352567, 'Exception occurred.', (0, u'Microsoft Word', u'Command failed', u'wdmain11.chm', 36966, -2146824090), None)
Run Code Online (Sandbox Code Playgroud)
这是我打开并保存为新文件的代码:
self.path = os.path.abspath(path)
self.wordApp = win32.Dispatch('Word.Application') #create a word application object
self.wordApp.Visible = False # if false hide the word application (app does't open but still usable)
self.document = self.wordApp.Documents.Open(self.path + "/" + documentRef) # opening the template file
absFileName = "D:\\test.pdf"
self.document.SaveAs2(FileName=absFileName,FileFormat=17)
Run Code Online (Sandbox Code Playgroud)
我正在使用:python2.7与pywin32(build 219)
有人知道为什么它不起作用?
我已经编写了一个基于表单的文档生成宏(在VBA中),以便分发给销售团队.
为了便于使用,我想提供一个自包含的文件,它将在文档打开后立即显示表单.
使用AutoOpen如果word已经打开并且在其中打开了dotm文件,我可以使表单按预期显示.但是,如果我从资源管理器中双击该文件,没有任何反应,我必须手动启动宏.我以为AutoExec可能允许这个,但没有运气.我花了很多时间试图通过谷歌搜索等工作,但我没有得到任何地方.
即使双击打开文件,如何才能显示表单?是否可以在不必为每个用户更改normal.dotm的情况下执行此操作?
为了进一步的背景,我正在使用Word 2013,在测试期间完全启用了宏.dotm文件存储在受信任的位置.
我正在使用宏来启动这样的表单...
Public Sub AutoOpen()
StartPage.Show
End Sub
Run Code Online (Sandbox Code Playgroud)
我尝试过使用AutoExec也无济于事.
我正在微软社区交叉发布这个问题,因为我没有得到任何回复,也许这里有人可以对此有所了解.
我注意到使用VSTO处理文档时特定于Word 2013的问题.
该文档在页眉或页脚中包含一个图像,其布局选项设置为"With Text Wrapping",带有"Behind Text"或"In Text of Text":
使用VSTO,如果我打开文档然后尝试处理形状,我会得到以下异常:
The remote procedure call failed. (Exception from HRESULT: 0x800706BE)
Run Code Online (Sandbox Code Playgroud)
我在这里上传了一个repro:Word2013VstoImageFormattedInHeaderBug.zip
相关的代码片段在WordFieldEnumerator.cs:
private static bool ShapesWithinGroup(Shape shape)
{
var result = false;
try
{
// shape.GroupItems throws the exception
if (shape.GroupItems != null && shape.GroupItems.Count > 0)
{
result = true;
}
}
catch (UnauthorizedAccessException)
{
// This shape is not in a group - ignore
}
catch (Exception exception)
{
var exceptionString = …Run Code Online (Sandbox Code Playgroud) 这让我发疯!我喜欢 Word 2013 中的新布局选项,但是当标注达到特定大小时,它的图标会遮住箭头的末端,并且您无法移动箭头:

不要假设有人知道如何摆脱图标,如何单击并拖动箭头的黄色末端,或者首先如何阻止图标出现?
提前致谢。
请考虑Word 2013中的下表
A BBB
A CCC
D E F
Run Code Online (Sandbox Code Playgroud)
A,B和C是合并的单元格.
A和B是空的.C A里面有文字.
现在以下代码
Set rng = ActiveDocument.Range(0, 0)
With rng.Find
.Forward = True
.Wrap = wdFindStop
.Execute "A"
End With
Run Code Online (Sandbox Code Playgroud)
崩溃了Execute "A".
如果我改变文本Execute "B"它没有找到任何东西,但没有崩溃的话.问题仅出现在2013年.
我们尝试Selection.Find逐个手动搜索,但这两个都很慢.
有没有快速的方法来规避这个错误?
编辑:这是我构建的最小失败示例.在我们的应用程序中,我们使用了很多Range.Find,有时使用wrap,几乎从不从Document.Start开始
EDIT2:进一步调查显示,如果以兼容模式(Word 97-2003格式)打开Document,则不存在错误.
如何最好地将唯一 ID 分配给描述 Word 文档的 XML 中的(最好是所有)元素,以便我可以从 Word (2013) 加载项读取/写入这些唯一 ID?
此外,描述如何获得两个 Word 文档的良好差异的解决方案可能会有所帮助,但这不是主要问题。
我正在使用 VSTO 创建 Word (2013) 的应用程序级加载项。我的部分任务涉及将原始 Word 文档W与修改后的文档进行比较W',以便我可以为另一项任务处理该差异。虽然 Word 显然具有差异/合并功能(可在 Word 2013 的“审阅”面板中找到),但到目前为止,我还没有找到一种以编程方式提取差异的方法。
因此,我计划获取文档的 XML(例如使用Range.WordOpenXML)并比较它们。有许多已发布的用于比较 XML 文档(即Diff(W.XML, W'.XML))的算法,其中比较的准确性在很大程度上取决于是否能够正确匹配两个文档中的 XML 元素。
因此,我希望能够为可以从加载项访问的 Word 文档的 XML 中的每个元素分配一个唯一的 ID。在这种情况下,解决方案类似于将自定义命名空间导入到名为的包中,并为 DOCX 包中的每个元素mynamespace添加属性。mynamespace:ID=***然后可以通过 访问该属性Range.WordOpenXML。
但是,只需使用 mce:Ignorable、mce:ProcessContent 和 mce:PreserveAttributes,详见http://openxmldeveloper.org/blog/b/openxmldeveloper/archive/2012/09/21/markup-compatibility-and-extensibility.aspx不起作用。修改后的 Word 文档加载没有任何问题,但我似乎找不到任何属性,另外保存文档会删除所有添加的标记。
从http://openxmldeveloper.org/discussions/formats/f/13/p/8078/163573.aspx看来,通过 Office Open XML 标准的标记兼容性和扩展性 (MCE) 部分使用自定义 xml 的过程已多年来变得复杂(专利问题等)。因此,我猜测我的问题的出现是因为 Word …
我创建了一个 Windows 应用程序,它使用 C# 启动 Word 进程 (Microsoft.Office.Interopt.Word)。我加载了两个插件 word.AddIns.Add(@"C:\temp\addin.dot", true);。这段代码在我的 Windows 应用程序中工作得很好。
为了能够远程启动这个过程,我创建了一个 MVC Web 应用程序。Web 应用程序使用相同的代码,但在我加载插件的部分失败:
错误: Word 无法打开此文档模板:(C:\temp\addin.dot)
Web 应用程序使用具有管理员权限和以下设置的应用程序池:
有谁知道问题可能是什么?为什么相同的代码在 Web 服务器上表现不同?
编辑:任务管理器向我显示 word process 使用正确的用户帐户启动。当我启动 Windows 应用程序时,它与我使用的帐户相同。
我正在使用 VSTO ThisAddIn 和 Word 2013。
我想使用另一个字符串替换所有出现的一个字符串Find.Execute,并使用自定义撤消消息标记此操作。代码是:
application.UndoRecord.StartCustomRecord("Some Message");
var find = application.ActiveDocument.Content.Find;
find.Execute("string to be replaced"
, ReplaceWith: "second string"
, Replace: WdReplace.wdReplaceAll);
application.EndCustomRecord();
Run Code Online (Sandbox Code Playgroud)
所以我在这段代码运行期间发生了Word崩溃。如果我更改Replace: WdReplace.wdReplaceAll为Replace: WdReplace.wdReplaceOne,我将可以使用单词,但我需要替换所有出现的情况。
有什么建议/解决方法吗?
word-2013 ×10
ms-word ×7
c# ×3
vba ×3
vsto ×2
word-vba ×2
.net ×1
com-interop ×1
command-line ×1
iis ×1
ms-office ×1
office-2013 ×1
openxml ×1
python ×1
pywin32 ×1
word-addins ×1