首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

导出查询结果,有有关问题的

2014-01-03 
导出查询结果,有问题的。本帖最后由 woyaodubo 于 2014-01-01 15:17:48 编辑我是根据下拉列表的查询条件来

导出查询结果,有问题的。
本帖最后由 woyaodubo 于 2014-01-01 15:17:48 编辑 我是根据下拉列表的查询条件来导出数据的,先把数据存放到Temp文件夹下,然后去读它。
Temp下面的表格得到的数据是我需要的,但是保存下来的表格确是一堆没有经过查询的数据(所有数据都出来了,还包括Gridview的header背景,实在惨不忍睹。)。

明明暂存文件夹Temp下已经把数据写入了Excel,怎么读取的结果会是另外一个呢?


        protected void Export_Click1(object sender, EventArgs e)
        {


            sql11 = "select * ....";

            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);
            string XSqlString;
            foreach (DataRow DR in DT.Rows)
            {
                XSqlString = "insert into [Sheet1$]";
                XSqlString += "([登录名],[成绩]) values(";
                XSqlString += "'" + DR["StudentName"] + "',";
                XSqlString += "'" + DR["PeaceScore"] + "')";
                OleDbCommand Cmd = new OleDbCommand(XSqlString, Conn);
                Cmd.ExecuteNonQuery();
            }
            
            //操作结束,关闭连接
            Conn.Close();
            //打开要下载的文件,并把该文件存放在FileStream中
            System.IO.FileStream Reader = System.IO.File.OpenRead(NewFileName);
            //文件传送的剩余字节数:初始值为文件的总大小
            long Length = Reader.Length;

            Response.Buffer = false;
            Response.AddHeader("Connection", "Keep-Alive");
            Response.ContentType = "application/octet-stream";
            Response.AddHeader("Content-Disposition", "attachment; filename=" + Server.UrlEncode("学生成绩.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();
            //删除该Excel文件
            //File.Delete(NewFileName);
        }


[解决办法]
首先,为什么要写 Response.AddHeader("Connection", "Keep-Alive") 呢? Keep-Alive 是想干什么?

其次,下载应该写 Response.End。
[解决办法]
http://www.cnblogs.com/top5/archive/2010/02/16/1668801.html给个参考

热点排行