您的位置:首页 > 其它

导出多个sheet的Excel以及在服务器上压缩文件然后再导出(在这里是压缩一个excel后导出)

2010-05-20 14:38 597 查看
//界面上的导出按钮事件

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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐