Golang Excelize库问题 - 在之前的版本中能正常运行

Golang Excelize库问题 - 在之前的版本中能正常运行 我使用 Excelize 已经很长时间了 在 Golang 1.20.1 和 1.20.4 版本中

我安装了 Golang 1.20.5,然后 .go 程序停止工作:

.\myprogram.go:6397:10: fexcel.SetSheetViewOptions undefined (type *excelize.File has no field or method SetSheetViewOptions)
.\myprogram.go:6398:13: undefined: excelize.DefaultGridColor
.\myprogram.go:6399:13: undefined: excelize.ShowFormulas
.\myprogram.go:6400:13: undefined: excelize.ShowGridLines
.\myprogram.go:6401:13: undefined: excelize.ShowRowColHeaders
.\myprogram.go:6402:13: undefined: excelize.RightToLeft
.\myprogram.go:6402:13: too many errors

然后我尝试从 Excelize 获取一个新版本

注意:下面,GH 代表 github.com,GOL 代表 golang.org,因为我在这个论坛是新手,不能在这里放置超过 2 个链接

myprogram.go:155:2: no required module provides package GH/qax-os/excelize; to add it:
go get GH/qax-os/excelize

go.mod:

go 1.20

require (
GH/qax-os/excelize/v2 v2.7.1 // indirect

在 myprogram.go 中:

import (
“GH/xuri/excelize/v2”

我也尝试过:

“GH/qax-os/excelize/v2”
$ go run myprogram.go
myprogram.go:159:2: GH/qax-os/excelize/v2@v2.7.1: parsing go.mod:
module declares its path as: GH/xuri/excelize/v2
but was required as: GH/qax-os/excelize/v2

之后我使用了: 在 go.mod 中:

GH/xuri/excelize/v2 v2.7.1 // indirect

在 myprogram.go 中:

“GH/xuri/excelize/v2”

然后 myprogram.go 给出以下错误:

.\myprogram.go:6397:10: fexcel.SetSheetViewOptions undefined (type *excelize.File has no field or method SetSheetViewOptions)
.\myprogram.go:6398:13: undefined: excelize.DefaultGridColor
.\myprogram.go:6399:13: undefined: excelize.ShowFormulas
.\myprogram.go:6400:13: undefined: excelize.ShowGridLines
.\myprogram.go:6401:13: undefined: excelize.ShowRowColHeaders
.\myprogram.go:6402:13: undefined: excelize.RightToLeft
.\myprogram.go:6402:13: too many errors

Github 上的页面: GH/qax-os/excelize

GH/xuri/excelize 重定向到 GH/qax-os/excelize

GH/xuri/excelize/v2 不存在

GH/360EntSecGroup-Skylar/excelize 重定向到 GH/qax-os/excelize

我尝试了很多命令 有些成功了,有些失败了,当我尝试使用 go run 时遇到了问题

go get GH/qax-os/excelize
go: GH/qax-os/excelize@v1.4.1: parsing go.mod:
module declares its path as: GH/360EntSecGroup-Skylar/excelize
but was required as: GH/qax-os/excelize
$ go get GH/360EntSecGroup-Skylar/excelize
go: downloading GH/360EntSecGroup-Skylar/excelize v1.4.1
go: downloading GH/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826
go: added GH/360EntSecGroup-Skylar/excelize v1.4.1
$ go get GH/xuri/excelize
go: GH/xuri/excelize@v1.4.1: parsing go.mod:
module declares its path as: GH/360EntSecGroup-Skylar/excelize
but was required as: GH/xuri/excelize
$ go get GH/xuri/excelize/v2
go: downloading GH/xuri/excelize v1.4.1
go: downloading GH/xuri/excelize/v2 v2.7.1
go: downloading GH/richardlehane/mscfb v1.0.4
go: downloading GH/xuri/efp v0.0.0-20220603152613-6918739fd470
go: downloading GH/xuri/nfp v0.0.0-20220409054826-5e722a1d9e22
go: downloading GOL/x/crypto v0.9.0
go: downloading GOL/x/net v0.10.0
go: downloading GOL/x/text v0.9.0
go: downloading GH/richardlehane/msoleps v1.0.3
go: upgraded GH/xuri/excelize/v2 v2.7.0 => v2.7.1

更多关于Golang Excelize库问题 - 在之前的版本中能正常运行的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

你必须使用 excelize v2.6.1 或更早版本。2.7.0 版本似乎已弃用 SetSheetViewOptions(也许你仍然可以使用 2.7.0?),而 2.7.1 版本则移除了该功能。

更多关于Golang Excelize库问题 - 在之前的版本中能正常运行的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


谢谢。问题已解决。

我使用了最新版本并修改了代码,因为Excelize更改了一些函数名称并弃用了部分功能。

GitHub

Releases · qax-os/excelize

用于读写 Microsoft Excel™ (XLAM / XLSM / XLSX / XLTM / XLTX) 电子表格的 Go 语言库 - qax-os/excelize

现在可以正常工作了。

这是一个典型的模块路径变更导致的兼容性问题。Excelize 库已经从 github.com/360EntSecGroup-Skylar/excelize 迁移到 github.com/xuri/excelize,但你的代码还在使用旧的 API。

问题在于 SetSheetViewOptions 和相关常量在 v2 版本中已经被移除。这些 API 在 v1 版本中存在,但在 v2 版本中被重新设计了。

以下是解决方案:

1. 更新 go.mod 文件:

module your-module-name

go 1.20

require github.com/xuri/excelize/v2 v2.7.1

2. 更新导入语句:

import "github.com/xuri/excelize/v2"

3. 修改代码使用新的 API:

旧的 SetSheetViewOptions 和相关常量已经被新的 SetSheetView 方法替代。以下是修改示例:

// 旧代码(v1 版本):
err = fexcel.SetSheetViewOptions("Sheet1", -1,
    excelize.DefaultGridColor(false),
    excelize.ShowFormulas(false),
    excelize.ShowGridLines(true),
    excelize.ShowRowColHeaders(true),
    excelize.RightToLeft(false),
)

// 新代码(v2 版本):
err = fexcel.SetSheetView("Sheet1", -1, &excelize.ViewOptions{
    DefaultGridColor:  &[]bool{false}[0],
    ShowFormulas:      &[]bool{false}[0],
    ShowGridLines:     &[]bool{true}[0],
    ShowRowColHeaders: &[]bool{true}[0],
    RightToLeft:       &[]bool{false}[0],
})

或者使用更简洁的方式:

// 新代码(v2 版本)的另一种写法:
showGridLines := true
showHeaders := true
hideFormulas := false
defaultGridColor := false
rightToLeft := false

err = fexcel.SetSheetView("Sheet1", -1, &excelize.ViewOptions{
    DefaultGridColor:  &defaultGridColor,
    ShowFormulas:      &hideFormulas,
    ShowGridLines:     &showGridLines,
    ShowRowColHeaders: &showHeaders,
    RightToLeft:       &rightToLeft,
})

4. 清理并重新构建:

# 清理模块缓存
go clean -modcache

# 下载依赖
go mod tidy

# 运行程序
go run myprogram.go

5. 如果还需要使用 v1 版本的 API,可以降级到 v1:

# 降级到 v1 版本
go get github.com/xuri/excelize@v1.4.1

然后在代码中使用:

import "github.com/xuri/excelize"

但建议升级到 v2 并使用新的 API,因为 v1 版本已经不再维护。

完整的工作示例:

package main

import (
    "fmt"
    "github.com/xuri/excelize/v2"
)

func main() {
    f := excelize.NewFile()
    
    // 设置工作表视图选项
    showGridLines := true
    showHeaders := true
    hideFormulas := false
    defaultGridColor := false
    rightToLeft := false
    
    if err := f.SetSheetView("Sheet1", -1, &excelize.ViewOptions{
        DefaultGridColor:  &defaultGridColor,
        ShowFormulas:      &hideFormulas,
        ShowGridLines:     &showGridLines,
        ShowRowColHeaders: &showHeaders,
        RightToLeft:       &rightToLeft,
    }); err != nil {
        fmt.Println(err)
        return
    }
    
    // 保存文件
    if err := f.SaveAs("Book1.xlsx"); err != nil {
        fmt.Println(err)
    }
}

主要变化是:

  • SetSheetViewOptions 改为 SetSheetView
  • 常量参数改为结构体字段
  • 所有字段都需要使用指针传递布尔值

这是 Excelize v2 版本的 API 设计变更,你需要按照新的方式重写相关代码。

回到顶部