前几天接到一个项目,里面让导出数据到word文档,因为是调查问卷,所以每个人的问卷导出为一份文档。
好几千人的问卷调查怎么可能一个人一份的导出,思索良久,有了一条思路。
1.先建好一个问卷调查模板;
2.从数据库里读出来后替换模板里的答案;
3.将替换好的导出到一个文件夹里;
4.在线压缩文件;
5.提供压缩文件下载,删除文件夹;
======================这是思路,窃喜==============================
模板呢是根据自己需求建立的,这里就不在赘述
下面是使用模板替换并保持到指定路径:
View Code
1 string path = dirPath + "\\"; 2 Encoding code = Encoding.GetEncoding("gb2312"); 3 // 读取模板文件 4 string temp = HttpContext.Current.Server.MapPath("MoBan1.htm"); 5 StreamReader sr = null; 6 StreamWriter sw = null; 7 string str = ""; 8 try 9 { 10 sr = new StreamReader(temp, code); 11 str = sr.ReadToEnd(); // 读取文件 12 } 13 catch (Exception exp) 14 { 15 HttpContext.Current.Response.Write(exp.Message); 16 HttpContext.Current.Response.End(); 17 sr.Close(); 18 } 19 Thread.Sleep(10); 20 string htmlfilename = ""; 21 22 htmlfilename = dt.Rows[i]["stuname"].ToString().Trim() + ".doc"; 23 24 25 // 替换内容 26 // 这时,模板文件已经读入到名称为str的变量中了 27 str = str.Replace("[xin]", dt.Rows[i]["stuname"].ToString());//姓名 28 str = str.Replace("[sex]", dt.Rows[i]["sex"].ToString());//性别 29 str = str.Replace("[zhu]", dt.Rows[i]["zhuanye"].ToString());//作者 30 str = str.Replace("[xu]", dt.Rows[i]["xueli"].ToString());//信息来源 31 str = str.Replace("[dia]", dt.Rows[i]["dianhua"].ToString());//时间 32 str = str.Replace("[em]", dt.Rows[i]["email"].ToString());//类别 33 str = str.Replace("[shi]", dt.Rows[i]["shixunxiangmu"].ToString());//地址 34 str = str.Replace("[jia]", dt.Rows[i]["jiaoshi"].ToString()); 35 str = str.Replace("[riqi]", dt.Rows[i]["riqi"].ToString()); 36 str = str.Replace("[daan1]",dt.Rows[i]["daan"].ToString()); 37 38 // 写文件 39 try 40 { 41 sw = new StreamWriter(path + htmlfilename, false, code); 42 sw.Write(str); 43 sw.Flush(); 44 } 45 catch (Exception ex) 46 { 47 HttpContext.Current.Response.Write(ex.Message); 48 HttpContext.Current.Response.End(); 49 } 50 finally 51 { 52 sw.Close(); 53 } 54 55 56 }
然后就是在线压缩了:
View Code
1 public bool ZipFileMain(string zippath, string zipfilename, string fileFilter) 2 { 3 try 4 { 5 Crc32 crc = new Crc32(); 6 ZipOutputStream s = new ZipOutputStream(File.Create(zipfilename)); 7 8 s.SetLevel(6); // 0 - store only to 9 - means best compression 9 10 DirectoryInfo di = new DirectoryInfo(zippath); 11 12 FileInfo[] a = di.GetFiles(fileFilter); 13 14 cutStr = zippath.Trim(); 15 //压缩这个目录下的所有文件 16 writeStream(ref s, a, crc); 17 //压缩这个目录下子目录及其文件 18 direct(di, ref s, crc); 19 20 s.Finish(); 21 s.Close(); 22 } 23 catch 24 { 25 return false; 26 } 27 return true; 28 }
写到这里基本工作都完成了,在遍历循环文件夹删除文件即可:
View Code
1 public static void DeleteFile(string dirRoot) 2 { 3 try 4 { 5 string[] rootDirs = Directory.GetDirectories(dirRoot); //当前目录的子目录: 6 string[] rootFiles = Directory.GetFiles(dirRoot); //当前目录下的文件: 7 8 foreach (string s2 in rootFiles) 9 { 10 File.Delete(s2); //删除文件 11 } 12 foreach (string s1 in rootDirs) 13 { 14 DeleteFile(s1); 15 } 16 } 17 catch (Exception ex) 18 { 19 Console.WriteLine(ex.Message.ToString()); 20 } 21 }
好了,大功告成!