在Google App Engine上以Go语言打开tealeg xlsx制作的XLSX文件时出错

时间:2016-02-08 07:45:15

标签: excel google-app-engine go xlsx

我正在使用https://github.com/tealeg/xlsx以Go语言生成xlsx文件。该应用程序正在Google App Engine上运行。

var file *xlsx.File
var sheet *xlsx.Sheet
var row *xlsx.Row
var cell *xlsx.Cell
var err error

file = xlsx.NewFile()
sheet, err = file.AddSheet("TEST")
if err != nil {
  fmt.Printf(err.Error())
}
row = sheet.AddRow()
cell = row.AddCell()
cell.Value = "I am a cell!"

w.Header().Set("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
w.Header().Add("Content-Disposition", "attachment; filename=Test.xlsx")
file.Write(w)
fmt.Fprint(w, nil)

变量w是http.ResponseWriter。

我已经测试了这段代码,浏览器成功下载了xlsx文件,我可以在Linux 64位上用LibreOffice打开它。但是,当我尝试在Windows 7 32位上使用Microsoft Excel 2010打开该文件时,它给了我以下错误消息: -

  

Excel在'Test.xlsx'中找到了不可读的内容。你想恢复这个工作簿的内容吗?如果您信任此工作簿的来源,请单击“是”。

点击是,它显示内容“我是一个单元格!”正确然后我点击启用编辑按钮,它给了我一条消息: -

  

Excel完成了文件级验证和修复。本工作簿的某些部分可能已被修复或丢弃。

如何通过使Microsoft Excel打开由tealeg / xlsx生成的xlsx文件而不出现任何错误消息来解决此问题?

1 个答案:

答案 0 :(得分:2)

您的最后一行完全没必要,它会破坏Excel文件(XLSX是一个zip存档):

fmt.Fprint(w, nil)

在您编写了Excel文件的内容之后,这会将"<nil>"字符串的字节打印到Web响应中,我相信您刚刚将其留在那里作为一个意外。删除它。

同样File.Write()会返回error,同时也会检查:

if err = file.Write(w); err != nil {
    // Handle error, e.g. log it and send back an error response
}

如果错误仍然存​​在,则与AppEngine无关。我建议首先在本地尝试Excel生成,使用File.Save()将其保存到文件中,例如:

if err = file.Save("MyXLSXFile.xlsx"); err != nil {
    fmt.Println("Failed to save file:", err)
}
// If no error, try opening "MyXLSXFile.xlsx" on you computer.

另请注意图书馆主页上的评论:

  

目前对编写XLSX文件的支持极少。它会慢慢扩展,但同时欢迎补丁!