这个问题已经被问过很多次了,但是我仍然找不到合适的解决方案。我有两个问题。
我正在创建一个excel文件,向其中写入数据,然后将其呈现给用户下载。我已经使用了microsoft.interop。
第一个问题是:
我正在尝试使用一个消息框(javascript)来显示用户下载了excel后在excel文件中生成了多少行。此消息框从不显示,但是代码已执行。我怎样才能做到这一点?
其次:
创建Excel之后,即使我手动清理了引用,excel.exe进程仍在任务管理器中运行。
呈现文件后,此警告框不显示。
flag = WriteDatasetToExcel(ds);
if (flag)
{
ClientScript.RegisterClientScriptBlock(GetType(), "Javascript", "<script>alert('Number of rows generated : " + ds.Tables[0].Rows.Count + "')</script>");
}
给出了相关代码
excelApp = new Excel.Application();
excelwrkbook = excelApp.Workbooks.Add(1);
excelwrksheet = (Excel.Worksheet)excelwrkbook.Sheets[1];
excelwrksheet.Name = "Application Data";
写入数据后,保存和呈现如下:
excelwrkbook.SaveAs(filepath, Excel.XlFileFormat.xlWorkbookNormal, Missing.Value, Missing.Value, false, true, Excel.XlSaveAsAccessMode.xlNoChange, Excel.XlSaveConflictResolution.xlLocalSessionChanges, false, Missing.Value, Missing.Value, true);
excelwrkbook.Close(0, 0, 0);
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.Buffer = true;
HttpContext.Current.Response.Charset = "";
HttpContext.Current.Response.AddHeader("content-disposition", "attachment; filename=" + filename);
HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";
HttpContext.Current.Response.WriteFile(filepath);
excelApp.Quit();
flag = true;
现在最后是清理代码:
ReleaseObjects(excelrange);
ReleaseObjects(excelwrksheet);
ReleaseObjects(excelwrkbook);
ReleaseObjects(excelApp);
releaseobjects函数如下:
private void ReleaseObjects(Object obj)
{
if (obj != null && Marshal.IsComObject(obj))
{
while (System.Runtime.InteropServices.Marshal.ReleaseComObject(obj) != 0) { }
}
}
最佳答案
首先,我要告诉您,使用Microsoft Excel interop在基于Web的环境中工作效率不是很高。
我通常使用openXML方法来满足此需求。 here
对于第一个问题:
您的响应内容类型为application / vnd.ms-excel,因此浏览器将不会从该内容执行任何Java脚本。您必须确定已下载了excel或进行了事先调用以获取行并以Java脚本或任何其他可接受的内容类型返回结果。
对于第二个问题:只是不要将其用于Web环境,因为它不是为它设计的。