用go语言制作读取excel模板批量生成word工具
上一篇是批量生成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 mainimport ("bufio""fmt""io""math""os""regexp"//"strconv""strings""time""gitee.com/gooffice/gooffice/document""github.com/360EntSecGroup-Skylar/excelize" )var tmp stringfunc 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 % 26divisor := int(math.Floor(float64(count) / 26))if mod == 0 && divisor > 0 {mod = 26divisor -= 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,找到Readerreader := bufio.NewReader(srcFile)//打開dstFileNamedstFile, err := os.OpenFile(dstFileName, os.O_WRONLY|os.O_CREATE, 0666)if err != nil {fmt.Printf("open file err=%v\n", err)return}//通過dstFile,找到Writerwriter := 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
完結撒花。
總結
以上是生活随笔為你收集整理的用go语言制作读取excel模板批量生成word工具的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用go语言制作读取excel模板批量生成
- 下一篇: 帆软finereport实现动态切换分组