protected void ButtonGetFile_Click(object sender, EventArgs e)
{
string strErr="";
string strTCTempFileName = "" ;
AddNewTC();
Application myExcel = new Application();
try
{
InterService.CInterService interService = new InterService.CInterService();
System.Data.DataSet ds = interService.getTCTemp(DropDownListTCTemp.SelectedValue);
if (ds.Tables[0].Rows.Count - 1 < 0)
{
strErr = "没有模板记录!";
LabelErrMsg.Text = strErr;
return;
}
System.Data.DataRow row = ds.Tables[0].Rows[ds.Tables[0].Rows.Count - 1];
if (row["TCTempFile"].GetType().FullName != "System.DBNull")
{
strTCTempFileName = row["TCTempFile"].ToString();
}
else
{
strErr = "没有模板文件记录!";
LabelErrMsg.Text = strErr;
return;
}
//打开模板文件
if (!File.Exists(Server.MapPath("/") + "ExcelFiles\\TCTempFiles\\" + strTCTempFileName + ".xls"))
{
strErr = "服务器文件夹中没有该模板文件!";
LabelErrMsg.Text = strErr;
return;
}
myExcel.Application.Workbooks.Open(Server.MapPath("/") + "ExcelFiles\\TCTempFiles\\" + strTCTempFileName + ".xls");
myExcel.Visible = false;
// 写入内容
if (WriteExcelData(myExcel, strTCTempFileName, out strErr) != 0)
{
LabelErrMsg.Text = strErr;
}
//myExcel.Cells[2, 2] = "用模板导出的报表,这是数据";
//在当前目录下指定一个临时文件
string strFileName = Server.MapPath("/") + "ExcelFiles\\" + "TC" + Session["UserID"] + ".xls";
if (File.Exists(strFileName))
{
File.Delete(strFileName);
}
myExcel.ActiveWorkbook.SaveAs(strFileName);
myExcel.Application.Workbooks.Close();
myExcel.Quit();
Marshal.ReleaseComObject(myExcel);
GC.Collect();
GC.WaitForPendingFinalizers();
//****发送文件
Response.ClearContent();
Response.ClearHeaders();
Response.ContentType = "application/vnd.ms-excel";
Response.AddHeader("Content-Disposition", "inline;filename='" + DropDownListLot.SelectedValue + ".xls'");
Response.WriteFile(strFileName);//FileName为Excel文件所在地址
Response.Flush();
Response.Close();
}
catch (Exception ex)
{
strErr = ex.Message;
LabelErrMsg.Text = strErr;
return;
}
finally
{
myExcel.Quit();
Marshal.ReleaseComObject(myExcel);
GC.Collect();
GC.WaitForPendingFinalizers();
}
}
7 个解决方案
#2
调用office.excel.dll有时就是会出现这样的问题,死进程.
因为它的原理就是调用系统中的excel进程去操作文件
使用第三方dll直接操作文件好了,1楼已经给出了链接
无需安装office,兼容32位64位
因为它的原理就是调用系统中的excel进程去操作文件
使用第三方dll直接操作文件好了,1楼已经给出了链接
无需安装office,兼容32位64位
#3
谢谢,还有没有什么方法可以在操作Excel完成后强制结束这些进程呢。
#4
如果你做的是单机版的程序,我会告诉你可以使用Process.Kill()杀死进程
但是你的是网站,网站天生是多线程的,100个用户登陆同时导出,有可能打开了100个excel的进程,你胡乱的去杀死进程,会导致有的用户导出没有完成任务就提前结束了
但是你的是网站,网站天生是多线程的,100个用户登陆同时导出,有可能打开了100个excel的进程,你胡乱的去杀死进程,会导致有的用户导出没有完成任务就提前结束了
#5
npoi,aspose,epplus,openxml,spire.xls都是不需要安装office直接操作xls文档的而且性能比com组件高。推荐使用
#6
推荐使用npoi,这个在服务器上面不会引发 操作excel的iis错误,推荐使用
#7
office.excel.dll 只能杀死本机电脑,服务器的杀不掉。我以前经常搞这东西,没办法。
还是换组件吧,npoi 不错
还是换组件吧,npoi 不错
#1
#2
调用office.excel.dll有时就是会出现这样的问题,死进程.
因为它的原理就是调用系统中的excel进程去操作文件
使用第三方dll直接操作文件好了,1楼已经给出了链接
无需安装office,兼容32位64位
因为它的原理就是调用系统中的excel进程去操作文件
使用第三方dll直接操作文件好了,1楼已经给出了链接
无需安装office,兼容32位64位
#3
谢谢,还有没有什么方法可以在操作Excel完成后强制结束这些进程呢。
#4
如果你做的是单机版的程序,我会告诉你可以使用Process.Kill()杀死进程
但是你的是网站,网站天生是多线程的,100个用户登陆同时导出,有可能打开了100个excel的进程,你胡乱的去杀死进程,会导致有的用户导出没有完成任务就提前结束了
但是你的是网站,网站天生是多线程的,100个用户登陆同时导出,有可能打开了100个excel的进程,你胡乱的去杀死进程,会导致有的用户导出没有完成任务就提前结束了
#5
npoi,aspose,epplus,openxml,spire.xls都是不需要安装office直接操作xls文档的而且性能比com组件高。推荐使用
#6
推荐使用npoi,这个在服务器上面不会引发 操作excel的iis错误,推荐使用
#7
office.excel.dll 只能杀死本机电脑,服务器的杀不掉。我以前经常搞这东西,没办法。
还是换组件吧,npoi 不错
还是换组件吧,npoi 不错