为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Go OLE 绑定创建 MS Word 文档

使用 Go OLE 绑定创建 MS Word 文档

Go
aluckdog 2022-07-11 17:05:39
我一直在玩耍并学习如何以编程方式制作 Word 文档。我知道它可以很容易地使用pywin32. 这个简单的代码片段检索新 Word 文档中的默认 Visual Basic“代码”。import win32com.client word = win32com.client.Dispatch("Word.Application")word.Visible = Truedocument = word.Documents.Add()document.VBProject.Name = "TEST"wordModule = document.VBProject.VBComponents("ThisDocument") # WORKSinput()然后,您可以将 VB 代码添加到wordModule.我想用 Golang 做同样的事情。Go 有一个 OLE 绑定,代码在 Github -> https://github.com/go-ole/go-ole它对用户不太友好,但我设法使它工作,除了我无法检索默认的VBComponents.默认代码位于“ThisDocument”中,可以使用简单的python代码检索document.VBProject.VBComponents("ThisDocument"),但它在Go中不起作用......您可以在下面的代码中看到我尝试使用多种方式获取“ThisDocument”,没有成功。每次,错误消息都是panic: Unknown name.// +build windowspackage mainimport (    "fmt"    ole "github.com/go-ole/go-ole"    "github.com/go-ole/go-ole/oleutil")func main() {    defer ole.CoUninitialize()    ole.CoInitialize(0)    unknown, _ := oleutil.CreateObject("Word.Application")    word, _ := unknown.QueryInterface(ole.IID_IDispatch)    oleutil.PutProperty(word, "Visible", true)    documents := oleutil.MustGetProperty(word, "Documents").ToIDispatch()    document := oleutil.MustCallMethod(documents, "Add").ToIDispatch()    vbproject := oleutil.MustGetProperty(document, "VBProject").ToIDispatch()    oleutil.PutProperty(vbproject, "Name", "TEST")    // oleutil.MustCallMethod(vbproject, "VBComponents", "ThisDocument").ToIDispatch() --> panic: Unknown name.    // oleutil.MustGetProperty(vbproject, "VBComponents", "ThisDocument").ToIDispatch() --> panic: Unknown name.    // vbcomponents := oleutil.MustGetProperty(vbproject, "VBComponents").ToIDispatch()    // oleutil.MustGetProperty(vbcomponents, "ThisDocument").ToIDispatch() --> panic: Unknown name.    var input string    fmt.Scanln(&input)    oleutil.PutProperty(document, "Saved", true)    oleutil.CallMethod(documents, "Close", false)    oleutil.CallMethod(word, "Quit")    word.Release()}关于为什么它不起作用的任何想法?非常感谢。
查看完整描述

1 回答

?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

原来"github.com/go-ole/go-ole"使用时有一个错误ForEachVBComponets是 a Collection,因此您必须按照 Microsoft doc 的说明进行迭代

使用 VBComponents 集合访问、添加或删除项目中的组件。组件可以是表单、模块或类。VBComponents 集合是一个标准集合,可以在 For...Each 块中使用。

此行 - > https://github.com/go-ole/go-ole/blob/master/oleutil/oleutil.go#L106 应替换为

newEnum, err := disp.CallMethod("_NewEnum")

现在它按预期工作。


查看完整回答
反对 回复 2022-07-11
  • 1 回答
  • 0 关注
  • 214 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号