dt_automate/wps/word.go

165 lines
4.5 KiB
Go
Raw Normal View History

2025-02-19 18:30:19 +08:00
package wps
import (
"io/ioutil"
"log"
2025-02-25 18:36:33 +08:00
"strings"
2025-02-19 18:30:19 +08:00
2025-02-25 18:36:33 +08:00
"github.com/unidoc/unioffice/common"
"github.com/unidoc/unioffice/common/license"
"github.com/unidoc/unioffice/document"
"github.com/unidoc/unioffice/measurement"
"github.com/unidoc/unioffice/schema/soo/wml"
2025-02-19 18:30:19 +08:00
)
// 设置unidoc key
func init() {
// Make sure to load your metered License API key prior to using the library.
// If you need a key, you can sign up and create a free one at https://cloud.unidoc.io
err := license.SetMeteredKey(`4d568da2fb25ed2477068464ffde96b7e7fa091595e6af3610eb4aee1b539a24`)
if err != nil {
panic(err)
}
}
2025-02-25 18:36:33 +08:00
2025-02-19 18:30:19 +08:00
func Word() {
2025-02-25 18:36:33 +08:00
doc, err := document.Open("temp.docx")
if err != nil {
log.Println("打开文件失败", err)
}
2025-02-19 18:30:19 +08:00
defer doc.Close()
2025-02-25 18:36:33 +08:00
// 填充模板中的变量
paragraphs := []document.Paragraph{}
for _, p := range doc.Paragraphs() {
paragraphs = append(paragraphs, p)
}
// This sample document uses structured document tags, which are not common
// except for in document templates. Normally you can just iterate over the
// document's paragraphs.
for _, sdt := range doc.StructuredDocumentTags() {
for _, p := range sdt.Paragraphs() {
paragraphs = append(paragraphs, p)
}
}
2025-02-19 18:30:19 +08:00
2025-02-25 18:36:33 +08:00
for _, p := range paragraphs {
for _, r := range p.Runs() {
if strings.Contains(r.Text(), "{{DATE_A}}") {
Replacetext(r, "{{DATE_A}}", "2025年02月25日")
} else if strings.Contains(r.Text(), "{{DATE_A}}") {
// r.ClearContent()
} else {
// fmt.Println("not modifying", r.Text())
}
}
}
// 遍历文档中的表格
for _, table := range doc.Tables() {
for _, row := range table.Rows() {
for i, cell := range row.Cells() {
var (
b string
p document.Paragraph
k int
)
for k, p = range cell.Paragraphs() {
for _, a := range p.Runs() {
b += a.Text()
}
// log.Println(k)
}
log.Println(i)
if strings.Contains(b, "{{DATE_B}}") {
// log.Println(k)
for _, h := range cell.Paragraphs()[k].Runs() {
h.ClearContent()
}
cell.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter)
cell.Paragraphs()[k].AddRun().AddText("2025年02月25日")
}
log.Println(b)
b = ""
}
}
}
2025-02-19 18:30:19 +08:00
doc.SaveToFile("simple.docx")
}
2025-02-25 18:36:33 +08:00
// 文字替换
func Replacetext(r document.Run, src, ends string) {
datas := r.Text()
r.ClearContent()
r.AddText(strings.Replace(datas, src, ends, -1))
log.Println(strings.Replace(datas, src, ends, -1))
2025-02-19 18:30:19 +08:00
}
2025-02-25 18:36:33 +08:00
// func createParaRun(doc *document.Document, s string) document.Run {
// para := doc.AddParagraph()
// run := para.AddRun()
// run.AddText(s)
// return run
// }
2025-02-19 18:30:19 +08:00
var lorem = `Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin lobortis, lectus dictum feugiat tempus, sem neque finibus enim, sed eleifend sem nunc ac diam. Vestibulum tempus sagittis elementum`
func Word_img() {
doc := document.New()
img1, err := common.ImageFromFile("gophercolor.png")
if err != nil {
log.Fatalf("unable to create image: %s", err)
}
img2data, err := ioutil.ReadFile("gophercolor.png")
if err != nil {
log.Fatalf("unable to read file: %s", err)
}
img2, err := common.ImageFromBytes(img2data)
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)
}
img2ref, err := doc.AddImage(img2)
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("Gopher")
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) //设置文本环绕正方形
run := para.AddRun()
for i := 0; i < 16; i++ {
run.AddText(lorem)
// drop an inline image in
if i == 13 {
inl, err := run.AddDrawingInline(img1ref)
if err != nil {
log.Fatalf("unable to add inline image: %s", err)
}
inl.SetSize(1*measurement.Inch, 1*measurement.Inch)
}
if i == 15 {
inl, err := run.AddDrawingInline(img2ref)
if err != nil {
log.Fatalf("unable to add inline image: %s", err)
}
inl.SetSize(1*measurement.Inch, 1*measurement.Inch)
}
}
doc.SaveToFile("image.docx")
}