龙空技术网

Go 处理word文件

go技术 80

前言:

现在各位老铁们对“go读取word”大体比较珍视,看官们都需要剖析一些“go读取word”的相关文章。那么小编同时在网上网罗了一些关于“go读取word””的相关资讯,希望各位老铁们能喜欢,咱们快快来学习一下吧!

在Go语言实际开发中,会遇到读取、写入或编辑docx格式文件等情况,目前使用比较多的第三方库有

源码:

github.com/unidoc/uniofficegithub.com/carmel/gooxmlgithub.com/nguyenthenguyen/docx

unidoc/unioffice 功能比较齐全,但是收费的,这里就不做介绍了。 carmel/gooxml: 这个库为unidoc/unioffice免费版,即1.4.0收费版,在双重许可证下提供的。在AGPLv3的条款下可以免费使用。虽然没有收费版功能多,但涵盖了大部分基本功能。 nguyenthenguyen/docx: 是一个简单的操作docx文件go语言库

carmel/gooxml取docx文件 示例

package mainimport (    "fmt"    "github.com/carmel/gooxml/document"    "log"    "os"    "strconv")func main() {    doc, err := document.Open("demo.docx")    if err != nil {        log.Fatalf("error opening document: %s", err)        return    }    //批注    for _, docfile := range doc.DocBase.ExtraFiles {        if docfile.ZipPath != "word/comments.xml" { //只处理word/comments.xml            continue        }        file, err := os.Open(docfile.DiskPath)        if err != nil {            continue        }        defer file.Close()        f, err := file.Stat()        if err != nil {            continue        }        size := f.Size()        var fileinfo []byte = make([]byte, size)        _, err = file.Read(fileinfo)        if err != nil {            continue        }        //实际应该解析<w:t>中的数据        fmt.Println(string(fileinfo))    }    //书签    for _, bookmark := range doc.Bookmarks() {        bookname := bookmark.Name()        if len(bookname) == 0 {            continue        }        fmt.Println(bookmark.Name())    }    //页眉    for _, head := range doc.Headers() {        var text string        for _, para := range head.Paragraphs() {            for _, run := range para.Runs() {                text += run.Text()            }        }        if len(text) == 0 {            continue        }        fmt.Println(text)    }    //页脚    for _, footer := range doc.Footers() {        for _, para := range footer.Paragraphs() {            var text string            for _, run := range para.Runs() {                text += run.Text()            }            if len(text) == 0 {                continue            }            fmt.Println(text)        }    }    //输出图片    //var fileBytes []byte    for k, img := range doc.Images {  //返回文档内所有图片        fmt.Println("image:", k, img.Format(), img.Path(), img.Size())    }    //doc.Paragraphs()得到包含文档所有的段落的切片    for _, para := range doc.Paragraphs() {        var text string        //run为每个段落相同格式的文字组成的片段        for _, run := range para.Runs() {            text += run.Text()            //fmt.Println("粗体", run.Properties().IsBold(), run.Text())   //判断是否是粗体            //fmt.Println("粗体属性值", run.Properties().BoldValue(), run.Text())            // fmt.Println("斜体", run.Properties().IsItalic(), run.Text()) //判断是否是斜体            //fmt.Println("斜体属性值", run.Properties().ItalicValue(), run.Text())        }        if len(text) == 0 {            continue        }        //打印一段        fmt.Println(text)    }    //获取表格中的文本    for tId, table := range doc.Tables() {        for rowId, run := range table.Rows() {            for cellId, cell := range run.Cells() {                var text string                for _, para := range cell.Paragraphs() {                    for _, run := range para.Runs() {                        text += run.Text()                        //fmt.Println("粗体", run.Properties().IsBold(), run.Text())   //判断是否是粗体                        //fmt.Println("粗体属性值", run.Properties().BoldValue(), run.Text())                        // fmt.Println("斜体", run.Properties().IsItalic(), run.Text()) //判断是否是斜体                        //fmt.Println("斜体属性值", run.Properties().ItalicValue(), run.Text())                    }                }                if len(text) == 0 {                    continue                }                fmt.Println(text)                fmt.Println("table"+strconv.Itoa(tId), "行"+strconv.Itoa(rowId), "列"+strconv.Itoa(cellId))            }        }    }}
创建docx文件

示例

package mainimport (    "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"    "log")func main() {    doc := document.New()    para := doc.AddParagraph() // 新增段落    run := para.AddRun()    //设置段落    para.SetStyle("Title")    para.SetStyle("Heading1")  // Heading1 Heading2 Heading3    para.Properties().SetFirstLineIndent(0.5 * measurement.Inch) // 段落添加首行缩进    // 换行处理,使用'\r'    run.AddText("这里是段落文字信息\n这里是第二行段落文字信息") // 添加文字信息    para.Properties().AddSection(wml.ST_SectionMarkNextPage) // 另起一页(用在AddText之后)    //设置字体样式    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) // 下划线    // 初始化图片信息    img1, err := common.ImageFromFile("demo.jpg")    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)    }    // 将图片添加到对应的段落    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)        //添加表格    table := doc.AddTable()    // width of the page    table.Properties().SetWidthPercent(100)    // with thick borers    borders := table.Properties().Borders()    borders.SetAll(wml.ST_BorderSingle, color.Auto, measurement.Zero)    row := table.AddRow()    row.AddCell().AddParagraph().AddRun().AddText("姓名")    row = table.AddRow()    row.AddCell().AddParagraph().AddRun().AddText("hello")    doc.SaveToFile("document.docx") // 保存文件路径,此处应为绝对路径}
nguyenthenguyen/docx读取docx文件

示例:

package mainimport (    "fmt"    "github.com/nguyenthenguyen/docx")func main() {    // Read from docx file    r, err := docx.ReadDocxFile("./demo.docx")    // Or read from memory    // r, err := docx.ReadDocxFromMemory(data io.ReaderAt, size int64)    // Or read from a filesystem object:    // r, err := docx.ReadDocxFromFS(file string, fs fs.FS)    if err != nil {        panic(err)    }    docx1 := r.Editable()    //获取内容    content:=docx1.GetContent()    fmt.Println(content)    r.Close()}
编辑docx文件

示例:

package mainimport (    "fmt"    "github.com/nguyenthenguyen/docx")func main() {    r, err := docx.ReadDocxFile("./demo.docx")    if err != nil {        panic(err)    }    docx1 := r.Editable()    //替换内容    docx1.Replace("旧文字", "新文字", -1)    docx1.ReplaceLink(";, ";, 1)    //替换页头信息    docx1.ReplaceHeader("head", "页头")    //替换页尾信息    docx1.ReplaceFooter("第一页", "new footer")    //替换图片    //docx1.ReplaceImage("word/media/image1.png", "./new.png")    docx1.WriteToFile("./new_demo.docx")    r.Close()}
links

标签: #go读取word #go读取word表格