DataTable导出excel问题 郁闷ing 求求CSDN达人帮揭

baoxuetianxia 2010-05-07 12:51:11

DataSet ds = PowerGisDB.GetDataSet(sql);
string filePath = Server.MapPath("~/Report_1/doc/" + Guid.NewGuid().ToString() + ".xls");
File.Copy(Server.MapPath("~/Report_1/tww.xls"), filePath);

// 使用OleDb驱动程序连接到副本
OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";Extended Properties=Excel 8.0;");
using (conn)
{
try
{
conn.Open();
// 增加记录
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
OleDbCommand cmd = new OleDbCommand("INSERT INTO [Sheet1$]([序号],[线路名称], [户名], [容量],[配变型式],[idKey],[年份],[月份],[实际电量]) VALUES(@t0,@t1,@t2, @t3,@t4,@t5,@t6,@t7,@t8)", conn);
cmd.Parameters.AddWithValue("@t0", i + 1);
cmd.Parameters.AddWithValue("@t1", ds.Tables[0].Rows[i]["线路名称"].ToString());
cmd.Parameters.AddWithValue("@t2", ds.Tables[0].Rows[i]["户名"].ToString());
cmd.Parameters.AddWithValue("@t3", ds.Tables[0].Rows[i]["容量"].ToString());
cmd.Parameters.AddWithValue("@t4", ds.Tables[0].Rows[i]["配变型式"].ToString());
cmd.Parameters.AddWithValue("@t5", ds.Tables[0].Rows[i]["idKey"].ToString());
cmd.Parameters.AddWithValue("@t6", ds.Tables[0].Rows[i]["年份"].ToString());
cmd.Parameters.AddWithValue("@t7", ds.Tables[0].Rows[i]["月份"].ToString());
cmd.Parameters.AddWithValue("@t8", ds.Tables[0].Rows[i]["实际电量"].ToString());
cmd.ExecuteNonQuery();
}
}
//运行到这里Guid.NewGuid().ToString().xls这个文件就被 WebDev。Webserver.exe占用 有时候释放 的 早,有时候释放的晚 就会导致File.ReadAllBytes(这个excel被进程还用着呢 当然会出错了哦)
catch(System.Exception ex)
{
throw ex;
}
finally
{
conn.Close();
}

}

//this.KillProcess("EXCEL.EXE");
//输出副本的二进制字节流
Response.ContentType = "application/ms-excel";
Response.AppendHeader("Content-Disposition", "attachment;filename=superengine.xls");

/* tww add at 20100506
我认为之所以出现进程占用的的错误,是因为当excel
写入的内容较多时,操作系统(WINDOWS2000)关闭excel
进程时间要长一些,而.NET下载代码运行很快,
马上会要求读取excel 的文档,这时操作系统尚未处理完excel 的进程,
因此excel 文档处于收保护状态,因此造成.NET进程和excel 进程的冲突。
*/

this.killProcess();
System.Threading.Thread.Sleep(3000);//为了延缓


byte[] tww = File.ReadAllBytes(。。。));
Response.BinaryWrite(tww);
// 删除副本
try
{
File.Delete(filePath);
}
catch(System.IO.IOException ex)
{

}
finally
{
File.Delete(Server.MapPath("~/Report_1/doc/tww123.xls"));
}
Response.End();

我认为之所以出现进程占用的的错误,是因为当excel
写入的内容较多时,操作系统(WINDOWS2000)关闭excel
进程时间要长一些,而.NET下载代码运行很快,
马上会要求读取excel 的文档,这时操作系统尚未处理完excel 的进程,
因此excel 文档处于收保护状态,因此造成.NET进程和excel 进程的冲突。
如何解决啊 下午就要交了哦。感谢达人门了啊。急啊
...全文
213 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
ls1011 2010-08-25
  • 打赏
  • 举报
回复
baoxuetianxia 同是天涯沦落人啊 我也遇到了这样的问题 老是提示线程没占用 可是在网上找了好久 都没找到解决办法 晕了啊
baoxuetianxia 2010-05-13
  • 打赏
  • 举报
回复
晕了 csdn高手们 帮帮我呗。。
baoxuetianxia 2010-05-13
  • 打赏
  • 举报
回复
晕了 csdn高手们 帮帮我呗。。
baoxuetianxia 2010-05-12
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 jingkunli 的回复:]
asp.net导出xls一般用直接的Response.Write方式输出就可以了,调用组件很占用资源!
[/Quote]
RESPONSE.WRITE这种方法导出的并不是真正的excel是个伪excel的html
我导出的excel要继续上传的(需求),所以 Response.Write 不行
jingkunli 2010-05-11
  • 打赏
  • 举报
回复
asp.net导出xls一般用直接的Response.Write方式输出就可以了,调用组件很占用资源!
baoxuetianxia 2010-05-11
  • 打赏
  • 举报
回复
如何解决呢、?csdn高人 帮我一下啊
请高人们仔细看看我的问题哦。
baoxuetianxia 2010-05-10
  • 打赏
  • 举报
回复


DataSet ds = PowerGisDB.GetDataSet(sql);
string filePath = Server.MapPath("~/Report_1/doc/" + Guid.NewGuid().ToString() + ".xls");
File.Copy(Server.MapPath("~/Report_1/tww.xls"), filePath);

// 使用OleDb驱动程序连接到副本
OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";Extended Properties=Excel 8.0;");
using (conn)
{
try
{
conn.Open();
// 增加记录
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
OleDbCommand cmd = new OleDbCommand("INSERT INTO [Sheet1$]([序号],[线路名称], [户名], [容量],[配变型式],[idKey],[年份],[月份],[实际电量]) VALUES(@t0,@t1,@t2, @t3,@t4,@t5,@t6,@t7,@t8)", conn);
cmd.Parameters.AddWithValue("@t0", i + 1);
cmd.Parameters.AddWithValue("@t1", ds.Tables[0].Rows[i]["线路名称"].ToString());
cmd.Parameters.AddWithValue("@t2", ds.Tables[0].Rows[i]["户名"].ToString());
cmd.Parameters.AddWithValue("@t3", ds.Tables[0].Rows[i]["容量"].ToString());
cmd.Parameters.AddWithValue("@t4", ds.Tables[0].Rows[i]["配变型式"].ToString());
cmd.Parameters.AddWithValue("@t5", ds.Tables[0].Rows[i]["idKey"].ToString());
cmd.Parameters.AddWithValue("@t6", ds.Tables[0].Rows[i]["年份"].ToString());
cmd.Parameters.AddWithValue("@t7", ds.Tables[0].Rows[i]["月份"].ToString());
cmd.Parameters.AddWithValue("@t8", ds.Tables[0].Rows[i]["实际电量"].ToString());
cmd.ExecuteNonQuery();
}
}
//运行到这里Guid.NewGuid().ToString().xls这个EXCEL文件就被
//WebDeV.Webserver.exe占用 有时候释放的早,有时候释放的晚,施放的晚的话,就会导致
//File.ReadAllBytes(Guid.NewGuid().ToString().xls)
//这个excel被进程还用着呢 当然会出错了哦)
//假如这时 把 占用 Guid.NewGuid().ToString().xls的进程给结束掉 然后再 readallbytes 就好了
//但是本人愚昧 希望高手帮忙啊

catch(System.Exception ex)
{
throw ex;
}
finally
{
conn.Close();
}

}

//this.KillProcess("EXCEL.EXE");
//输出副本的二进制字节流
Response.ContentType = "application/ms-excel";
Response.AppendHeader("Content-Disposition", "attachment;filename=superengine.xls");

/* tww add at 20100506
我认为之所以出现进程占用的的错误,是因为当excel
写入的内容较多时,操作系统(WINDOWS2000)关闭excel
进程时间要长一些,而.NET下载代码运行很快,
马上会要求读取excel 的文档,这时操作系统尚未处理完excel 的进程,
因此excel 文档处于收保护状态,因此造成.NET进程和excel 进程的冲突。
*/

this.killProcess();
System.Threading.Thread.Sleep(3000);//为了延缓


byte[] tww = File.ReadAllBytes(。。。));
Response.BinaryWrite(tww);
// 删除副本
try
{
File.Delete(filePath);
}
catch(System.IO.IOException ex)
{

}
finally
{
File.Delete(Server.MapPath("~/Report_1/doc/tww123.xls"));
}
Response.End();

gsq_0912 2010-05-10
  • 打赏
  • 举报
回复
这种东西,网上一找一大堆,希望LZ好好利用网络资源!!
baoxuetianxia 2010-05-10
  • 打赏
  • 举报
回复
Ls的方法 有时候时间很长哦。

先把占用这个excel的进程给强行结束掉,然后再读
File.ReadAllBytes(。。。);
有没有强行结束进程的办法啊
stepday 2010-05-10
  • 打赏
  • 举报
回复
这个问题是死循环问题,我遇到过
jshi123 2010-05-07
  • 打赏
  • 举报
回复
可以这样:
while (true)
try
{
byte[] tww = File.ReadAllBytes(。。。);
Response.BinaryWrite(tww);
break;
}
catch (IOException ex)
{
Thread.Sleep(0);
}
当然这样如果遇到真的IOException就死循环了,可以加个循环计数器,或者计算一下循环执行的时间,到达上限后跳出循环
baoxuetianxia 2010-05-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jshi123 的回复:]
如果确实是你说的FileShare的问题,那延迟应该是管用的,试下延迟时间再长点呢?

或者把ReadAllBytes放到循环里,catch到IOException就不断循环(可以sleep一小会),直到成功后跳出循环
[/Quote]
延迟还是有用的 但是也不能太长哦。太长了 人家客户以为卡了呢,
把ReadAllBytes放到循环里,catch到IOException就不断循环(可以sleep一小会),直到成功后跳出循环 这个具体点吧 哈哈 我菜鸟哈哈
jshi123 2010-05-07
  • 打赏
  • 举报
回复
如果确实是你说的FileShare的问题,那延迟应该是管用的,试下延迟时间再长点呢?

或者把ReadAllBytes放到循环里,catch到IOException就不断循环(可以sleep一小会),直到成功后跳出循环
vip__888 2010-05-07
  • 打赏
  • 举报
回复
你这也就一般的导出啊
conn.Open();
这句话好像是多余的

62,046

社区成员

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

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

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

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