用go语言制作读取excel模板批量生成word工具

5 篇文章 0 订阅
1 篇文章 0 订阅

上一篇是批量生成excel的,这一篇是批量生成word的。

这里做三点说明:

第一就是这个东西到底是干嘛用的。有时候有这样的业务场景,比如说人事部门要填写很多个word,每个word都是按照特定的模板去填写数据的,比如说制作每个人的奖状或者通知等等。这些东西其实用word的宏当然是可以解决,就是麻烦,而且对于不懂程序的人来讲你跟他说宏不是开玩笑么?所以,当然是直接造个轮子出来造福一方了。有了这个东西,可以读取数据(请存在一个excel里面,具体看我的成品里面的范例)和读取模板,然后就可以批量自动填入数据去批量生成word了。这样可以保证批量生成的word文件不会出错。而且因为所有数据都保存在一个excel里面也便于后续的对照和管理。以后要批量修改这些word也就比较简单了。

第二,这个东西用到了一个go语言的库unioffice,需要到github上面去找,而且这个unioffice不是免费的,国内的免费版是gooffice,在gitee上,直接去找吧,在这里特别感谢pj者。

上不了github的话,可以在这里下载unioffice的example文件:https://download.csdn.net/download/sinolzeng/15446687,然后就可以用gooffice干活了。

第三,我写博客一直秉持着给自己做备忘和尽可能给别人提供帮助的原则,但并不意味着我有义务无偿贡献自己的一切成果,所以,如果是嚷嚷着因为积分问题要我免费发的,可以,那就用RMB解决问题。

最后,欢迎转载我的一切文章,只要注明出处即可。

上代码:

package main

import (
	"bufio"
	"fmt"
	"io"
	"math"
	"os"
	"regexp"

	//"strconv"
	"strings"
	"time"

	"gitee.com/gooffice/gooffice/document"
	"github.com/360EntSecGroup-Skylar/excelize"
)

var tmp string

func now() string {
	n := time.Now()
	return n.Format("2006-01-02 15:04:05") //go语言诞生的时间
}

func getAxisY(count int) string {
	arr := [27]string{"", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"}

	mod := count % 26
	divisor := int(math.Floor(float64(count) / 26))
	if mod == 0 && divisor > 0 {
		mod = 26
		divisor -= 1
	}

	return arr[divisor] + arr[mod]
}

func isDir(path string) bool {
	s, err := os.Stat(path)
	if err != nil {
		return false
	}
	return s.IsDir()
}

//自己编写一个函数,接收两个文件路径
func CopyFile(dstFileName string, srcFileName string) (written int64, err error) {
	srcFile, err := os.Open(srcFileName)
	if err != nil {
		fmt.Printf("open file err=%v\n", err)
	}
	defer srcFile.Close()

	//通过srcfile,找到Reader
	reader := bufio.NewReader(srcFile)
	//打开dstFileName
	dstFile, err := os.OpenFile(dstFileName, os.O_WRONLY|os.O_CREATE, 0666)
	if err != nil {
		fmt.Printf("open file err=%v\n", err)
		return
	}
	//通过dstFile,找到Writer
	writer := bufio.NewWriter(dstFile)
	defer dstFile.Close()
	return io.Copy(writer, reader)
}

func replaceWord(word *document.Document, position string, replacer string) {
	for _, p := range word.Paragraphs() {
		for _, r := range p.Runs() {
			txt := r.Text()
			find := strings.Contains(txt, position)
			if find {
				r.ClearContent()
				r.AddText(strings.ReplaceAll(txt, position, replacer))
			}
		}
	}
}

func mission() bool {
	pwd, _ := os.Getwd()
	_, err := os.Stat(pwd + "\\模板.docx")
	if !os.IsNotExist(err) { //读取到模板
		fmt.Println("载入模板...")

		_, err := os.Stat(pwd + "\\数据.xlsx")
		if !os.IsNotExist(err) { //读取到数据
			fmt.Println("载入数据...")
			dataxlsx, err := excelize.OpenFile(pwd + "\\数据.xlsx")
			if err != nil {
				fmt.Println(err)
			}
			sheetname := dataxlsx.GetSheetName(dataxlsx.GetActiveSheetIndex())
			rows, _ := dataxlsx.GetRows(sheetname)
			positions := rows[0]
			reg := regexp.MustCompile(`[\/\\\:\*\?\"\<\>\|]`) //去掉不能用来作为文件或文件夹名的符号
			output := pwd + "\\output" + reg.ReplaceAllString(now(), "_")
			if !isDir(output) {
				err := os.Mkdir(output, os.ModePerm)
				if err != nil {
					fmt.Println(err)
				}
			}
			for row := 1; row < len(rows); row++ {
				if reg.ReplaceAllString(rows[row][0], "_") == "" {
					continue
				}
				filename := output + "\\" + reg.ReplaceAllString(rows[row][0], "_") + ".docx"
				doc, _ := document.Open(pwd + "\\模板.docx")
				defer doc.Close()
				for k, v := range rows[row] {
					if strings.ReplaceAll(positions[k], " ", "") != "" {
						replaceWord(doc, positions[k], v)
					}
				}
				doc.SaveToFile(filename)

			}

		} else {
			fmt.Println("读取不到数据,请将你要处理的excel数据命名为【数据.xlsx】并放到exe同路径下...")
			return true
		}
	} else {
		fmt.Println("读取不到模板,请将你要处理的excel模板命名为【模板.xlsx】并放到exe同路径下...")
		return true
	}
	return true
}

func main() {
	fmt.Println(now() + " 任务开始...")
	mission()

	fmt.Println(now() + " 由于word版本的原因,可能有一些异常信息,不需要理会。任务完成,请按回车键退出...")
	fmt.Scanln(&tmp)
}

最后上成品:https://download.csdn.net/download/sinolzeng/15446710

完结撒花。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值