golang中,使用Excelize导出excel时,为什么打开这个excel表格是空的,没有数据?

golang中,使用Excelize操作excel

现在我想导出一张excel表,代码如下:

func main() {
        f := excelize.NewFile()
    defer func() {
        if err := f.Close(); err != nil {
            fmt.Println(err)
        }
    }()
    // 创建一个工作表
    sheetName := "Sheet1"
    index, err := f.NewSheet(sheetName)
    fmt.Println(err)

    // 在工作表中写入数据
    f.SetCellValue(sheetName, "A1", "Name")
    f.SetCellValue(sheetName, "B1", "Age")
    f.SetCellValue(sheetName, "A2", "张三")
    f.SetCellValue(sheetName, "B2", 30)
    f.SetCellValue(sheetName, "A3", "李四")
    f.SetCellValue(sheetName, "B3", 32)
    // 设置工作簿的活动sheet
    f.SetActiveSheet(index)
    fmt.Println(f.GetCellValue(sheetName, "A1"))
    fmt.Println(f.GetCellValue(sheetName, "B1"))
    fmt.Println(f.GetCellValue(sheetName, "A2"))
    fmt.Println(f.GetCellValue(sheetName, "B2"))
    fmt.Println(f.GetCellValue(sheetName, "A3"))
    fmt.Println(f.GetCellValue(sheetName, "B3"))

    // 将excel保存到指定路径
    if err := f.SaveAs("C:\\Users\\Administrator\\Desktop\\测试.xlsx"); err != nil {
        fmt.Println(err)
    }
}

执行代码后,桌面上有 测试.xlsx 的文件,但是打开之后是空的,里面没有数据,用SetCellValue 设置的那几个单元格的值也没有,明明用GetCellValue可以获取到值啊,说明已经设置进去了。但是为啥打开里面没数据呢,这是为什么?

go sdk是1.21.0版本,excelize是最新版本的,github.com/xuri/excelize/v2 v2.8.0

试了下代码没什么问题,感觉可以考虑excel方面的问题

img

引用 皆我百晓生 小程序回复内容作答:
根据你的描述,代码看起来是正确的。而且你使用 f.GetCellValue 也能够正确地获取到数据。下面是一些可能导致问题的原因:

  1. Excel软件可能有缓存:有时候,Excel软件可能会在打开文件时使用缓存数据。尝试重新打开文件或者通过右键点击文件并选择刷新来刷新查看数据是否正确。

  2. 文件路径问题:确保你的保存路径是正确的。你可以尝试在代码中使用绝对路径,例如 C:\\Users\\Administrator\\Desktop\\测试.xlsx

  3. Excel格式可能有问题:Excel文件有多种格式,例如 .xlsx、.xls 等。确保你保存的文件格式是正确的,并与你的代码相匹配。

如果你尝试了上述方法仍然无法解决问题,可能是因为在使用 Excelize 库的过程中存在其他问题。你可以尝试搜索 Excelize 文档、示例或者考虑使用其他库来操作 Excel 文件。

我用其他软件打开了这个excel,发现里面有数据??为啥wps打开会没有数据?这么奇怪的吗?

【以下回答由 GPT 生成】

问题原因是在Excelize中,当使用SetCellValue方法设置单元格值时,该值默认是字符串类型。而在Excel中,单元格有不同的数据类型,如字符串、数值、日期等。因此,需要根据数据类型设置单元格的格式。

解决方案如下:

import (
    "fmt"
    "github.com/360EntSecGroup-Skylar/excelize/v2"
)

func main() {
    f := excelize.NewFile()
    defer func() {
        if err := f.Close(); err != nil {
            fmt.Println(err)
        }
    }()

    sheetName := "Sheet1"
    index := f.NewSheet(sheetName)

    // 创建一个样式,设置数据类型为字符串
    style, err := f.NewStyle(`{"number_format": 1}`)
    if err != nil {
        fmt.Println(err)
        return
    }

    // 在工作表中写入数据并设置样式
    f.SetCellValue(sheetName, "A1", "Name")
    f.SetCellValue(sheetName, "B1", "Age")
    f.SetCellValue(sheetName, "A2", "张三")
    f.SetCellValue(sheetName, "B2", 30)
    f.SetCellValue(sheetName, "A3", "李四")
    f.SetCellValue(sheetName, "B3", 32)

    // 设置单元格样式
    f.SetCellStyle(sheetName, "A1", "B3", style)

    // 设置工作簿的活动sheet
    f.SetActiveSheet(index)

    // 保存excel文件
    if err = f.SaveAs("C:\\Users\\Administrator\\Desktop\\测试.xlsx"); err != nil {
        fmt.Println(err)
    }
}

在上述代码中,我添加了一个样式style,并使用NewStyle方法创建了一个样式对象。{"number_format": 1}表示该样式的数据类型为字符串。然后,使用SetCellValue方法设置单元格值,并使用SetCellStyle方法将样式应用到指定的区域。

最后,保存Excel文件后,打开时将会看到正确的数据。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^