都是些小白菜,昨天问了一个用FileStream导出数据到Excel的,全都说错了。

woyaodubo 2014-01-02 11:20:31
用FileStream,是没办法下载指定文件的,不管你怎么写,都是浪费力气,最后下载的是整个html页面,包括背景,按钮,查询框,图片,虽然还是xsl格式。而且关闭文档,会弹出是否保存当前修改,如果保存,就会多了一个文件夹,用来装excel里面的其他网页文件,就跟另存为网页是一个样的。

下面这个代码,指定了下载文件,但是下到的是网页:

        protected void Button1_Click(object sender, EventArgs e)
{
//打开要下载的文件,并把该文件存放在FileStream中
System.IO.FileStream Reader = System.IO.File.OpenRead(Server.MapPath("~/PeaceScore_End.xls"));
//文件传送的剩余字节数:初始值为文件的总大小
long Length = Reader.Length;

Response.Buffer = false;
//Response.AddHeader("Connection", "Keep-Alive");
Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", "attachment; filename=" + "PeaceScore_End.xls");
Response.AddHeader("Content-Length", Length.ToString());

byte[] Buffer = new Byte[10000]; //存放欲发送数据的缓冲区
int ByteToRead; //每次实际读取的字节数

while (Length > 0)
{
//剩余字节数不为零,继续传送
if (Response.IsClientConnected)
{
//客户端浏览器还打开着,继续传送
ByteToRead = Reader.Read(Buffer, 0, 10000); //往缓冲区读入数据
Response.OutputStream.Write(Buffer, 0, ByteToRead); //把缓冲区的数据写入客户端浏览器
Response.Flush(); //立即写入客户端
Length -= ByteToRead; //剩余字节数减少
}
else
{
//客户端浏览器已经断开,阻止继续循环
Length = -1;
}
}

Reader.Close();
Response.End();
}






如果要把查询结果写入文件,再下载这个文件,这样不就可以了吗,干嘛用神马FileStream,而且这种方法还是在一本教材上附带的源码,真搞不懂这些人,有简单的方法不用,非要用奇门异术,在错误的道路上越走越远。下面这个就很好的解决了所有问题,根据查询直接下载需要数据,自定义字段,而不是一堆垃圾。

有更好办法的弄来分享一下?

protected void Export_Click1(object sender, EventArgs e)
{
string college = null;
string profession = null;
string subject = null;
string class1 = null;
string semester = null;
if (this.DropDownList_college.SelectedValue != "所有")
{
college += "and College='" + this.DropDownList_college.SelectedValue + "'";
}
else
{
college = null;
}

if (this.DropDownList_profession.SelectedValue != "所有")
{
profession += "and Profession='" + this.DropDownList_profession.SelectedValue + "'";
}
else
{
profession = null;
}

if (this.DropDownList_subject.SelectedValue != "所有")
{
subject += "and Subject='" + this.DropDownList_subject.SelectedValue + "'";
}
else
{
subject = null;
}

if (this.DropDownList_class.SelectedValue != "所有")
{
class1 += "and Class='" + this.DropDownList_class.SelectedValue + "'";
}
else
{
class1 = null;
}
if (this.DropDownList_semester.SelectedValue != "所有")
{
semester += "and Semester='" + this.DropDownList_semester.SelectedValue + "'";
}
else
{
semester = null;
}

sql11 = string.Format("select * from Score where 1=1 {0} {1} {2} {3} {4} order by College,Profession,Class,Subject,Semester", college, profession, subject, class1, semester);

SqlConnection mycon = da.sqlcon;
SqlDataAdapter sqlcmd = new SqlDataAdapter(sql11, mycon);
DataSet ds = new DataSet(); //将查询结果放到DataSet数据集中
sqlcmd.Fill(ds, "Photo"); //这个Photo是ds名称,并不是数据表名,可以随便填,但为了方便,一般都用数据表名。
DataTable DT = ds.Tables[0];
//生成将要存放结果的Excel文件的名称
string NewFileName = DateTime.Now.ToString("yyyyMMddHHmmss") + ".xls";
//转换为物理路径
NewFileName = Server.MapPath("../Temp/" + NewFileName);
//根据模板正式生成该Excel文件
File.Copy(Server.MapPath("../PeaceScore_End.xls"), NewFileName, true);
//建立指向该Excel文件的数据库连接
string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + NewFileName + ";Extended Properties='Excel 8.0;'";
OleDbConnection Conn = new OleDbConnection(strConn);
//打开连接,为操作该文件做准备
Conn.Open();
OleDbCommand Cmd = new OleDbCommand("", Conn);

foreach (DataRow DR in DT.Rows)
{
string XSqlString = "insert into [Sheet1$]";
XSqlString += "([登录名],[成绩]) values(";
XSqlString += "'" + DR["StudentName"] + "',";
XSqlString += "'" + DR["Score"] + "')";
Cmd.CommandText = XSqlString;
Cmd.ExecuteNonQuery();
}
Conn.Close();
Response.Redirect("../PeaceScore_End.xls");
}
...全文
699 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
种草德鲁伊 2014-01-03
  • 打赏
  • 举报
回复
引用 13 楼 ltcszk 的回复:
静态文件也能做身份验证的,直接打开是因为文件头
确实能,但是要联合应用程序的权限管理就很罗嗦,直接打开是因为浏览器会根据响应头里的ContentType执行特定的操作,而且这个操作是由用户自定义的。
ltcszk 2014-01-03
  • 打赏
  • 举报
回复
引用 8 楼 KarasCanvas 的回复:
[quote=引用 3 楼 woyaodubo 的回复:] 既然已经得到了需要的文件,干嘛不直接Response.Redirect过去下载。
用Response.Redirect有两个问题,一是文件必须是公开的,任何人都可以下载。另一个是有些浏览器会把下载的xls直接打开,而不是弹出保存对话框。[/quote] 静态文件也能做身份验证的,直接打开是因为文件头
woyaodubo 2014-01-03
  • 打赏
  • 举报
回复
引用 10 楼 sp1234 的回复:
你这就好像是“打鱼怂了,就骂人家渔网不好。然后你现在开始搞个钢叉在那里乱叉”。 狗熊掰棒子式地只知道指责别人的方法不如你随便换方法,谁知道你能不能沉下心来先搞懂一个方法?
小钢叉有时还挺好用滴,反正用的人看不到代码,能导出来就很不错鸟。
woyaodubo 2014-01-03
  • 打赏
  • 举报
回复
引用 5 楼 liuchaolin 的回复:
[quote=引用 3 楼 woyaodubo 的回复:] [quote=引用 2 楼 ltcszk 的回复:] 生成真正的xls,需要加载office组件 输出html,改文件名的确是最简单的方法了
貌似不需要这样的,服务器上放一个模板xls,直接拷贝过去用来写入数据, 主要是下载文件,FileStream根本就不行,不知道为什么还这么多人在网上疯传这种方法。 把数据写入xls,一直都可以。既然已经得到了需要的文件,干嘛不直接Response.Redirect过去下载, 非要用神马Stream来乱搞。[/quote] 你的写法本身就是错误的,怎么可能会正确呢?

....这里省略N行
                    if (File.Exists(Server.MapPath(infor.FileUrl)))
                    {
                        try
                        {
                            using (FileStream fso = new FileStream(Server.MapPath(infor.FileUrl), FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                            {
                                string filename = infor.FileUrl.Substring(infor.FileUrl.LastIndexOf('.'));
                                int len = Convert.ToInt32(fso.Length);
                                byte[] FileObj = new byte[len];
                                fso.Read(FileObj, 0, len);
                                Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}", HttpUtility.UrlEncode(infor.title + filename), System.Text.Encoding.UTF8));
                                Response.AddHeader("Content-Length", len.ToString());
                                Response.ContentType = "application/octet-stream";
                                Response.Charset = "UTF-8";
                                Response.ContentEncoding = System.Text.Encoding.UTF8;
                                Response.BinaryWrite(FileObj);
                                fso.Close();
                            }
                        }
                        catch
                        {
                            throw (new Exception("文件不存在!"));
                        }
                    }
                    else
                    {
                        throw (new Exception("文件不存在!"));
                    }
[/quote] 原来芥样,还没试,等一会试试。
woyaodubo 2014-01-03
  • 打赏
  • 举报
回复
引用 12 楼 wyd1520 的回复:
楼主小白呀,还怪别人,看你把Response.BinaryWrite(FileObj); 代码写到 Click事件里,你很聪明
ltcszk 2014-01-02
  • 打赏
  • 举报
回复
生成真正的xls,需要加载office组件 输出html,改文件名的确是最简单的方法了
  • 打赏
  • 举报
回复
然后呢???
本拉灯 2014-01-02
  • 打赏
  • 举报
回复
楼主小白呀,还怪别人,看你把Response.BinaryWrite(FileObj); 代码写到 Click事件里,你很聪明
wanghui0380 2014-01-02
  • 打赏
  • 举报
回复
嚯嚯,笑而不语。坐着看回复
  • 打赏
  • 举报
回复
你这就好像是“打鱼怂了,就骂人家渔网不好。然后你现在开始搞个钢叉在那里乱叉”。 狗熊掰棒子式地只知道指责别人的方法不如你随便换方法,谁知道你能不能沉下心来先搞懂一个方法?
goodbaby6508 2014-01-02
  • 打赏
  • 举报
回复
5楼的可以实现楼主的要求啊
种草德鲁伊 2014-01-02
  • 打赏
  • 举报
回复
引用 3 楼 woyaodubo 的回复:
既然已经得到了需要的文件,干嘛不直接Response.Redirect过去下载。
用Response.Redirect有两个问题,一是文件必须是公开的,任何人都可以下载。另一个是有些浏览器会把下载的xls直接打开,而不是弹出保存对话框。
种草德鲁伊 2014-01-02
  • 打赏
  • 举报
回复
如果是从数据库导出数据到excel文件来下载,上面那些操作完全是多余的。 查询数据 -> 创建workbook -> 写入OutputStream,对于没有office的服务器可以用npoi
种草德鲁伊 2014-01-02
  • 打赏
  • 举报
回复
Response.TransmitFile
md5e 2014-01-02
  • 打赏
  • 举报
回复
引用 3 楼 woyaodubo 的回复:
[quote=引用 2 楼 ltcszk 的回复:] 生成真正的xls,需要加载office组件 输出html,改文件名的确是最简单的方法了
貌似不需要这样的,服务器上放一个模板xls,直接拷贝过去用来写入数据, 主要是下载文件,FileStream根本就不行,不知道为什么还这么多人在网上疯传这种方法。 把数据写入xls,一直都可以。既然已经得到了需要的文件,干嘛不直接Response.Redirect过去下载, 非要用神马Stream来乱搞。[/quote] 你的写法本身就是错误的,怎么可能会正确呢?

....这里省略N行
                    if (File.Exists(Server.MapPath(infor.FileUrl)))
                    {
                        try
                        {
                            using (FileStream fso = new FileStream(Server.MapPath(infor.FileUrl), FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                            {
                                string filename = infor.FileUrl.Substring(infor.FileUrl.LastIndexOf('.'));
                                int len = Convert.ToInt32(fso.Length);
                                byte[] FileObj = new byte[len];
                                fso.Read(FileObj, 0, len);
                                Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}", HttpUtility.UrlEncode(infor.title + filename), System.Text.Encoding.UTF8));
                                Response.AddHeader("Content-Length", len.ToString());
                                Response.ContentType = "application/octet-stream";
                                Response.Charset = "UTF-8";
                                Response.ContentEncoding = System.Text.Encoding.UTF8;
                                Response.BinaryWrite(FileObj);
                                fso.Close();
                            }
                        }
                        catch
                        {
                            throw (new Exception("文件不存在!"));
                        }
                    }
                    else
                    {
                        throw (new Exception("文件不存在!"));
                    }
woyaodubo 2014-01-02
  • 打赏
  • 举报
回复
引用 1 楼 huanggreat 的回复:
然后呢???
woyaodubo 2014-01-02
  • 打赏
  • 举报
回复
引用 2 楼 ltcszk 的回复:
生成真正的xls,需要加载office组件 输出html,改文件名的确是最简单的方法了
貌似不需要这样的,服务器上放一个模板xls,直接拷贝过去用来写入数据, 主要是下载文件,FileStream根本就不行,不知道为什么还这么多人在网上疯传这种方法。 把数据写入xls,一直都可以。既然已经得到了需要的文件,干嘛不直接Response.Redirect过去下载, 非要用神马Stream来乱搞。
内容概要:本文围绕四开关Buck-Boost变换器的建模分析与闭环仿真性能展开研究,重点探讨其在Simulink环境下的稳压控制特性与系统动态响应。通过建立精确的状态空间平均法数学模型,设计基于PI调节器的闭环控制系统,并结合仿真手段验证了变换器在不同输入电压和负载条件下的输出电压稳定性与抗扰动能力。研究涵盖主电路拓扑结构、工作模态分析、小信号建模、控制器参数整定及Simulink仿真平台搭建等关键技术环节,实现了对升降压过程的平滑切换与高性能电压调节。同时,文中强调科研过程中应注重逻辑思维与创新意识的培养,倡导借助成熟仿真工具提升研究效率与系统设计水平。; 适合人群:具备电力电子技术基础、熟悉Simulink仿真环境,从事新能源变换系统、电源设计等相关方向的研究生或工程技术人员。; 使用场景及目标:①掌握四开关Buck-Boost变换器的工作原理与状态空间建模方法;②学习基于Simulink的闭环控制器设计与动态性能仿真验证流程;③为电力电子变换器的稳定性分析、控制器优化及工程化实现提供理论支持与实践参考。; 阅读建议:建议读者结合文中的仿真模型逐步操作,重点关注电路工作模态推导与控制器设计部分,深入理解系统稳定性判据与参数 tuning 方法,同时关注科研方法论的引导,提升系统性思维与仿真实践能力。
内容概要:本文详细介绍了基于自适应虚拟阻抗的光储并网系统谐波抑制策略的Simulink仿真实现方法,旨在通过构建高精度的仿真模型解决光伏发电与储能系统在并网过程中引发的谐波污染题。文中深入剖析了自适应虚拟阻抗技术的核心原理,重点阐述其在动态调节阻抗参数以应对电网阻抗波动、有效抑制并网电流谐波、提升电能质量和系统稳定性方面的关键技术优势。该策略能够根据实时运行工况自适应调整控制参数,显著增强系统对复杂电网环境的适应能力。资源配套完整的Matlab/Simulink仿真模型与可运行代码,支持用户完美复现仿真结果,并为进一步的算法优化、控制器设计及学术研究提供坚实的技术基础。; 适合人群:具备电力电子、新能源并网、自动控制理论等相关专业知识背景的科研人员,包括从事相关课题研究的研究生、高校教师及电力系统领域的工程技术人员;熟悉Matlab/Simulink仿真平台并希望深入理解先进并网控制策略的研发人员; 使用场景及目标:①用于光储混合系统的电能质量分析与谐波治理关键技术研究;②支撑高水平学术论文的复现、科研项目申报及实际工程中并网逆变器控制器的设计与性能验证;③作为高校研究生课程或科研培训的教学案例,帮助学生深入理解虚拟阻抗控制机理、自适应算法设计及其在提升并网系统动态响应特性中的应用; 阅读建议:建议读者结合提供的仿真模型进行分模块调试与整体运行,重点关注控制器参数的整定过程、系统在不同电网条件下的频率响应特性和谐波抑制效果,同时建议参考相关领域的权威文献,以深化对自适应控制策略的理解,实现从仿真复现到技术创新的跨越。

62,271

社区成员

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

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

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

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