package produce import ( "fmt" "log" "strings" "time" "xgAutoTest/internal/global" "github.com/carmel/gooxml/color" "github.com/carmel/gooxml/common" "github.com/carmel/gooxml/document" "github.com/carmel/gooxml/measurement" "github.com/carmel/gooxml/schema/soo/wml" ) type TableUpperPart struct { Left []string Right []string SqlToTextsList []string ImagesList [][]byte } type WordInfo struct { doc *document.Document } func testtoWord() { //1. 创建文档并填写内容 doc := document.New() para := doc.AddParagraph() // 新增段落 run := para.AddRun() run.AddText("这里是段落文字信息") // 添加文字信息 // 如果想对添加的文字信息进行换行处理,使用'\r' run.AddText("这里第一行段落文字信息\r这里是第二行段落文字信息") // 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("./test_pic_1.png") 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) doc.SaveToFile("simple.docx") // 保存文件路径,此处应为绝对路径 } func Newword() *WordInfo { return &WordInfo{ doc: document.New(), } } func (wd *WordInfo) WriterTable(fileLocal string, tableUpperPart TableUpperPart, SingleImage []byte) { //wd.doc = document.New() // 写入表名 //wd.doc.AddParagraph().AddRun().AddText("tableName") // 添加一个表格 table := wd.doc.AddTable() // width of the page table.Properties().SetWidthAuto() // with thick borers borders := table.Properties().Borders() borders.SetAll(wml.ST_BorderSingle, color.Auto, measurement.Zero) for i, left := range tableUpperPart.Left { addRow(&table, left, tableUpperPart.Right[i]) } wd.InsertSingleImage(&table, SingleImage) wd.doc.AddParagraph() } func (wd *WordInfo) SaveWord(fileLocal string) { timeNow := time.Now().Format("2006-01-02-15.04.05") wd.doc.SaveToFile(fmt.Sprintf("%s/ok_%s.docx", fileLocal, timeNow)) } func addRow(table *document.Table, col1, col2 string) { row := table.AddRow() rowCellLeft := row.AddCell() rowCellLeft.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter) rowCellLeft.Properties().SetWidthPercent(25) rowCellLeft.AddParagraph().AddRun().AddText(col1) rowCellRight := row.AddCell() if col1 == "用例名称" { rowCellLeft.Properties().SetShading(wml.ST_ShdSolid, color.RGB(128, 128, 128), color.RGB(128, 128, 128)) rowCellRight.Properties().SetShading(wml.ST_ShdSolid, color.RGB(128, 128, 128), color.RGB(128, 128, 128)) } //rowCellRight.AddParagraph().AddRun().AddText(col2) //将;分号识别为换行 startIndex := 0 for { index := strings.Index(col2[startIndex:], ";") if index == -1 { break } // 找到了分号,执行相应操作 rowCellRight.AddParagraph().AddRun().AddText(col2[startIndex : startIndex+index+1]) // 更新起始索引,继续检索下一个分号 startIndex += index + 1 } // 处理最后一个分号后的部分(如果有) if startIndex < len(col2) { rowCellRight.AddParagraph().AddRun().AddText(col2[startIndex:]) } } // 插入合并后的图片到表格内 func (wd *WordInfo) InsertSingleImage(table *document.Table, data []byte) { row := table.AddRow() rowCellLeft := row.AddCell() //row.AddCell().Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter) rowCellLeft.AddParagraph().AddRun().AddText("测试结果截图") rowCellLeft.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter) ///row = table.AddRow() ParagraphTemp := row.AddCell().AddParagraph() img1, err := common.ImageFromBytes(data) if err != nil { log.Fatalf("unable to create image: %s", err) } // 创建一个图片对象 image, err := wd.doc.AddImage(img1) // 替换为实际图片路径 if err != nil { log.Fatalf("unable to doc.AddImage: %s", err) } inlineDrawing, err := ParagraphTemp.AddRun().AddDrawingInline(image) if err != nil { global.Logs.Fatalf("unable to doc.AddImage: %s", err) } inlineDrawing.SetSize(300, 400) // 设置图像大小为 100x100 像素 } func (wd *WordInfo) InsertImages(table *document.Table, data [][]byte) { row := table.AddRow() ParagraphTemp := row.AddCell().AddParagraph() for _, v := range data { img1, err := common.ImageFromBytes(v) if err != nil { log.Fatalf("unable to create image: %s", err) } // 创建一个图片对象 image, err := wd.doc.AddImage(img1) // 替换为实际图片路径 if err != nil { log.Fatalf("unable to doc.AddImage: %s", err) } _, err = ParagraphTemp.AddRun().AddDrawingInline(image) if err != nil { global.Logs.Fatalf("unable to doc.AddImage: %s", err) } //inlineDrawing.SetSize(100, 100) // 设置图像大小为 100x100 像素 } }