批量导出多个xml问题

   之前做的一个项目,页面有到处功能,到处的文件类型为xml文件。但是每个页面都有导出功能,若想到处某一个月份的数据,就必须一个页面一个页面的去选择日期,然后一个一个的导出,这月比较麻烦,对使用者来说也不友好。于是就提出了批量导出的需求。

 public void WriteToXml(DataTable dt, string FileName, string dtBg, string dtEd)
        {

            Response.Clear();
            Response.Charset = "UTF-8";
            Response.Buffer = true;
            Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
            Response.AppendHeader("Content-Disposition", "attachment;filename=\"" + System.Web.HttpUtility.UrlEncode(FileName, System.Text.Encoding.UTF8) + ".xml\"");
            System.Text.UTF8Encoding utf8 = new System.Text.UTF8Encoding();
            XmlTextWriter writer =
             new XmlTextWriter(Response.OutputStream, utf8);
            writer.Formatting = Formatting.Indented;
            writer.Indentation = 4;
            //XML文档创建开始
            writer.WriteStartDocument();
            //writer.WriteComment("authcode: " + dt.TableName);
            writer.WriteStartElement("sam"); //authcode开始
            writer.WriteAttributeString("timeStart", dtBg);
            writer.WriteAttributeString("timeStop", dtEd);
            writer.WriteAttributeString("totalnum", dt.Rows.Count.ToString());

            for (int i = 0; i < dt.Rows.Count; i++)
            {
                writer.WriteStartElement("S_Id", ""); //A_Id开始
                writer.WriteAttributeString("id", dt.Rows[i][0].ToString());
                writer.WriteElementString("S_Status", dt.Rows[i][1].ToString());
                writer.WriteElementString("S_Oper", dt.Rows[i][2].ToString());
                writer.WriteElementString("S_OpTime", Convert.ToDateTime(dt.Rows[i][3]).ToString("yyyy-MM-dd HH:mm:ss"));
                writer.WriteElementString("S_Remarks", dt.Rows[i][4].ToString());
                writer.WriteEndElement(); //A_Id结束
            }
            writer.WriteEndElement(); //authcode结束
            writer.WriteEndDocument();
            writer.Flush();
            writer.Close();
            Response.End();

            //XML文档创建结束
        }

  这是我到处一次xml文件的代码,原本以为将原来的一次导出执行个几次就可以实现批量导出了。结果发现导出里用到了response,执行完end()之后,页面就会停止了,也就是说之后的代码不会执行。

于是我就开始在网上寻找解决方法,找到了用打包压缩包的方式进行批量导出,将几个xml文件到处放到服务器上,然后进行打包后再下载。

首先,这是导出代码。

我把生成的路径设置成服务器路径 Server.MapPath,把生成的xml文件放到服务器上。如果有多个,就写多个导出方法(xml文件对格式有要求只能分成多个方法)

public void WriteToXml(DataTable dt, string FileName, string dtBg, string dtEd)
        {
            //Response.Clear();
            //Response.Charset = "UTF-8";
            //Response.Buffer = true;
            //Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
            //Response.AppendHeader("Content-Disposition", "attachment;filename=\"" + System.Web.HttpUtility.UrlEncode(FileName, System.Text.Encoding.UTF8) + ".xml\"");
            string path = Server.MapPath(FileName + ".xml");
            System.Text.UTF8Encoding utf8 = new System.Text.UTF8Encoding();
            XmlTextWriter writer =
             new XmlTextWriter(path, utf8);
            writer.Formatting = Formatting.Indented;
            writer.Indentation = 4;
            //XML文档创建开始
            writer.WriteStartDocument();
            //writer.WriteComment("authcode: " + dt.TableName);
            writer.WriteStartElement("authcode"); //authcode开始
            writer.WriteAttributeString("timeStart", dtBg);
            writer.WriteAttributeString("timeStop", dtEd);
            writer.WriteAttributeString("totalnum", dt.Rows.Count.ToString());

            for (int i = 0; i < dt.Rows.Count; i++)
            {
                writer.WriteStartElement("A_Id", ""); //A_Id开始
                writer.WriteAttributeString("id", dt.Rows[i][0].ToString());
                writer.WriteElementString("A_Status", dt.Rows[i][1].ToString());
                writer.WriteElementString("A_Oper", dt.Rows[i][2].ToString());
                writer.WriteElementString("A_OpTime", Convert.ToDateTime(dt.Rows[i][3]).ToString("yyyy-MM-dd HH:mm:ss"));
                writer.WriteElementString("A_Remarks", dt.Rows[i][4].ToString());
                writer.WriteEndElement(); //A_Id结束
            }
            writer.WriteEndElement(); //authcode结束              
            writer.WriteEndDocument();//结束             
            writer.Flush();
            writer.Close();
            // Response.End();
            //XML文档创建结束
        }
然后  就是打包啦。

 /// <summary>  
        ///  批量进行多个文件压缩到一个文件  
        /// </summary>  
        /// <param name="files">文件列表(绝对路径)</param> 这里用的数组,你可以用list 等或者  
        /// <param name="zipFileName">生成的zip文件名称</param>  
        private void ZipFileDownload(string[] files, string zipFileName)
        {
            MemoryStream ms = new MemoryStream();
            byte[] buffer = null;

            using (ZipFile file = ZipFile.Create(ms))
            {
                file.BeginUpdate();

                file.NameTransform = new MyNameTransfom();
                foreach (var item in files)
                {
                    if (File.Exists(Server.MapPath(item)))
                        file.Add(Server.MapPath(item));

                }
                file.CommitUpdate();
                buffer = new byte[ms.Length];
                ms.Position = 0;
                ms.Read(buffer, 0, buffer.Length);   //读取文件内容(1次读ms.Length/1024M)  
                ms.Flush();
                ms.Close();
            }
            Response.Clear();
            Response.Buffer = true;
            Response.ContentType = "application/x-zip-compressed";
            Response.AddHeader("content-disposition", "attachment;filename=" + HttpUtility.UrlEncode(zipFileName));
            Response.BinaryWrite(buffer);
            Response.Flush();
            foreach (var item in files)
            {
                if (item != null)
                    File.Delete(Server.MapPath(item));
            }
            Response.End();
        }  
通过遍历数组中的文件,判断是否存在,然后进行添加打包。最后删掉服务器上的文件



给个参考链接 http://blog.csdn.net/kongwei521/article/details/51167903

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值