您的位置:首页 > 其它

利用MIME导出多sheet的excel(包含图片)

2008-03-28 14:47 387 查看
该方法适用以下情况:几个子页面作为自定义控件,放在一个主页面上。导出按钮在主页面上。

子页面的获取HTML代码的方法:

/// <summary>
/// 获得页面的HTML
/// </summary>
/// <returns></returns>
public string GetHtml()
{
string strResult = "";
System.IO.StringWriter sw = new System.IO.StringWriter();
System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter(sw);
this.EnableViewState = false;
this.dgr1.AllowPaging = false;
this.dgr1.DataSource = br.SelectProjectRiskHistory(ProjectNO,BeginDate,EndDate,FilterString);
this.dgr1.DataBind();

dgr1.RenderControl(hw);
strResult = sw.ToString().Replace("<a href=# ", "<p ");//替换不必要的HTML代码,美化EXCEL的格式

return strResult;
}

如果有图片则用以下方法导出HTML代码:

#region 导出Excel
private string[] ReplaceString =
{
"src=/"Common/Img/WarningLight/red.gif/"",
"src=/"Common/Img/WarningLight/yellow.gif/"",
"src=/"Common/Img/WarningLight/green.gif/"",
"src=/"Common/Img/WarningLight/orange.gif/""
};

private string[] NewString =
{
"src=/"file:///c:/red.png/"",
"src=/"file:///c:/yellow.png/"",
"src=/"file:///c:/green.png/"",
"src=/"file:///c:/orange.png/""
};

/// <summary>
/// 获得页面的HTML
/// </summary>
/// <returns></returns>
public string GetHtml()
{
string strResult = "";
//1.获取页面HTML代码
System.IO.StringWriter sw = new System.IO.StringWriter();
System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter(sw);
this.EnableViewState = false;

string strImgPath = Server.MapPath (this.txtPath.Text).Replace ("Common//Img//WarningLight","");
this.txtPath.Text = "";

for(int i=0 ; i<this.Controls.Count ; i++)
{
System.Web.UI.Control ctrl = this.Controls[i] as System.Web.UI.Control;
Helper.RecursiveClear(ctrl);
}

this.RenderControl(hw);
strResult = sw.ToString().Replace("<a href='#'", "<p ");
//2.获取图片的二进制流,并转换为Base64编码字符窜
//红灯路径
string path_Red = strImgPath + SysConsts.PMP_WARNINGLIGHT_COLOR_PATH + SysConsts.PMP_WARNINGLIGHT_COLOR_RED;
//黄灯
string path_Yellow = strImgPath + SysConsts.PMP_WARNINGLIGHT_COLOR_PATH + SysConsts.PMP_WARNINGLIGHT_COLOR_YELLOW;
//绿灯
string path_Green = strImgPath + SysConsts.PMP_WARNINGLIGHT_COLOR_PATH + SysConsts.PMP_WARNINGLIGHT_COLOR_GREEN;
//橙灯
string path_Orange = strImgPath + SysConsts.PMP_WARNINGLIGHT_COLOR_PATH + SysConsts.PMP_WARNINGLIGHT_COLOR_ORANGE;

string[] strImgsName = {"red","yellow","green","orange"};
string[] strImgsPath = {path_Red,path_Yellow,path_Green,path_Orange};

string strImgs = Helper.CreateExcelImg(strImgsName,strImgsPath);

//3.整合数据流
for(int j=0 ; j<ReplaceString.Length ; j++)
{
string strOld = ReplaceString[j];
string strNew = NewString[j];
strResult = strResult.Replace(strOld,strNew);
}

strResult = strResult.Replace("red.gif","")
.Replace("yellow.gif","")
.Replace("green.gif","")
.Replace("orange.gif","");

strResult = strResult+strImgs;
return strResult;
}
#endregion

/// <summary>
/// Get Image's Code In Base64 Code Format.
/// </summary>
/// <param name="path"></param>
/// <param name="strCode"></param>
/// <returns></returns>
private static string GetImageCodeInBase64(string path)
{
string strImgCodeInBase64 = "";
FileStream file;
byte[] base64buffer; //开辟缓冲区
// 打开图片文件,利用该图片构造一个文件流
file = new FileStream(path,FileMode.Open);

base64buffer = new byte[(int)file.Length];
BinaryReader br = new BinaryReader(file,Encoding.UTF8);
br.Read(base64buffer,0,(int)file.Length);

strImgCodeInBase64 = Convert.ToBase64String(base64buffer);
return strImgCodeInBase64;
}

/// <summary>
/// if Excel contain image,use this function to create the imgage's dataflow in Base64 code Format.
/// Mark:strImgsName and strImgsPath must be fit.
/// </summary>
/// <param name="strImgsName"></param>
/// <param name="strImgContent"></param>
/// <returns></returns>
public static string CreateExcelImg(string[] strImgsName,string[] strImgsPath)
{
StringBuilder sb = new StringBuilder();
string strImgCode = "";
for(int i=0 ; i<strImgsName.Length ; i++)
{
string strImgName = strImgsName[i];
string path = strImgsPath[i];
strImgCode = GetImageCodeInBase64(path);

sb.Append("/r/n--").Append(SysConsts.Boundary).Append("/r/n")
.Append("Content-Type: image/png/r/n")
.Append("Content-Transfer-Encoding: base64/r/n")
.Append("Content-Location: file:///c:/").Append(strImgName).Append(".png/r/n")
.Append("/r/n")
.Append(strImgCode)
.Append("/r/n");
}

return sb.ToString();
}

主页面中的按钮方法:

private void clkbtnOutpuExcel_Click(object sender, System.EventArgs e)
{
string strold1 = "border="+"/""+"0"+"/"";
string strold2 = "<TABLE";
string strold3 = "<table";
string strnew = "<TABLE border=1 bordercolor =Black";
DateTime dtBegin = Convert.ToDateTime(BeginDate);
DateTime dtEnd = Convert.ToDateTime(this.EndDate);
int week = (dtBegin.DayOfYear + (int)(new DateTime(dtBegin.Year,1,1).DayOfWeek))/7;

Manage_Step1 Manage1 = this.FindControl("Manage_Step1_1") as Manage_Step1;//自定义控件
Manage_Step2 Manage2 = this.FindControl("Manage_Step2_1") as Manage_Step2;
Manage_Step3 Manage3 = this.FindControl("Manage_Step3_1") as Manage_Step3;
Manage_Step4 Manage4 = this.FindControl("Manage_Step4_1") as Manage_Step4;
Manage_Step5 Manage5 = this.FindControl("Manage_Step5_1") as Manage_Step5;
// Manage_Step6 Manage6 = this.FindControl("Manage_Step6_1");

if(!this.Mangage_Panel_All_Hidden.Visible)
{
string strHtml1 = Manage1.GetHtml().Replace (strold1,"").Replace (strold2,strnew);
string strHtml2 = Manage2.GetHtml().Replace (strold1,"").Replace (strold3,strnew);
string strHtml3 = Manage3.GetHtml();
string strHtml4 = Manage4.GetHtml();
string strHtml5 = Manage5.GetHtml();

string[] strSheetsName = {"BaseInfo","ProjScheduel","ThisWeekRisk","ThisWeekProblem","ProjSurvail"};
string[] strHtmls = {strHtml1,strHtml3,strHtml4,strHtml5,strHtml2};

Helper.ExportToExcelInMIME(this.Response,"项目管理周报"+"("+this.ProjectNO+","+dtBegin.Year.ToString() +"第"+week.ToString ()+"周)",strHtmls,strSheetsName);
}
else
{
Helper.ShowMessage(this.Page,"6602");
}
}

public static string CreateExcelHead(string[] strSheetsName)
{
StringBuilder sb = new StringBuilder();
sb.Append("MIME-Version: ");
sb.Append(SysConsts.MIMEVersion);
sb.Append("/r/nX-Document-Type: ");
sb.Append(SysConsts.DocumentType);
sb.Append("/r/nContent-Type: ");
sb.Append(SysConsts.ContentType);
sb.Append("; boundary=/"");
sb.Append(SysConsts.Boundary);
sb.Append("/"/r/n");
sb.Append("/r/n");
sb.Append("------BOUNDARY_9527----/r/n");
sb.Append("Content-Location: file:///C:/0E8D990C/MimeExcel.xml/r/n");
sb.Append("Content-Transfer-Encoding: quoted-printable/r/n");
sb.Append("Content-Type: text/html; charset=/"us-ascii/"/r/n");
sb.Append("/r/n");
sb.Append("/r/n<html xmlns:o=3D/"urn:schemas-microsoft-com:office:office/"/r/n");
sb.Append("xmlns:x=3D/"urn:schemas-microsoft-com:office:excel/"/r/n");
sb.Append("xmlns=3D/"http://www.w3.org/TR/REC-html40/">/r/n");
sb.Append("<head>/r/n");
sb.Append("<xml>/r/n");
sb.Append("<x:ExcelWorkbook>/r/n");
sb.Append(" <x:ExcelWorksheets>/r/n");

for(int i=0 ; i<strSheetsName.Length ; i++)
{
sb.Append(" <x:ExcelWorksheet>/r/n");
sb.Append(" <x:Name>").Append(strSheetsName[i].ToString()).Append("</x:Name>/r/n");
sb.Append(" <x:WorksheetSource HRef=3D/"cid:sheet").Append(i.ToString()).Append("/"/>/r/n");
sb.Append(" </x:ExcelWorksheet>/r/n");
}

sb.Append(" </x:ExcelWorksheets>/r/n");
sb.Append("</x:ExcelWorkbook>/r/n");
sb.Append("</xml>/r/n");
sb.Append("</head>/r/n");
sb.Append("</html>/r/n");

return sb.ToString();
}

public static string CreateExcelBoundary(string strHtml,string strSheetName)
{
StringBuilder sb = new StringBuilder();
sb.Append("/r/n--").Append(SysConsts.Boundary).Append("/r/n");
sb.Append("Content-ID: sheet").Append(strSheetName).Append("/r/n");
sb.Append("Content-Transfer-Encoding: utf-8/r/n");
sb.Append("Content-Type: text/html; charset=/"utf-8/"/r/n");
sb.Append("/r/n");
sb.Append("<html xmlns:o=3D/"urn:schemas-microsoft-com:office:office/"/r/n");
sb.Append("xmlns:x=3D/"urn:schemas-microsoft-com:office:excel/"/r/n");
sb.Append("xmlns=3D/"http://www.w3.org/TR/REC-html40/">/r/n");
sb.Append("<head>/r/n");
sb.Append("<xml>/r/n");
sb.Append(" <x:WorksheetOptions>/r/n");
sb.Append(" <x:ProtectContents>False</x:ProtectContents>/r/n");
sb.Append(" <x:ProtectObjects>False</x:ProtectObjects>/r/n");
sb.Append(" <x:ProtectScenarios>False</x:ProtectScenarios>/r/n");
sb.Append(" </x:WorksheetOptions>/r/n");
sb.Append("</xml>/r/n");
sb.Append("</head>/r/n");
sb.Append("<body>/r/n");
sb.Append ("<meta http-equiv=Content-Type content=text/html;charset=utf-8>");
sb.Append(strHtml);
sb.Append("/r/n</body>/r/n");
sb.Append("</html>/r/n");
// sb.Append("------BOUNDARY_9527------/r/n");

return sb.ToString();
}

public static string CreateExcel(string[] strHtmls,string[] strSheetsName)
{
string strResult = "";
strResult = CreateExcelHead(strSheetsName);
for(int i=0 ; i<strSheetsName.Length ; i++)
{
strResult += CreateExcelBoundary(strHtmls[i],i.ToString());
}
strResult += "--"+ SysConsts.Boundary +"--";

return strResult;
}

public static void ExportToExcelInMIME(HttpResponse rs,string fileName,string[] strHtmls,string[] strSheetsName)
{
rs.ContentType = "application/vnd.ms-excel";
rs.Charset = "utf-8";
rs.ContentEncoding = System.Text.Encoding.UTF8 ;
string name = HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8);
rs.AppendHeader("Content-Disposition", "inline;filename=" + name + ".xls");
string strResult = CreateExcel(strHtmls,strSheetsName);
rs.Write(strResult.ToString().Replace("<a href=# ", "<p "));
rs.End();
}

该方法导出效果好,速度快,可以在2007上运行,无乱码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: