登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-04-25 15:45:34 394浏览 收藏

目前golang学习网上已经有很多关于Golang的文章了,自己在初次阅读这些文章中,也见识到了很多学习思路;那么本文《使用 Go OLE 绑定创建 MS Word 文档》,也希望能帮助到大家,如果阅读完后真的对你学习Golang有帮助,欢迎动动手指,评论留言并分享~

问题内容

我一直在尝试并学习如何以编程方式制作 word 文档。我知道使用 pywin32 可以轻松完成。这个简单的代码片段检索新 word 文档内的默认 visual basic“代码”。

import win32com.client
 
word = win32com.client.dispatch("word.application")
word.visible = true
document = word.documents.add()
document.vbproject.name = "test"
wordmodule = document.vbproject.vbcomponents("thisdocument") # works

input()

然后您可以将 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 windows

package main

import (
    "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()
}

关于为什么它不起作用有什么想法吗? 非常感谢。


解决方案


事实证明,"github.com/go-ole/go-ole" 在使用 foreach 时存在错误。 vbcomponets 是一个 collection,因此您必须按照 microsoft 文档所述进行迭代

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

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

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

现在它按预期工作了。

终于介绍完啦!小伙伴们,这篇关于《使用 Go OLE 绑定创建 MS Word 文档》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>