我发现这个问题提出了几次,但还没有明确的答案。看起来像一个体面的解决方案会帮助不少人。
因此,我们在服务器上创建了一个 excel 文件 (.xlsx) 并使用 content-disposition 'attachment' 将其下载到客户端。如果您选择“保存”或“打开”然后“另存为”,则会出现“打开保存”对话框,并且一切正常... 但是,如果您选择“打开”然后点击“保存...”按钮,则 Excel 会挂起片刻,然后显示以下消息:您的由于共享冲突,无法将更改保存到“Export[5].xlsx”。尝试保存到其他文件。那么:您尝试打开的文件“F8CAC020.IE5\HM2NBE5C\F8CAC020”的格式与文件扩展名指定的格式不同。在打开文件之前,请确认文件没有损坏并且来自受信任的来源。您现在要打开文件吗?然后:你终于得到了另存为:对话框(假设你按下了“是”)。
创建文件的代码是:
Response.Clear()
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
Response.AppendHeader("content-disposition", "attachment;filename=Export.xlsx")
Response.AddHeader("Content-Length", New System.IO.FileInfo(NewFile).Length)
Response.TransmitFile(NewFile)
Response.Flush()
如果您删除 content-disposition 标头,您将在 Excel 中获得正确的行为,但名称错误并且不能保证 Excel 文档不会显示在浏览器中(取决于客户端设置)。如果您按打开然后保存,那么您会收到一条消息:“default.aspx”是只读的。若要保存副本,请单击“确定”,然后在“另存为”对话框中为工作簿指定一个新名称。
所以问题是如何将这两种行为组合成一个合理的行为:当您尝试打开然后保存下载的文件时,直接在上面获取漂亮的错误消息,但还要指定应该下载文档并指定默认文件名。
干杯,
詹姆士