我正在使用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文件而不出现任何错误消息来解决此问题?
答案 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文件的支持极少。它会慢慢扩展,但同时欢迎补丁!