首页 > 其他分享 >golang 解析处理word文档扩展包

golang 解析处理word文档扩展包

时间:2023-05-04 13:34:15浏览次数:52  
标签:run err para doc golang 文档 wml word Properties

github.com/unidoc/unioffice

该扩展包对word操作功能比较全,但为商业使用,注册后有100次的试用,具体使用就不详细说明了,具体可以看 https://github.com/unidoc/unioffice-examples

github.com/carmel/gooxml

该扩展包为unidoc/unioffice的免费版,为收费版的1.4.0版本,虽然功能没有收费版多,但已经涵盖了大部分的基本功能

将包导入到自己的项目

go get github.com/carmel/gooxml

基本使用
1. 创建文档并填写内容
doc := document.New()
para := doc.AddParagraph() // 新增段落 
run := para.AddRun()
run.AddText("这里是段落文字信息") // 添加文字信息
// 如果想对添加的文字信息进行换行处理,使用'\r'
run.AddText("这里第一行段落文字信息\r这里是第二行段落文字信息")
doc.SaveToFile("simple.docx") // 保存文件路径,此处应为绝对路径

2. 给段落添加各种样式
para.SetStyle("Title")
para.SetStyle("Heading1")  // Heading1 Heading2 Heading3
para.Properties().SetFirstLineIndent(0.5 * measurement.Inch) // 段落添加首行缩进
para.Properties().AddSection(wml.ST_SectionMarkNextPage) // 另起一页(用在AddText之后)

3. 给文字添加各种样式
run.Properties().SetBold(true)             // 是否加粗
run.Properties().SetFontFamily("Courier")  // 字体
run.Properties().SetSize(15)               // 字号
run.Properties().SetColor(color.Red)       // 文字颜色
run.Properties().SetKerning(5)             // 文字字距
run.Properties().SetCharacterSpacing(5)    // 字符间距调整
run.Properties().SetHighlight(wml.ST_HighlightColorYellow) // 设置高亮
run.Properties().SetUnderline(wml.ST_UnderlineWavyDouble, color.Red) // 下划线

4. 设置页眉页脚
hdr := doc.AddHeader()
para := hdr.AddParagraph()
para.Properties().AddTabStop(2.5*measurement.Inch, wml.ST_TabJcCenter, wml.ST_TabTlcNone)
run := para.AddRun()
run.AddTab()
run.AddText("My Document Title")

ftr := doc.AddFooter()
para = ftr.AddParagraph()
para.Properties().AddTabStop(6*measurement.Inch, wml.ST_TabJcRight, wml.ST_TabTlcNone)
run = para.AddRun()
run.AddText("Some subtitle goes here")
run.AddTab()

5. 添加图片
// 初始化图片信息
img1, err := common.ImageFromFile("图片绝对路径")
if err != nil {
    log.Fatalf("unable to create image: %s", err)
}
img1ref, err := doc.AddImage(img1)
if err != nil {
    log.Fatalf("unable to add image to document: %s", err)
}
// 将图片添加到对应的段落
para := doc.AddParagraph()
anchored, err := para.AddRun().AddDrawingAnchored(img1ref)
if err != nil {
    log.Fatalf("unable to add anchored image: %s", err)
}
// 设置图片相关样式
anchored.SetName("图片名称")
anchored.SetSize(2*measurement.Inch, 2*measurement.Inch)
anchored.SetOrigin(wml.WdST_RelFromHPage, wml.WdST_RelFromVTopMargin)
anchored.SetHAlignment(wml.WdST_AlignHCenter)
anchored.SetYOffset(3 * measurement.Inch)
anchored.SetTextWrapSquare(wml.WdST_WrapTextBothSides)

6. word模板替换

该扩展包还支持word模板替换,提前设置好样式模板,然后替换对应的文字
doc, err := document.Open("document_template.docx") // 获取模板文档路径
if err != nil {
    log.Fatalf("error opening document: %s", err)
}
// 获取全部的段落信息
paragraphs := []document.Paragraph{}
for _, p := range doc.Paragraphs() {
    paragraphs = append(paragraphs, p)
}
for _, sdt := range doc.StructuredDocumentTags() {
    for _, p := range sdt.Paragraphs() {
	paragraphs = append(paragraphs, p)
    }
}
// 循环段落并进行文字替换
for _, p := range paragraphs {
    for _, r := range p.Runs() {
	switch r.Text() {
          case "模板中的文字":
            r.ClearContent() // 清除原有的文字信息和换行符
	    r.AddText("替换的文字")
	    r.AddBreak()
            // 在该段落前添加新段落
            para := doc.InsertParagraphBefore(p)
	    para.AddRun().AddText("Mr.")
            // 在该段落后添加新段落
            para = doc.InsertParagraphAfter(p)
            para.AddRun().AddText("III")
        }
    }
}
doc.SaveToFile("edit-document.docx") // 生成替换后的新文档

7. 文档水印

该版本暂无添加水印功能,不过可以使用模板替换功能实现带水印的word文档
doc, err := document.Open("document_template.docx") // 该模板是一个已经带水印的模板
// 添加文字内容
para := doc.AddParagraph()
run := para.AddRun()
run.AddText(content)
doc.SaveToFile("edit-document.docx")
// 如果要使用下面的方法添加一个空白页,则空白页不会附带设置好的水印,入需新增新页面,则模板需要设置两个带水印的空白页面
para.Properties().AddSection(wml.ST_SectionMarkNextPage)

标签:run,err,para,doc,golang,文档,wml,word,Properties
From: https://www.cnblogs.com/xingzr/p/17370295.html

相关文章

  • Spring AOP官方文档学习笔记(三)之基于xml的Spring AOP
    1.声明schema,导入命名空间(1)如果我们想要使用基于xml的springaop,那么,第一步,我们需要在xml配置文件中声明springaopschema,导入命名空间,如下这是一个标准的模板<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmln......
  • 配置wordpress:群组方式添加小工具(wordpress 6.2)
    一,群组方式添加小工具1,添加小工具时,选择群组:添加后的群组点击+按钮修改标题为日历,然后点击+按钮:选择日历添加2,查看页面上的展示效果说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectforest     对应的源码可以访问......
  • java基于springboot+vue非前后端分离的网上商城购物系统、在线商城管理系统,附源码+数
    1、项目介绍java基于springboot+vue非前后端分离的网上商城购物系统、在线商城管理系统,实现管理员:首页、个人中心、用户管理、商品分类管理、商品信息管理、订单评价管理、系统管理、订单管理,用户;首页、个人中心、订单评价管理、我的收藏管理、订单管理,前台首页;首页、商品信息、......
  • 使用 Knife4j(Swagger)工具自动生成 API 接口文档
    现在的项目开发,绝大多数都已经采用前后端分离,前后端开发人员必须依靠接口文档进行协作。当前最流行的文档生成工具就是Swagger,它是一个规范和完整的框架,用于生成、描述、调用和可视化RESTful风格的Web服务。但是本篇博客介绍的是Knife4j,它是集Swagger和OpenAPI为一体的......
  • wordpress插件:安装使用统计插件Post Views Counter(Post Views Counter 1.3.13 / wor
    一,安装插件搜索到结果后,点击PostViewsCounter的立即安装按钮安装完成后,点击启用按钮启用此插件,如图:说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectforest     对应的源码可以访问这里获取: https://github.com/liuhong......
  • wordpress插件: WP Mail SMTP 配置邮箱(wordpress 6.2)
    一,安装插件:安装完成,如图:从已安装的插件中可以看到说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectforest     对应的源码可以访问这里获取: https://github.com/liuhongdi/     或: https://gitee.com/liuhongdi......
  • 配置wordpress:允许用户注册(wordpress 6.2)
    一,wordpress默认不允许用户注册:如图:注意:登录界面上没有注册的入口二,在后台设置允许注册打开:设置->常规选中:任何人都可以注册 一项点击保存更改按钮后生效查看效果:登录界面出现了注册链接注册界面如图:说明:刘宏缔的架构森林是一个专注架构的博客,地址:https......
  • 配置wordpress:用户登录后才可发表评论(wordpress 6.2)
    一,默认设置:发表评论时不需要登录如图:二,设置:设置->讨论->选中用户必须注册并登录才可以发表评论选中后点击:保存更改按钮效果:未登录前的效果:说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectforest     对应的源码......
  • java基于springboot+vue非前后端分离的影城管理系统、影院销售管理系统,附源码+文档+PP
    1、项目介绍本影城管理系统主要包括二大功能模块,即用户功能模块和管理员功能模块。(1)管理员模块:系统中的核心用户是管理员,管理员登录后,通过管理员功能来管理后台系统。主要功能有:首页、个人中心、用户管理、电影类型管理、放映厅管理、电影信息管理、购票统计管理、系统管理、订......
  • SpringSecurity过滤器之UsernamePasswordAuthenticationFilter
    UsernamePasswordAuthenticationFilter处理表单登录及认证。AbstractAuthenticationProcessingFilter#doFilterprivatevoiddoFilter(HttpServletRequestrequest,HttpServletResponseresponse,FilterChainchain) throwsIOException,ServletException{ if(!requires......