做导出EXCEL时,如何删除在服务器上的EXCEL文件

有你_才有梦想 2009-07-12 06:16:16
我在做导出EXCEL时,代码在服务器端生成了一个对应EXCEL文件,想要下载完了删除这个文件,但是删除文件的代码不知道放什么地方,在这里的代码最后一行是Response.End(),在这行后不能放东西了

//
// TODO: 在此处添加构造函数逻辑
//
//dv为要输出到Excel的数据,str为标题名称
Double SumValue;
SumValue = 0;

GC.Collect();

Excel.Application excel;// = new Application();
int rowIndex = 4;
int colIndex = 0;

Excel.Workbook xBk;
Excel.Worksheet xSt;

excel = new Excel.ApplicationClass();

xBk = excel.Workbooks.Add(true);

xSt = (Excel.Worksheet)xBk.ActiveSheet;
excel.Cells.Font.Size = 10;


xSt.PageSetup.PaperSize = Excel.XlPaperSize.xlPaperA4; //A4纸
xSt.PageSetup.Orientation = Excel.XlPageOrientation.xlLandscape; //横向打印
xSt.PageSetup.LeftMargin = 0.1; //左边界1
xSt.PageSetup.RightMargin = 0.1; //右边界1
xSt.PageSetup.CenterHorizontally = true;


int ManagerMoneyColIndex; //项目管理费列索引
ManagerMoneyColIndex = -1;
//
//取得标题
//
foreach (DataColumn col in dv.Table.Columns)
{
colIndex++;
excel.Cells[4, colIndex] = col.ColumnName;
xSt.get_Range(excel.Cells[4, colIndex], excel.Cells[4, colIndex]).HorizontalAlignment = Excel.XlVAlign.xlVAlignCenter;//设置标题格式为居中对齐
if (col.ColumnName == "项目管理费")
ManagerMoneyColIndex = colIndex;
}

//
//取得表格中的数据
//
foreach (DataRowView row in dv)
{
rowIndex++;
colIndex = 0;
SumValue = 0;
foreach (DataColumn col in dv.Table.Columns)
{
colIndex++;

if (colIndex > 2 && colIndex < dv.Table.Columns.Count - 1)
{
SumValue = SumValue + Convert.ToDouble(row[colIndex].ToString());
}

if (col.DataType == System.Type.GetType("System.DateTime"))
{
excel.Cells[rowIndex, colIndex] = (Convert.ToDateTime(row[col.ColumnName].ToString())).ToString("yyyy-MM-dd");
xSt.get_Range(excel.Cells[rowIndex, colIndex], excel.Cells[rowIndex, colIndex]).HorizontalAlignment = Excel.XlVAlign.xlVAlignCenter;//设置日期型的字段格式为居中对齐
}
else
{
if ((colIndex >= 4) && (rowIndex > 4) && (colIndex <= dv.Table.Columns.Count-1))
excel.Cells[rowIndex, colIndex] = Convert.ToDouble(row[col.ColumnName].ToString()).ToString("N2");
else
{
if (col.DataType == System.Type.GetType("System.String"))
{
excel.Cells[rowIndex, colIndex] = "'" + row[col.ColumnName].ToString();
xSt.get_Range(excel.Cells[rowIndex, colIndex], excel.Cells[rowIndex, colIndex]).HorizontalAlignment = Excel.XlVAlign.xlVAlignCenter;//设置字符型的字段格式为居中对齐
}
else
{
excel.Cells[rowIndex, colIndex] = row[col.ColumnName].ToString();
}
}
}
}

if (ViewState["IsCanSeeManageMoney"].ToString() == "0")
{
if ((row[0].ToString() == "核发资金") && (row[1].ToString() != " "))
{
excel.Cells[rowIndex, ManagerMoneyColIndex] = " ";
}
}
excel.Cells[rowIndex, dv.Table.Columns.Count] = SumValue.ToString("N2");
}


//
//设置整个报表的标题为跨列居中
//
xSt.get_Range(excel.Cells[1, 1], excel.Cells[1, colIndex]).Select();
xSt.get_Range(excel.Cells[1, 1], excel.Cells[1, colIndex]).HorizontalAlignment = Excel.XlHAlign.xlHAlignCenterAcrossSelection;

xSt.get_Range(excel.Cells[1, 1], excel.Cells[1, colIndex]).Select();
xSt.get_Range(excel.Cells[4, 1], excel.Cells[rowSum, colIndex]).HorizontalAlignment = Excel.XlHAlign.xlHAlignCenterAcrossSelection;

int sameindex;
string Merg;
Merg = xSt.get_Range(excel.Cells[5, 1], excel.Cells[5, 1]).Value2.ToString();
excel.DisplayAlerts = false;
for (sameindex = 5; sameindex < rowSum; sameindex++)
{
if (Merg == xSt.get_Range(excel.Cells[sameindex + 1, 1], excel.Cells[sameindex + 1, 1]).Value2.ToString())
{

xSt.get_Range(excel.Cells[sameindex, 1], excel.Cells[sameindex + 1, 1]).MergeCells = true;

}
else
Merg = xSt.get_Range(excel.Cells[sameindex + 1, 1], excel.Cells[sameindex + 1, 1]).Value2.ToString();
}


excel.DisplayAlerts = true;
string FileName;
//FileName = DisPend(ProName);
FileName = DisPend(ProId);
xBk.SaveCopyAs(Server.MapPath(".") + "\\" + FileName + "核发明细表" + ".xls");

xBk.Close(false, null, null);

excel.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(xBk);
System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);
System.Runtime.InteropServices.Marshal.ReleaseComObject(xSt);
xBk = null;
excel = null;
xSt = null;
GC.Collect();
string path = Server.MapPath(FileName + "核发明细表" + ".xls");
System.IO.FileInfo file = new System.IO.FileInfo(path);
Response.Clear();
Response.Charset = "GB2312";
Response.ContentEncoding = System.Text.Encoding.UTF8;
Response.AddHeader("Content-Disposition", "attachment; filename=" + Server.UrlEncode(file.Name));
Response.AddHeader("Content-Length", file.Length.ToString());
Response.ContentType = "application/ms-excel";
Response.WriteFile(file.FullName);
Response.End();
...全文
564 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
insus 2009-07-16
  • 打赏
  • 举报
回复
刚导出的文件,也许没有办法即刻删除.它会提示,如:"文件“D:\..\rts.xls”正由另一进程使用,因此该进程无法访问该文件。"

所以您得先有站点创建一个临时目录,把导出的文件放在这个临时目录中.
http://www.cnblogs.com/insus/articles/1400266.html
这个临时文作夹内的文件,当天的文件删除不了,我们只能做一个动作每天删除昨天或以前的临时文件.
参考:
http://www.cnblogs.com/insus/articles/1431986.html
spark_wu 2009-07-16
  • 打赏
  • 举报
回复
up
hechenqingtian 2009-07-16
  • 打赏
  • 举报
回复
下载完之后删除就可以了啊
File.Delete(string path)
  • 打赏
  • 举报
回复
这句
Response.AddHeader("Content-Disposition", "attachment; filename=" + FileName + "核发明细表" + ".xls");
修改为:
Response.AddHeader("Content-Disposition", "attachment; filename=" + Server.Encode(FileName + "核发明细表" + ".xls"));
前面再加两句:
Response.Charset = "GB2312";
Response.ContentEncoding = Encoding.UTF8;
就可以了
  • 打赏
  • 举报
回复
感谢大家的热心回复。

hzzasdf:你的方法是可以的,唯一不足的地方是文件下载的时候文件名中的中文变成乱码了,如下:
X0440906鏍稿彂鏄庣粏琛╗1].xls

有什么办法可以显示原来的名字吗
mengxj85 2009-07-13
  • 打赏
  • 举报
回复
file.Delete(path)
觉v醒 2009-07-13
  • 打赏
  • 举报
回复
File.Delete("path");
  • 打赏
  • 举报
回复
上面这句byte[] buffer = new byte[fs.Length]; 后面漏了一句:
fs.Read(buffer, 0, buffer.Length);
然后才是fs.Close();

忙中出错
  • 打赏
  • 举报
回复
想出了个办法,先把文件读到字节数组,然后把字节数组写到Response.OutpoutStream,在vs 2005上调试通过:
GC.Collect();
string path = Server.MapPath(FileName + "核发明细表" + ".xls");//这两句是楼主的代码,下面是我的代码
FileStream fs = new FileStream(path, FileMode.Open);
byte[] buffer = new byte[fs.Length];
fs.Close();
File.Delete(path);
Response.ContentType = "application/ms-excel";
Response.AddHeader("Content-Disposition", "attachment; filename=" + FileName + "核发明细表" + ".xls");
Response.OutputStream.Write(buffer, 0, buffer.Length);
Response.Flush();
Response.End();
  • 打赏
  • 举报
回复
另外如果没有response.end(),程序不能弹出保持对话框
  • 打赏
  • 举报
回复
由于代码中有response.end(),所以
strPa=Server.MapPath(".") + "\\" + FileName + "核发明细表" + ".xls";
if(File.Exists(strPa))
{
File.Delete(strPa);
}
这段代码如果写到没有被执行到啊
  • 打赏
  • 举报
回复
能不能把excel的内容存到一个memorystream里,然后写到Response.OutputStream,
程序漫步 2009-07-12
  • 打赏
  • 举报
回复
导出 都是 往 客户机导入 。。不是导入服务器的 吧
wuyq11 2009-07-12
  • 打赏
  • 举报
回复
在代码调用前判断文件是否存在,再删除
strPa=Server.MapPath(".") + "\\" + FileName + "核发明细表" + ".xls";
if(File.Exists(strPa))
{
File.Delete(strPa);
}
或用多线程,先下载再延迟一段时间再删除文件
zhaoqiliang527 2009-07-12
  • 打赏
  • 举报
回复
up
八爪鱼-杭州 2009-07-12
  • 打赏
  • 举报
回复
删除代码写在page的unload方法中。

善缘2022 2009-07-12
  • 打赏
  • 举报
回复
这个没有研究过,帮顶
  • 打赏
  • 举报
回复
这个是能删除文件的,但是在这个代码中,不知道应该放在什么地方,我试了,执行不到或者影响文件下载
chen_ya_ping 2009-07-12
  • 打赏
  • 举报
回复
using System.IO;

File.Delete("文件的位置");
要有删除的权限。
十八道胡同 2009-07-12
  • 打赏
  • 举报
回复
up

62,039

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧