• Golang 实现word和Excel处理


    Golang使用Windows底层开发那些事

    通过上一篇博客知道,Python可以通过pywin32实现Windows底层开发,最常见的是word和Excel处理,自动打印等等。
    我曾经说过,编程语言只是工具,只要工具玩的溜,一切皆有可能。按照上一篇博客实现的功能,使用Golang同样能实现。
    Golang调用Windows底层接口,可以借助第三方库github.com/go-ole/go-ole
    如果对Golang熟悉的话,不妨看看go-ole源码,从源码文件发现,它是通过标准库syscall调用Windows底层文件dll实现的,如图所示
    在这里插入图片描述

    在这里插入图片描述
    大致了解第三库go-ole底层原理之后,下一步就讲述如下使用。

    第三库go-ole

    第三库go-ole虽然没有文档说明,但已提供示例代码讲述如何使用。分析示例代码得知,整个库无非就调用这么几个函数方法:
    oleutil.CreateObject(“Excel.Application”):创建对象,固定写法,CreateObject的参数可变的。
    unknown.QueryInterface(ole.IID_IDispatch):查询接口,固定写法。
    oleutil.PutProperty():设置对象的属性。
    oleutil.GetProperty():获取属性。
    oleutil.MustGetProperty().ToIDispatch():获取属性,在GetProperty()基础上在封装一下。
    oleutil.CallMethod():调用方法。
    oleutil.MustCallMethod():调用方法,在CallMethod()基础上在封装一下。
    Release():释放资源。
    ole.CoInitialize(0):初始化。
    ole.CoUninitialize():释放资源。
    使用win32com调用com组件的时候,需要用ole.CoInitialize初始化一下,最后还需要用ole.CoUninitialize释放资源。
    整个库主要使用上述的函数方法,有关各个函数参数就自行查看源码定义或示例代码的具体使用了。

    将Word转pdf

    示例代码没有太多说明,但可以通过微软官网文档找到具体的使用方法,示例代码如下:

    package main
    
    import (
    	ole "github.com/go-ole/go-ole"
    	"github.com/go-ole/go-ole/oleutil"
    )
    
    func setWord(fileName string)  {
    	ole.CoInitialize(0)
    	unknown, _ := oleutil.CreateObject("Word.Application")
    	word, _ := unknown.QueryInterface(ole.IID_IDispatch)
    	oleutil.PutProperty(word, "Visible", false)
    	documents := oleutil.MustGetProperty(word, "Documents").ToIDispatch()
    	document := oleutil.MustCallMethod(documents, "Open", fileName).ToIDispatch()
    	oleutil.MustCallMethod(document, "SaveAs2", "E:\\mygo\\bb.pdf", 17).ToIDispatch()
    	document.Release()
    	documents.Release()
    	word.Release()
    	ole.CoUninitialize()
    }
    
    func main() {
    	setWord("E:\\mygo\\abc.docx")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    Excel设置页面和边框、转PDF

    对于Excel的操作,示例代码没有太多说明,也是可以结合微软官网文档实现我们想要的功能,代码如下:

    package main
    
    import (
    	ole "github.com/go-ole/go-ole"
    	"github.com/go-ole/go-ole/oleutil"
    )
    
    func setExcel(fileName string){
    	ole.CoInitialize(0)
    	unknown, _ := oleutil.CreateObject("Excel.Application")
    	excel, _ := unknown.QueryInterface(ole.IID_IDispatch)
    	oleutil.PutProperty(excel, "Visible", false)
    	workbooks := oleutil.MustGetProperty(excel, "Workbooks").ToIDispatch()
    	workbook, _ := oleutil.CallMethod(workbooks, "Open", fileName)
    	//defer workbook.ToIDispatch().Release()
    	worksheet := oleutil.MustGetProperty(workbook.ToIDispatch(), "Worksheets", 1).ToIDispatch()
    	//defer worksheet.Release()
    	ps := oleutil.MustGetProperty(worksheet, "PageSetup").ToIDispatch()
    	oleutil.PutProperty(ps, "LeftHeader", "")
    	oleutil.PutProperty(ps, "CenterHeader", "")
    	oleutil.PutProperty(ps, "RightHeader", "")
    	oleutil.PutProperty(ps, "LeftFooter", "")
    	oleutil.PutProperty(ps, "CenterFooter", "")
    	oleutil.PutProperty(ps, "RightFooter", "")
    	oleutil.PutProperty(ps, "LeftMargin", 0)
    	oleutil.PutProperty(ps, "RightMargin", 0)
    	oleutil.PutProperty(ps, "TopMargin", 0)
    	oleutil.PutProperty(ps, "BottomMargin", 0)
    	oleutil.PutProperty(ps, "HeaderMargin", 0)
    	oleutil.PutProperty(ps, "FooterMargin", 0)
    	oleutil.PutProperty(ps, "Orientation", 2)
    	oleutil.PutProperty(ps, "Zoom", false)
    	oleutil.PutProperty(ps, "FitToPagesWide", 1)
    	oleutil.PutProperty(ps, "FitToPagesTall", false)
    	oleutil.PutProperty(ps, "CenterVertically", true)
    	oleutil.PutProperty(ps, "CenterHorizontally", true)
    	oleutil.PutProperty(ps, "Draft", false)
    	oleutil.PutProperty(ps, "FirstPageNumber", true)
    	oleutil.MustCallMethod(worksheet, "ExportAsFixedFormat", 0, "E:\\mygo\\aa.pdf").ToIDispatch()
    	ps.Release()
    	worksheet.Release()
    	workbooks.Release()
    	excel.Release()
    	ole.CoUninitialize()
    }
    
    func main() {
    	setExcel("E:\\mygo\\abc.xls")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    保存文件的时候,最好使用绝对路径,如果使用相对路径,最终保存的文件可能不在go文件所在的路径。

    总结

    不管是用Python还是Golang实现Windows底层开发,最终实现功能都要依赖微软官网文档提供的接口方法。
    此外,Golang还可以实现打印机功能,例如网络打印功能

    更多内容请关注公众号
    在这里插入图片描述

  • 相关阅读:
    C++ std::make_unique和std::make_shared用法
    Java处理正则匹配卡死(正则回溯问题)
    从零实现Web框架Geo教程-前缀树路由-03
    P1972 [SDOI2009] HH的项链
    FEDformer里面的CZ1d
    docker、docker-compose安装教程,很详细
    Java函数式编程(1):Lambda表达式(1)
    图片划过缩放
    成长杂志成长杂志社成长编辑部2022年第7期目录
    论文阅读笔记——A deep tree-based model for software defect prediction
  • 原文地址:https://blog.csdn.net/HuangZhang_123/article/details/126411097