之前做的一个项目,页面有到处功能,到处的文件类型为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