主要使用 baliance.com/gooxml 下的 document 包
原理:windows下的docx格式文件实际上是一个压缩包,打开之后可以看到具体的内容
下边直接上代码,实现的是获取docx文件中的文本和表格中的文本
package main
import (
"fmt"
"runtime"
"time"
"baliance.com/gooxml/document"
)
func main() {
doc, err := document.Open("测试.docx")
if err != nil {
log.Fatalf("error opening document: %s", err)
return
}
//批注
for _, docfile := range doc.DocBase.ExtraFiles {
if docfile.ZipPath != "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)
}
}
//doc.Paragraphs()得到包含文档所有的段落的切片
for _, para := range doc.Paragraphs() {
var text string
//run为每个段落相同格式的文字组成的片段
for _, run := range para.Runs() {
text += run.Text()
}
if len(text) == 0 {
continue
}
//打印一段
fmt.Println(text)
}
//获取表格中的文本
for _, table := range doc.Tables() {
for _, run := range table.Rows() {
for _, cell := range run.Cells() {
var text string
for _, para := range cell.Paragraphs() {
for _, run := range para.Runs() {
//fmt.Print("\t-----------第", j, "格式片段-------------")
text += run.Text()
}
}
if len(text) == 0 {
continue
}
fmt.Println(text)
}
}
}
}