热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

用FileStream,是没办法下载指定文件的,不管你怎么写,都是浪费力气,最后下载的是整个html页面,包括背景,按钮,查询框,图片,虽然还是xsl格式。而且关闭文档,会弹出是否保存当前修改,如果保
用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");
        }

17 个解决方案

#1


然后呢???

#2


生成真正的xls,需要加载office组件
输出html,改文件名的确是最简单的方法了

#3


引用 2 楼 ltcszk 的回复:
生成真正的xls,需要加载office组件
输出html,改文件名的确是最简单的方法了


貌似不需要这样的,服务器上放一个模板xls,直接拷贝过去用来写入数据,
主要是下载文件,FileStream根本就不行,不知道为什么还这么多人在网上疯传这种方法。
把数据写入xls,一直都可以。既然已经得到了需要的文件,干嘛不直接Response.Redirect过去下载,
非要用神马Stream来乱搞。

#4


引用 1 楼 huanggreat 的回复:
然后呢???

#5


引用 3 楼 woyaodubo 的回复:
Quote: 引用 2 楼 ltcszk 的回复:

生成真正的xls,需要加载office组件
输出html,改文件名的确是最简单的方法了


貌似不需要这样的,服务器上放一个模板xls,直接拷贝过去用来写入数据,
主要是下载文件,FileStream根本就不行,不知道为什么还这么多人在网上疯传这种方法。
把数据写入xls,一直都可以。既然已经得到了需要的文件,干嘛不直接Response.Redirect过去下载,
非要用神马Stream来乱搞。


你的写法本身就是错误的,怎么可能会正确呢?


....这里省略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("文件不存在!"));
                    }

#6


Response.TransmitFile

#7


如果是从数据库导出数据到excel文件来下载,上面那些操作完全是多余的。
查询数据 -> 创建workbook -> 写入OutputStream,对于没有office的服务器可以用npoi

#8


引用 3 楼 woyaodubo 的回复:
既然已经得到了需要的文件,干嘛不直接Response.Redirect过去下载。


用Response.Redirect有两个问题,一是文件必须是公开的,任何人都可以下载。另一个是有些浏览器会把下载的xls直接打开,而不是弹出保存对话框。

#9


5楼的可以实现楼主的要求啊

#10


你这就好像是“打鱼怂了,就骂人家渔网不好。然后你现在开始搞个钢叉在那里乱叉”。

狗熊掰棒子式地只知道指责别人的方法不如你随便换方法,谁知道你能不能沉下心来先搞懂一个方法?

#11


嚯嚯,笑而不语。坐着看回复

#12




楼主小白呀,还怪别人,看你把Response.BinaryWrite(FileObj);
代码写到 Click事件里,你很聪明

#13


引用 8 楼 KarasCanvas 的回复:
Quote: 引用 3 楼 woyaodubo 的回复:

既然已经得到了需要的文件,干嘛不直接Response.Redirect过去下载。


用Response.Redirect有两个问题,一是文件必须是公开的,任何人都可以下载。另一个是有些浏览器会把下载的xls直接打开,而不是弹出保存对话框。


静态文件也能做身份验证的,直接打开是因为文件头

#14


引用 13 楼 ltcszk 的回复:
静态文件也能做身份验证的,直接打开是因为文件头


确实能,但是要联合应用程序的权限管理就很罗嗦,直接打开是因为浏览器会根据响应头里的ContentType执行特定的操作,而且这个操作是由用户自定义的。

#15


引用 12 楼 wyd1520 的回复:


楼主小白呀,还怪别人,看你把Response.BinaryWrite(FileObj);
代码写到 Click事件里,你很聪明

#16


引用 5 楼 liuchaolin 的回复:
Quote: 引用 3 楼 woyaodubo 的回复:

Quote: 引用 2 楼 ltcszk 的回复:

生成真正的xls,需要加载office组件
输出html,改文件名的确是最简单的方法了


貌似不需要这样的,服务器上放一个模板xls,直接拷贝过去用来写入数据,
主要是下载文件,FileStream根本就不行,不知道为什么还这么多人在网上疯传这种方法。
把数据写入xls,一直都可以。既然已经得到了需要的文件,干嘛不直接Response.Redirect过去下载,
非要用神马Stream来乱搞。


你的写法本身就是错误的,怎么可能会正确呢?


....这里省略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("文件不存在!"));
                    }




原来芥样,还没试,等一会试试。

#17


引用 10 楼 sp1234 的回复:
你这就好像是“打鱼怂了,就骂人家渔网不好。然后你现在开始搞个钢叉在那里乱叉”。

狗熊掰棒子式地只知道指责别人的方法不如你随便换方法,谁知道你能不能沉下心来先搞懂一个方法?


小钢叉有时还挺好用滴,反正用的人看不到代码,能导出来就很不错鸟。

推荐阅读
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • dotnet 通过 Elmish.WPF 使用 F# 编写 WPF 应用
    本文来安利大家一个有趣而且强大的库,通过F#和C#混合编程编写WPF应用,可以在WPF中使用到F#强大的数据处理能力在GitHub上完全开源Elmis ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文详细介绍了如何解决Uploadify插件在Internet Explorer(IE)9和10版本中遇到的点击失效及JQuery运行时错误问题。通过修改相关JavaScript代码,确保上传功能在不同浏览器环境中的一致性和稳定性。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • IneedtofocusTextCellsonebyoneviaabuttonclick.ItriedlistView.ScrollTo.我需要通过点击按钮逐个关注Tex ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文介绍了在Windows环境下使用pydoc工具的方法,并详细解释了如何通过命令行和浏览器查看Python内置函数的文档。此外,还提供了关于raw_input和open函数的具体用法和功能说明。 ... [详细]
  • Scala 实现 UTF-8 编码属性文件读取与克隆
    本文介绍如何使用 Scala 以 UTF-8 编码方式读取属性文件,并实现属性文件的克隆功能。通过这种方式,可以确保配置文件在多线程环境下的一致性和高效性。 ... [详细]
  • 本文详细探讨了JDBC(Java数据库连接)的内部机制,重点分析其作为服务提供者接口(SPI)框架的应用。通过类图和代码示例,展示了JDBC如何注册驱动程序、建立数据库连接以及执行SQL查询的过程。 ... [详细]
author-avatar
a_2502881181
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有