导出多个sheet的Excel以及在服务器上压缩文件然后再导出(在这里是压缩一个excel后导出)
2010-05-20 14:38
597 查看
//界面上的导出按钮事件
//得到数据集
//Excel字符串---处理excel的字符串
protected void btnExcelAll_Click(object sender, EventArgs e) { Code.ExcelHelper.ExportExcel(Code.ExcelHelper.GenDataSet(Session["Query_FDBH"].ToString()),Response, "报表汇总"); }
public static void ExportExcel(DataSet ds, HttpResponse response,string fn) { //生成Excel字符串 string str = ExcelHelper.exportToExcel2003(ds, fn); //临时excel文件路径 string filename = System.Web.HttpContext.Current.Server.MapPath("~/xlsFiles/" + fn + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xls"); //临时rar文件名 string filenameRar = fn + DateTime.Now.ToString("yyyyMMddHHmmss") + ".rar"; //临时rar文件路径 string filepathRar = System.Web.HttpContext.Current.Server.MapPath("~/xlsFiles/" + filenameRar); //存盘 System.IO.StreamWriter sw = new System.IO.StreamWriter(filename, false); sw.Write(str); sw.Flush(); sw.Close(); sw = null; //压缩---方法一(需要下载添加引用SharpZipLib.dll并using ICSharpCode.SharpZipLib.Zip) //using (ZipFile zip = ZipFile.Create(filepathRar)) //{ // zip.BeginUpdate(); // zip.Add(filename); // zip.CommitUpdate(); //} //ExcelHelper.DownloadFileByPath(response, filenameRar, filepathRar); //方法二:不需要额外添加引用 bool zipFlag = false; System.Diagnostics.Process Process1 = new System.Diagnostics.Process(); Process1.StartInfo.FileName = @"C:/Program Files/WinRAR/WinRAR.exe"; Process1.StartInfo.CreateNoWindow = true; Process1.StartInfo.Arguments = " a -ep " + filepathRar + " " + filename; //a-ep 文件直接包含于压缩包下而不是压缩包里面的子目录下面 //Process1.StartInfo.Arguments = " a -ep -hpXXXXXX secret " + filepathRar + " " + filename; //加密 Process1.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;//隐藏压缩时显示百分比 Process1.Start(); Process1.WaitForExit(); if (Process1.HasExited) { // iExitCode为0说明压缩成功,其他都有error int iExitCode = Process1.ExitCode; if (iExitCode == 0) { //正常完成 zipFlag = true; } else { //有错 zipFlag = false; } } Process1.Close(); if (zipFlag) { System.IO.File.Delete(filename);//压缩完成后删除服务器上的.xls文件 //导出 ExcelHelper.DownloadFileByPath(response, filenameRar, filepathRar); } else { //如果压缩失败,导出.xls文件 ExcelHelper.DownloadFileByPath(response, filenameRar.Substring(0, filenameRar.Length - 3) + "xls", filename); } }
//得到数据集
public static DataSet GenDataSet(string sfdbh) { DataSet ds = new DataSet(); DataTable dt; string[] strsql ={ sql1, sql2, sql3, ....}; string[] strsheetname ={ "KPI指标", "单品指标", ...... }; for (int i = 0; i < n; i++)//n表示excel的sheet的个数 { dt = SqlHelper.ExecuteDataset(DAL.Configuration.ConnectionString, CommandType.Text, strsql[i].ToString ()).Tables[0].Copy(); ds.Tables.Add(dt); ds.Tables[i].TableName = strtablename[i].ToString(); } return ds; }
//Excel字符串---处理excel的字符串
public static string exportToExcel2003(DataSet source, string fileName) { System.Text.StringBuilder sb = new System.Text.StringBuilder(""); const string startExcelXML = "<xml version>/r/n<Workbook " + "xmlns=/"urn:schemas-microsoft-com:office:spreadsheet/"/r/n" + " xmlns:o=/"urn:schemas-microsoft-com:office:office/"/r/n " + "xmlns:x=/"urn:schemas- microsoft-com:office:" + "excel/"/r/n xmlns:ss=/"urn:schemas-microsoft-com:" + "office:spreadsheet/">/r/n <Styles>/r/n " + "<Style ss:ID=/"Default/" ss:Name=/"Normal/">/r/n " + "<Alignment ss:Vertical=/"Center/"/>/r/n <Borders/>" + "/r/n <Font ss:Size=/"12/"/>/r/n <Interior/>/r/n <NumberFormat/>" + "/r/n <Protection/>/r/n </Style>/r/n " + "<Style ss:ID=/"BoldColumn/">/r/n <Font " + "x:Family=/"Swiss/" ss:Bold=/"1/" ss:Size=/"12/"/>/r/n </Style>/r/n " + "<Style ss:ID=/"StringLiteral/">/r/n <NumberFormat" + " ss:Format=/"@/"/>/r/n </Style>/r/n <Style " + "ss:ID=/"Decimal/">/r/n <NumberFormat " + "ss:Format=/"0.00/"/>/r/n </Style>/r/n " + "<Style ss:ID=/"Integer/">/r/n <NumberFormat " + "ss:Format=/"0/"/>/r/n </Style>/r/n <Style " + "ss:ID=/"DateLiteral/">/r/n <NumberFormat " + "ss:Format=/"Short Date/"/>/r/n </Style>/r/n <Style " + "ss:ID=/"Linker/">/r/n <Font x:Family='Swiss' ss:Size=/"12/" ss:Color='#0000FF' ss:Underline='Single'/>/r/n <NumberFormat />/r/n </Style>" + "</Styles>/r/n "; const string endExcelXML = "</Workbook>"; int rowCount = 0; int sheetCount = 0; sb.Append(startExcelXML); for (int i = 0; i < source.Tables.Count; i++) { sheetCount = 0; sb.Append("<Worksheet ss:Name=/"" + source.Tables[i].TableName + "/">"); sb.Append("<Table>"); sb.Append("<Row>"); for (int x = 0; x < source.Tables[i].Columns.Count; x++) { sb.Append("<Cell ss:StyleID=/"BoldColumn/"><Data ss:Type=/"String/">"); if (source.Tables[i].Columns[x].ColumnName.Length > 5 && source.Tables[i].Columns[x].ColumnName.Substring(0, 5).Equals("HREF:")) { sb.Append(source.Tables[i].Columns[x].ColumnName.Split(":".ToCharArray())[1]); } else { sb.Append(source.Tables[i].Columns[x].ColumnName); } sb.Append("</Data></Cell>"); } sb.Append("</Row>"); foreach (DataRow x in source.Tables[i].Rows) { rowCount++; //if the number of rows is > 64000 create a new page to continue output if (rowCount == 64000) { rowCount = 0; sheetCount++; sb.Append("</Table>"); sb.Append(" </Worksheet>"); sb.Append("<Worksheet ss:Name=/"" + source.Tables[i].TableName + sheetCount.ToString() + "/">"); sb.Append("<Table>"); } sb.Append("<Row>"); //ID=" + rowCount + " for (int y = 0; y < source.Tables[i].Columns.Count; y++) { System.Type rowType; rowType = x[y].GetType(); switch (rowType.ToString()) { case "System.String": string XMLstring = x[y].ToString(); if (XMLstring.IndexOf("^") > 0) { String[] s = XMLstring.Split("^".ToCharArray()); for (int m = 0; m < s.Length; m++) { s[m] = s[m].Trim().Replace("&", "&").Replace(">", ">").Replace("<", "<"); //sb.Append("<Cell ss:StyleID=/"StringLiteral/""); sb.Append("<Cell"); if (source.Tables[i].Columns[y].ColumnName.Length > 4 && source.Tables[i].Columns[y].ColumnName.Substring(0, 5).Equals("HREF:")) { sb.Append(" ss:StyleID=/"Linker/" ss:HRef=/"#"); sb.Append(s[m]); sb.Append("!A1/""); } sb.Append("><Data ss:Type=/"String/">"); sb.Append(s[m]); sb.Append("</Data></Cell>"); } } else { XMLstring = XMLstring.Trim(); XMLstring = XMLstring.Replace("&", "&"); XMLstring = XMLstring.Replace(">", ">"); XMLstring = XMLstring.Replace("<", "<"); //sb.Append("<Cell ss:StyleID=/"StringLiteral/""); sb.Append("<Cell"); if (source.Tables[i].Columns[y].ColumnName.Length > 4 && source.Tables[i].Columns[y].ColumnName.Substring(0, 5).Equals("HREF:")) { sb.Append(" ss:StyleID=/"Linker/" ss:HRef=/"#"); sb.Append(XMLstring); sb.Append("!A1/""); } sb.Append("><Data ss:Type=/"String/">"); sb.Append(XMLstring); sb.Append("</Data></Cell>"); } break; case "System.DateTime": //Excel has a specific Date Format of YYYY-MM-DD followed by //the letter 'T' then hh:mm:sss.lll Example 2005-01-31T24:01:21.000 //The Following Code puts the date stored in XMLDate //to the format above DateTime XMLDate = (DateTime)x[y]; string XMLDatetoString = ""; //Excel Converted Date //XMLDatetoString = XMLDate.Year.ToString() + // "-" + // (XMLDate.Month < 10 ? "0" + // XMLDate.Month.ToString() : XMLDate.Month.ToString()) + // "-" + // (XMLDate.Day < 10 ? "0" + // XMLDate.Day.ToString() : XMLDate.Day.ToString()) + // "T" + // (XMLDate.Hour < 10 ? "0" + // XMLDate.Hour.ToString() : XMLDate.Hour.ToString()) + // ":" + // (XMLDate.Minute < 10 ? "0" + // XMLDate.Minute.ToString() : XMLDate.Minute.ToString()) + // ":" + // (XMLDate.Second < 10 ? "0" + // XMLDate.Second.ToString() : XMLDate.Second.ToString()) + // ".000"; //sb.Append("<Cell ss:StyleID=/"DateLiteral/"><Data ss:Type=/"DateTime/">"); XMLDatetoString = XMLDate.ToString("yyyy-MM-dd HH:mm:ss"); sb.Append("<Cell ss:StyleID=/"DateLiteral/"><Data ss:Type=/"String/">"); sb.Append(XMLDatetoString); sb.Append("</Data></Cell>"); break; case "System.Boolean": //sb.Append("<Cell ss:StyleID=/"StringLiteral/"><Data ss:Type=/"String/">"); sb.Append("<Cell><Data ss:Type=/"String/">"); sb.Append(x[y].ToString()); sb.Append("</Data></Cell>"); break; case "System.Int16": case "System.Int32": case "System.Int64": case "System.Byte": sb.Append("<Cell ss:StyleID=/"Integer/"><Data ss:Type=/"Number/">"); sb.Append(x[y].ToString()); sb.Append("</Data></Cell>"); break; case "System.Decimal": case "System.Double": sb.Append("<Cell ss:StyleID=/"Decimal/"><Data ss:Type=/"Number/">"); sb.Append(x[y].ToString()); sb.Append("</Data></Cell>"); break; case "System.DBNull": //sb.Append("<Cell ss:StyleID=/"StringLiteral/"><Data ss:Type=/"String/">"); sb.Append("<Cell><Data ss:Type=/"String/">"); sb.Append(""); sb.Append("</Data></Cell>"); break; default: throw (new Exception(rowType.ToString() + " not handled.")); } } sb.Append("</Row>"); } sb.Append("</Table>"); sb.Append(" </Worksheet>"); } sb.Append(endExcelXML); return sb.ToString(); }
相关文章推荐
- ASP.NET将数据导出到一个EXCEL文件的多个SHEET中
- 分多个excel放在服务器,然后把多个excel文件变成一个zip,然后返回前台。
- 把数据量大导出 放入多个excel 然后压缩成zip文件,导出
- jeesite框架导出zip压缩包(包含一个excel文件和一张缩略图以及多个附件)
- asp.net mvc导出excel文件先保存到服务器某个目录,然后再导出到客户端供客户下载功能的实现
- 怎么实现NPOI导出excel保存到服务器上,然后返回文件地址下载?
- 用node.js写一个简单爬虫,并将数据导出为 excel 文件
- java中使用PrintWriter在服务器本地生成一个文件,然后往这个文件中插入内容
- C#导出分Sheet的Excel文件
- 读取一个EXCEL的文件,然后将其转化成HTML的表格
- 导出Excel文件到iframe子页面中下载时的一个怪异问题
- sql大容量数据导出到Excel(单文件多sheet方法,适合数据不超过20万)
- 在Mac版IDEA中选中一个文件然后在文件路径中打开以及IDEA中设置快捷键
- 导出数据到一个Excel文件中去
- 关于导出excel 把一个dataset的多个datatable导入到一个excel的多个sheet中
- POI导出多个Excel文件,生成压缩文件
- BIRT报表导出Excel文件怎样添加sheet?
- C#利用NPOI在同一个Excel文件中创建多个sheet
- Java程序员从笨鸟到菜鸟之(一百零五)java操作office和pdf文件(三)利用jxl实现数据导出excel报表以及与POI的区别
- C# 如何将 不同的数据(多个查询结果集 dataset)导出到一个excel的不同sheet中