asp.net生成Excel並導出下載五種實現方


方法一 通過GridView(簡評:方法比較簡單,但是只適合生成格式簡單的Excel,且無法保留VBA代碼),頁面無刷新
aspx.cs部分

代碼如下:
using System; using System.Collections; using System.Configuration; using System.Data; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Text;
public partial class DataPage_NationDataShow : System.Web.UI.Page { private Data_Link link = new Data_Link(); private string sql;
protected void Page_Load(object sender, EventArgs e) { Ajax.Utility.RegisterTypeForAjax(typeof(DataPage_NationDataShow)); }
protected void btnExcel_Click(object sender, EventArgs e) { string strExcelName = "MyExcel"; strExcelName = strExcelName.Replace(@"/", "");
Data_Link link = new Data_Link(); string strSQL = this.hidParam.Value; DataSet ds = new DataSet(); ds = link.D_DataSet_Return(strSQL);//獲得想要放入Excel的數據
gvExcel.Visible = true; gvExcel.DataSource = null; gvExcel.DataMember = ds.Tables[0].TableName; gvExcel.DataSource = ds.Tables[0]; gvExcel.DataBind();
ExportToExcel(this.Page, gvExcel, strExcelName); }
protected void gvExcel_RowDataBound(object sender, GridViewRowEventArgs e) { } public override void VerifyRenderingInServerForm(Control control) { }
/// <summary> /// 工具方法,Excel出力(解決亂碼問題) /// </summary> /// <param name="page">調用頁面</param> /// <param name="excel">Excel數據</param> /// <param name="fileName">文件名</param> public void ExportToExcel(System.Web.UI.Page page, GridView excel, string fileName) { try { foreach (GridViewRow row in excel.Rows) { for (int i = 0; i < row.Cells.Count; i++) { excel.HeaderRow.Cells[i].BackColor = System.Drawing.Color.Yellow; } } excel.Font.Size = 10; excel.AlternatingRowStyle.BackColor = System.Drawing.Color.LightCyan; excel.RowStyle.Height = 25;
page.Response.AppendHeader("Content-Disposition", "attachment;filename=" + fileName); page.Response.Charset = "utf-8"; page.Response.ContentType = "application/vnd.ms-excel"; page.Response.Write("<meta http-equiv=Content-Type content=text/html;charset=utf-8>"); excel.Page.EnableViewState = false; excel.Visible = true; excel.HeaderStyle.Reset(); excel.AlternatingRowStyle.Reset();
System.IO.StringWriter oStringWriter = new System.IO.StringWriter(); System.Web.UI.HtmlTextWriter oHtmlTextWriter = new System.Web.UI.HtmlTextWriter(oStringWriter); excel.RenderControl(oHtmlTextWriter); page.Response.Write(oStringWriter.ToString()); page.Response.End();
excel.DataSource = null; excel.Visible = false; } catch (Exception e) {
} } }

aspx部分

 代碼如下:
<head runat="server"> <script type="text/javascript"> //Excel DownLoad function excelExport(){ var hidText = document.getElementById("hidParam"); hidText.value = "some params"; document.getElementById("ExcelOutput").click(); } </script> </head> <body onload="pageInit()"> <form id="form1" runat="server"> <input type="button" value="EXCEL下載" style="width:100px;" onclick="excelExport()" id="excelBut" /> <input id="hidParam" type="text" runat="server" style="display:none;"/> <asp:Button runat="server" ID="ExcelOutput" style="display:none" Text= "EXCEL出力" Width="0px" onclick="btnExcel_Click" UseSubmitBehavior="false"/> <asp:GridView ID="gvExcel" runat="server" Height="95px" OnRowDataBound="gvExcel_RowDataBound" Visible="False"></asp:GridView> </form> </body>

在剛才的aspx.cs代碼中

代碼如下:
foreach (GridViewRow row in excel.Rows) { for (int i = 0; i < row.Cells.Count; i++) { excel.HeaderRow.Cells[i].BackColor = System.Drawing.Color.Yellow; } }

這部分是給表頭添加樣式。

 

有時候為了便於瀏覽,需要給交叉行添加樣式,簡單點的可以用下面這種:

代碼如下:
excel.AlternatingRowStyle.BackColor = System.Drawing.Color.LightCyan;

但是細看一下會發現它把一整行的樣式都改變了,包括后面那些沒有用到的列。

 

解決辦法是有,不過比較繁瑣,就是修改每個單元格的樣式。

代碼如下:
int rowCount = excel.Rows.Count; int colCount = excel.HeaderRow.Cells.Count;
for (int i = 0; i < rowCount; i++) { for(int j=0;j<colCount; j++) { excel.Rows[i].Cells[j].BackColor = System.Drawing.Color.LightCyan; } }

方法二 通過DataGrid(與方法一基本相同),頁面無刷新

 

aspx.cs部分

代碼如下:
public override void VerifyRenderingInServerForm(Control control) {}
/// <summary> /// エクセル出力イベント /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void ExcelBut_Click(object sender, System.EventArgs e) { DataGrid dgExcel = new DataGrid();
try { DataSet ds = getExcelData(this.PageParams.Value);//出力データを取得する
if(ds.Tables[0].Rows.Count>0) { //エクセルへデータを投入する string execlName= "MyExcel"; Encoding encodingType=System.Text.Encoding.UTF8; dgExcel.DataMember=ds.Tables[0].TableName; dgExcel.DataSource=ds.Tables[0];
Response.Buffer = true; Response.Charset = "utf-8"; Response.AppendHeader("Content-Disposition", "attachment;filename=" + execlName+ ".xls"); Response.ContentEncoding = encodingType; Response.ContentType = "application/ms-excel"; StringWriter oStringWriter = new StringWriter(); HtmlTextWriter oHtmlTextWriter = new HtmlTextWriter(oStringWriter); dgExcel.DataBind(); dgExcel.Visible = true; dgExcel.RenderControl(oHtmlTextWriter); Response.Write(oStringWriter.ToString()); Response.Flush(); Response.Close(); dgExcel.DataSource = null; dgExcel.Visible = false; } else { Response.Write("<script>alert('xxxxxx')</script>"); } } catch(Exception ex) { Response.Write("<script>alert('oooooo')</script>"); } }

aspx部分

代碼如下:
<head runat="server"> <script type="text/javascript"> //Excel DownLoad function excelExport(){ var hidText = document.getElementById("hidParam"); hidText.value = "some params"; document.getElementById("ExcelOutput").click(); } </script> </head> <body onload="pageInit()"> <form id="form1" runat="server"> <input type="button" value="EXCEL下載" style="width:100px;" onclick="excelExport()" id="excelBut" NAME="excelBut"/> <input id="hidParam" type="text" runat="server" style="display:none;" NAME="hidParam"/> <asp:Button runat="server" ID="ExcelOutput" style="display:none" Text= "EXCEL出力" Width="0px" onclick="btnExcel_Click" UseSubmitBehavior="false"/> <asp:datagrid id="gvExcel" Visible="False" Runat="server" style="Z-INDEX: 107; POSITION: absolute; TOP: 72px; LEFT: 520px" Width="80px" Height="40px"></asp:datagrid> </form> </body>

方法三 以XML形式的Excel方式(可以設置豐富的樣式,並可以有多個sheet,但需要模版。速度很快,但生成的文件較大,且無法保留VBA代碼)

 

具體方法:把模版以 XML Document形式另存為A.xml。然后參照A.xml中的內容即可

代碼如下:
  private void ExcelBut_Click(object sender, System.EventArgs e) { DataSet ds = new DataSet(); string ExcelFileName = ""; DataRow dr=[------列名信息-------]; try { ExcelFileName = Path.Combine(Request.PhysicalApplicationPath + "/ExcelFile", "MyExcel.xls");
//獲取Excel需要的數據 ds = [------獲得數據-------]; if (ds.Tables.Count == 0) { Response.Write("<script type='text/javascript'>alert('無數據');</script>"); return; } int sheetNum = ds.Tables.Count / 2; StreamWriter writer = new StreamWriter(ExcelFileName, false);
//Styles標簽前面的信息相當於'頭信息',不需要改變 writer.WriteLine("<?xml version=\"1.0\"?>"); writer.WriteLine("<?mso-application progid=\"Excel.Sheet\"?>"); writer.WriteLine("<Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\""); writer.WriteLine("xmlns:o=\"urn:schemas-microsoft-com:office:office\""); writer.WriteLine("xmlns:x=\"urn:schemas-microsoft-com:office:excel\""); writer.WriteLine("xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\""); writer.WriteLine("xmlns:html=\"http://www.w3.org/TR/REC-html40\">"); writer.WriteLine("<DocumentProperties xmlns=\"urn:schemas-microsoft-com:office:office\">"); writer.WriteLine("<LastAuthor>Automated Report Generator Example</LastAuthor>"); writer.WriteLine(string.Format("<Created>{0}T{1}Z</Created>", DateTime.Now.ToString("yyyy-mm-dd"), DateTime.Now.ToString("HH:MM:SS"))); writer.WriteLine(" <Company>51aspx.com</Company>"); writer.WriteLine(" <Version>11.6408</Version>"); writer.WriteLine("</DocumentProperties>"); writer.WriteLine("<ExcelWorkbook xmlns=\"urn:schemas-microsoft-com:office:excel\">"); writer.WriteLine("<WindowHeight>6195</WindowHeight>"); writer.WriteLine(" <WindowWidth>18495</WindowWidth>"); writer.WriteLine(" <WindowTopX>525</WindowTopX>"); writer.WriteLine(" <WindowTopY>4260</WindowTopY>"); writer.WriteLine(" <AcceptLabelsInFormulas/>"); writer.WriteLine(" <ProtectStructure>True</ProtectStructure>"); writer.WriteLine(" <ProtectWindows>False</ProtectWindows>"); writer.WriteLine("</ExcelWorkbook>");
//通過 ss:ID 和 ss:Name相當於html中style的類 writer.WriteLine(" <Styles> "); writer.WriteLine(" <Style ss:ID='Default' ss:Name='Normal'> "); writer.WriteLine(" <Alignment ss:Vertical='Bottom'/> "); writer.WriteLine(" <Borders/> "); writer.WriteLine(" <Font ss:FontName='MS Pゴシック' x:CharSet='128' x:Family='Modern' ss:Size='11'/> "); writer.WriteLine(" <Interior/> "); writer.WriteLine(" <NumberFormat/> "); writer.WriteLine(" <Protection/> "); writer.WriteLine(" </Style> "); writer.WriteLine(" <Style ss:ID='s23'> "); writer.WriteLine(" <Font ss:FontName='MS Pゴシック' x:CharSet='128' x:Family='Modern' ss:Size='11' "); writer.WriteLine(" ss:Color='#FF0000'/> "); writer.WriteLine(" </Style> "); writer.WriteLine(" <Style ss:ID='s24'> "); writer.WriteLine(" <Interior/> "); writer.WriteLine(" </Style> "); writer.WriteLine(" <Style ss:ID='s25'> "); writer.WriteLine(" <Font ss:FontName='MS Pゴシック' x:CharSet='128' x:Family='Modern' ss:Size='11'/> "); writer.WriteLine(" <Interior/> "); writer.WriteLine(" </Style> "); writer.WriteLine(" <Style ss:ID='s26'> "); writer.WriteLine(" <Font ss:FontName='MS Pゴシック' x:CharSet='128' x:Family='Modern' ss:Size='11' "); writer.WriteLine(" ss:Color='#FF0000'/> "); writer.WriteLine(" <Interior/> "); writer.WriteLine(" </Style> "); writer.WriteLine(" <Style ss:ID='s27'> "); writer.WriteLine(" <Borders> "); writer.WriteLine(" <Border ss:Position='Bottom' ss:LineStyle='Continuous' ss:Weight='1'/> "); writer.WriteLine(" <Border ss:Position='Left' ss:LineStyle='Continuous' ss:Weight='1'/> "); writer.WriteLine(" <Border ss:Position='Right' ss:LineStyle='Continuous' ss:Weight='1'/> "); writer.WriteLine(" <Border ss:Position='Top' ss:LineStyle='Continuous' ss:Weight='1'/> "); writer.WriteLine(" </Borders> "); writer.WriteLine(" <Font ss:FontName='MS Pゴシック' x:CharSet='128' x:Family='Modern' ss:Size='11'/> "); writer.WriteLine(" <Interior ss:Color='#CCFFFF' ss:Pattern='Solid'/> "); writer.WriteLine(" <Protection/> "); writer.WriteLine(" </Style> "); writer.WriteLine(" <Style ss:ID='s28'> "); writer.WriteLine(" <Borders> "); writer.WriteLine(" <Border ss:Position='Bottom' ss:LineStyle='Continuous' ss:Weight='1'/> "); writer.WriteLine(" <Border ss:Position='Left' ss:LineStyle='Continuous' ss:Weight='1'/> "); writer.WriteLine(" <Border ss:Position='Right' ss:LineStyle='Continuous' ss:Weight='1'/> "); writer.WriteLine(" <Border ss:Position='Top' ss:LineStyle='Continuous' ss:Weight='1'/> "); writer.WriteLine(" </Borders> "); writer.WriteLine(" <Font ss:FontName='MS Pゴシック' x:CharSet='128' x:Family='Modern' ss:Size='11'/> "); writer.WriteLine(" <Interior ss:Color='#CCFFFF' ss:Pattern='Solid'/> "); writer.WriteLine(" </Style> "); writer.WriteLine(" <Style ss:ID='s29'> "); writer.WriteLine(" <Borders> "); writer.WriteLine(" <Border ss:Position='Bottom' ss:LineStyle='Continuous' ss:Weight='1'/> "); writer.WriteLine(" <Border ss:Position='Left' ss:LineStyle='Continuous' ss:Weight='1'/> "); writer.WriteLine(" <Border ss:Position='Top' ss:LineStyle='Continuous' ss:Weight='1'/> "); writer.WriteLine(" </Borders> "); writer.WriteLine(" <Font ss:FontName='MS Pゴシック' x:CharSet='128' x:Family='Modern' ss:Size='11'/> "); writer.WriteLine(" <Interior ss:Color='#CCFFFF' ss:Pattern='Solid'/> "); writer.WriteLine(" </Style> "); writer.WriteLine(" <Style ss:ID='s30'> "); writer.WriteLine(" <Borders> "); writer.WriteLine(" <Border ss:Position='Bottom' ss:LineStyle='Continuous' ss:Weight='1'/> "); writer.WriteLine(" <Border ss:Position='Top' ss:LineStyle='Continuous' ss:Weight='1'/> "); writer.WriteLine(" </Borders> "); writer.WriteLine(" <Font ss:FontName='MS Pゴシック' x:CharSet='128' x:Family='Modern' ss:Size='11'/> "); writer.WriteLine(" <Interior ss:Color='#CCFFFF' ss:Pattern='Solid'/> "); writer.WriteLine(" </Style> "); writer.WriteLine(" <Style ss:ID='s31'> "); writer.WriteLine(" <Borders> "); writer.WriteLine(" <Border ss:Position='Bottom' ss:LineStyle='Continuous' ss:Weight='1'/> "); writer.WriteLine(" <Border ss:Position='Right' ss:LineStyle='Continuous' ss:Weight='1'/> "); writer.WriteLine(" <Border ss:Position='Top' ss:LineStyle='Continuous' ss:Weight='1'/> "); writer.WriteLine(" </Borders> "); writer.WriteLine(" <Font ss:FontName='MS Pゴシック' x:CharSet='128' x:Family='Modern' ss:Size='11'/> "); writer.WriteLine(" <Interior ss:Color='#CCFFFF' ss:Pattern='Solid'/> "); writer.WriteLine(" </Style> "); writer.WriteLine(" <Style ss:ID='s32'> "); writer.WriteLine(" <Alignment ss:Vertical='Bottom' ss:WrapText='1'/> "); writer.WriteLine(" <Borders> "); writer.WriteLine(" <Border ss:Position='Bottom' ss:LineStyle='Continuous' ss:Weight='1'/> "); writer.WriteLine(" <Border ss:Position='Left' ss:LineStyle='Continuous' ss:Weight='1'/> "); writer.WriteLine(" <Border ss:Position='Right' ss:LineStyle='Continuous' ss:Weight='1'/> "); writer.WriteLine(" <Border ss:Position='Top' ss:LineStyle='Continuous' ss:Weight='1'/> "); writer.WriteLine(" </Borders> "); writer.WriteLine(" <Font ss:FontName='MS Pゴシック' x:CharSet='128' x:Family='Modern' ss:Size='11'/> "); writer.WriteLine(" <Interior ss:Color='#CCFFFF' ss:Pattern='Solid'/> "); writer.WriteLine(" </Style> "); writer.WriteLine(" <Style ss:ID='s33'> "); writer.WriteLine(" <Alignment ss:Vertical='Bottom' ss:WrapText='1'/> "); writer.WriteLine(" </Style> "); writer.WriteLine(" <Style ss:ID='s34'> "); writer.WriteLine(" <Alignment ss:Vertical='Bottom' ss:WrapText='1'/> "); writer.WriteLine(" <Borders> "); writer.WriteLine(" <Border ss:Position='Bottom' ss:LineStyle='Continuous' ss:Weight='1'/> "); writer.WriteLine(" <Border ss:Position='Left' ss:LineStyle='Continuous' ss:Weight='1'/> "); writer.WriteLine(" <Border ss:Position='Right' ss:LineStyle='Continuous' ss:Weight='1'/> "); writer.WriteLine(" <Border ss:Position='Top' ss:LineStyle='Continuous' ss:Weight='1'/> "); writer.WriteLine(" </Borders> "); writer.WriteLine(" <Font ss:FontName='MS Pゴシック' x:CharSet='128' x:Family='Modern' ss:Size='11'/> "); writer.WriteLine(" <Interior/> "); writer.WriteLine(" </Style> "); writer.WriteLine(" <Style ss:ID='s35'> "); writer.WriteLine(" <Borders> "); writer.WriteLine(" <Border ss:Position='Bottom' ss:LineStyle='Continuous' ss:Weight='1'/> "); writer.WriteLine(" <Border ss:Position='Left' ss:LineStyle='Continuous' ss:Weight='1'/> "); writer.WriteLine(" <Border ss:Position='Right' ss:LineStyle='Continuous' ss:Weight='1'/> "); writer.WriteLine(" <Border ss:Position='Top' ss:LineStyle='Continuous' ss:Weight='1'/> "); writer.WriteLine(" </Borders> "); writer.WriteLine(" <Font ss:FontName='MS Pゴシック' x:CharSet='128' x:Family='Modern' ss:Size='11'/> "); writer.WriteLine(" <Interior/> "); writer.WriteLine(" </Style> "); writer.WriteLine(" <Style ss:ID='s36'> "); writer.WriteLine(" <Borders> "); writer.WriteLine(" <Border ss:Position='Bottom' ss:LineStyle='Continuous' ss:Weight='1'/> "); writer.WriteLine(" <Border ss:Position='Left' ss:LineStyle='Continuous' ss:Weight='1'/> "); writer.WriteLine(" <Border ss:Position='Right' ss:LineStyle='Continuous' ss:Weight='1'/> "); writer.WriteLine(" <Border ss:Position='Top' ss:LineStyle='Continuous' ss:Weight='1'/> "); writer.WriteLine(" </Borders> "); writer.WriteLine(" <Font ss:FontName='MS Pゴシック' x:CharSet='128' x:Family='Modern' ss:Size='11'/> "); writer.WriteLine(" <Interior ss:Color='#FFFF99' ss:Pattern='Solid'/> "); writer.WriteLine(" <Protection ss:Protected='0'/> "); writer.WriteLine(" </Style> "); writer.WriteLine(" <Style ss:ID='s37'> "); writer.WriteLine(" <Borders> "); writer.WriteLine(" <Border ss:Position='Bottom' ss:LineStyle='Continuous' ss:Weight='1'/> "); writer.WriteLine(" <Border ss:Position='Left' ss:LineStyle='Continuous' ss:Weight='1'/> "); writer.WriteLine(" <Border ss:Position='Right' ss:LineStyle='Continuous' ss:Weight='1'/> "); writer.WriteLine(" <Border ss:Position='Top' ss:LineStyle='Continuous' ss:Weight='1'/> "); writer.WriteLine(" </Borders> "); writer.WriteLine(" <Font ss:FontName='MS Pゴシック' x:CharSet='128' x:Family='Modern' ss:Size='11'/> "); writer.WriteLine(" <Interior/> "); writer.WriteLine(" </Style> "); writer.WriteLine(" <Style ss:ID='s38'> "); writer.WriteLine(" <Borders> "); writer.WriteLine(" <Border ss:Position='Bottom' ss:LineStyle='Continuous' ss:Weight='1'/> "); writer.WriteLine(" <Border ss:Position='Left' ss:LineStyle='Continuous' ss:Weight='1'/> "); writer.WriteLine(" <Border ss:Position='Right' ss:LineStyle='Continuous' ss:Weight='1'/> "); writer.WriteLine(" <Border ss:Position='Top' ss:LineStyle='Continuous' ss:Weight='1'/> "); writer.WriteLine(" </Borders> "); writer.WriteLine(" <Font ss:FontName='MS Pゴシック' x:CharSet='128' x:Family='Modern' ss:Size='11'/> "); writer.WriteLine(" <Interior/> "); writer.WriteLine(" </Style> "); writer.WriteLine(" <Style ss:ID='s39'> "); writer.WriteLine(" <Borders> "); writer.WriteLine(" <Border ss:Position='Bottom' ss:LineStyle='Continuous' ss:Weight='1'/> "); writer.WriteLine(" <Border ss:Position='Left' ss:LineStyle='Continuous' ss:Weight='1'/> "); writer.WriteLine(" <Border ss:Position='Right' ss:LineStyle='Continuous' ss:Weight='1'/> "); writer.WriteLine(" <Border ss:Position='Top' ss:LineStyle='Continuous' ss:Weight='1'/> "); writer.WriteLine(" </Borders> "); writer.WriteLine(" <Font ss:FontName='MS Pゴシック' x:CharSet='128' x:Family='Modern' ss:Size='11'/> "); writer.WriteLine(" <Interior/> "); writer.WriteLine(" </Style> "); writer.WriteLine(" </Styles> ");
//Sheet操作 writer.WriteLine("<Worksheet ss:Name='" + dr["Msg030"] + "'>"); writer.WriteLine(" <Table ss:ExpandedColumnCount='9' ss:ExpandedRowCount='3000' x:FullColumns='1' x:FullRows='1' ss:StyleID='s33' ss:DefaultColumnWidth='54' ss:DefaultRowHeight='13.5'>"); writer.WriteLine("<Column ss:StyleID='s34' ss:AutoFitWidth='0' ss:Width='110.25'/>"); writer.WriteLine("<Column ss:StyleID='s34' ss:AutoFitWidth='0' ss:Width='33.75'/>"); writer.WriteLine("<Column ss:StyleID='s34' ss:AutoFitWidth='0' ss:Width='118.5'/>"); writer.WriteLine("<Column ss:StyleID='s34' ss:AutoFitWidth='0' ss:Width='159.75'/>"); writer.WriteLine("<Column ss:StyleID='s34' ss:AutoFitWidth='0' ss:Width='147.75' ss:Span='4'/>");
for (int num = sheetNum - 1; num >= 0; num = num - 1) { // 考課表間有3行的空行 if (num != sheetNum - 1) { writer.WriteLine("<Row>"); writer.WriteLine("</Row>"); writer.WriteLine("<Row>"); writer.WriteLine("</Row>"); writer.WriteLine("<Row>"); writer.WriteLine("</Row>"); }
// 列名 writer.WriteLine("<Row ss:Height='40.5'>"); writer.WriteLine("<Cell ss:StyleID='s32'><Data ss:Type='String'>" + dr["Msg002"] + "</Data></Cell>"); writer.WriteLine("<Cell ss:StyleID='s32'><Data ss:Type='String'>" + dr["Msg003"] + "</Data></Cell>"); writer.WriteLine("<Cell ss:StyleID='s32'><Data ss:Type='String'>" + dr["Msg004"] + "</Data></Cell>"); writer.WriteLine("</Row>");
// 詳細數據 for (int i = 0; i < ds.Tables[2 * num].Rows.Count; i++) { writer.WriteLine("<Row ss:Height='27'>"); writer.WriteLine("<Cell><Data ss:Type='String'>" + ds.Tables[2 * num].Rows[i]["EvalLevel1Name"].ToString() + "</Data></Cell>"); writer.WriteLine("<Cell><Data ss:Type='Number'>" + ds.Tables[2 * num].Rows[i]["EvalLevel2Code"].ToString() + "</Data></Cell>"); writer.WriteLine("<Cell><Data ss:Type='String'>" + ds.Tables[2 * num].Rows[i]["EvalLevel2Name"].ToString() + "</Data></Cell>"); writer.WriteLine("</Row>"); } } writer.WriteLine(" </Table>"); writer.WriteLine(" </Worksheet>");
// 其他Sheet操作 for (int num = sheetNum - 1; num >= 0; num--) { writer.WriteLine("<Worksheet ss:Name='" + ds.Tables[2 * num].Rows[0][1].ToString() + "' ss:Protected='1'>"); writer.WriteLine(" <Table ss:ExpandedColumnCount='31' ss:ExpandedRowCount='30000' x:FullColumns='1' x:FullRows='1' ss:StyleID='s25' ss:DefaultColumnWidth='54' ss:DefaultRowHeight='13.5'>"); writer.WriteLine(" <Row>"); writer.WriteLine("<Cell ss:StyleID='s26'><PhoneticText xmlns='urn:schemas-microsoft-com:office:excel'>カキキイロテンスウツ</PhoneticText><Data ss:Type='String'>" + dr["Msg031"] + "</Data></Cell>"); writer.WriteLine("<Cell ss:Index='14' ss:StyleID='Default'/>"); writer.WriteLine("<Cell ss:StyleID='Default'/>"); writer.WriteLine("<Cell ss:StyleID='Default'/>"); writer.WriteLine("<Cell ss:StyleID='Default'/>"); writer.WriteLine("<Cell ss:StyleID='Default'/>"); writer.WriteLine("<Cell ss:StyleID='Default'/>"); writer.WriteLine("<Cell ss:StyleID='Default'/>"); writer.WriteLine("<Cell ss:StyleID='Default'/>"); writer.WriteLine("<Cell ss:StyleID='Default'/>"); writer.WriteLine("</Row>"); writer.WriteLine(" <Row>"); writer.WriteLine("<Cell ss:StyleID='s26'><PhoneticText xmlns='urn:schemas-microsoft-com:office:excel'>カキキイロテンスウツ</PhoneticText><Data ss:Type='String'>" + dr["Msg032"] + "</Data></Cell>"); writer.WriteLine("<Cell ss:Index='14' ss:StyleID='Default'/>"); writer.WriteLine("<Cell ss:StyleID='Default'/>"); writer.WriteLine("<Cell ss:StyleID='Default'/>");
writer.WriteLine("</Row>");
// 列名 writer.WriteLine("<Row>"); writer.WriteLine("<Cell ss:StyleID='s27'><Data ss:Type='String'>" + dr["Msg001"] + "</Data></Cell>"); writer.WriteLine("<Cell ss:StyleID='s28'><Data ss:Type='String'>" + dr["Msg002"] + "</Data></Cell>"); writer.WriteLine("<Cell ss:StyleID='s28'><Data ss:Type='String'>" + dr["Msg003"] + "</Data></Cell>"); writer.WriteLine("</Row>"); int SheetN = ds.Tables[2 * num].Rows.Count;
//詳細數據 for (int i = 0; i < SheetN; i++) { writer.WriteLine("<Row>"); writer.WriteLine("<Cell ss:StyleID='s35'><Data ss:Type='Number'>" + ds.Tables[2 * num].Rows[i]["EvalLevel1Code"].ToString() + "</Data></Cell>"); writer.WriteLine("<Cell ss:StyleID='s35'><Data ss:Type='String'>" + ds.Tables[2 * num].Rows[i]["EvalLevel1Name"].ToString() + "</Data></Cell>"); writer.WriteLine("<Cell ss:StyleID='s35'><Data ss:Type='Number'>" + ds.Tables[2 * num].Rows[i]["EvalLevel2Code"].ToString() + "</Data></Cell>"); writer.WriteLine("<Cell><Data ss:Type='String'> </Data></Cell>"); writer.WriteLine("</Row>"); } writer.WriteLine("<Row>"); writer.WriteLine("</Row>"); writer.WriteLine("<Row>"); writer.WriteLine("</Row>");
//列名 writer.WriteLine("<Row>"); writer.WriteLine("<Cell ss:StyleID='s29'><Data ss:Type='String'>" + dr["Msg011"] + "</Data></Cell>"); writer.WriteLine("<Cell ss:StyleID='s30'/>"); writer.WriteLine("<Cell ss:StyleID='s31'/>"); writer.WriteLine("<Cell ss:StyleID='s29'><Data ss:Type='String'>" + dr["Msg012"] + "</Data></Cell>"); writer.WriteLine("<Cell ss:StyleID='s31'/>"); writer.WriteLine("<Cell ss:StyleID='s29'><Data ss:Type='String'>" + dr["Msg013"] + "</Data></Cell>"); writer.WriteLine("<Cell ss:StyleID='s30'/>"); writer.WriteLine("<Cell ss:StyleID='s30'/>"); writer.WriteLine("<Cell ss:StyleID='s30'/>"); writer.WriteLine("<Cell ss:StyleID='s31'/>"); writer.WriteLine("<Cell ss:StyleID='s29'><Data ss:Type='String'>" + dr["Msg014"] + "</Data></Cell>"); writer.WriteLine("<Cell ss:StyleID='s31'/>"); writer.WriteLine("<Cell ss:StyleID='s29'><Data ss:Type='String'>" + dr["Msg015"] + "</Data></Cell>"); writer.WriteLine("<Cell ss:StyleID='s31'/>"); writer.WriteLine("</Row>"); writer.WriteLine("<Row>"); writer.WriteLine("<Cell ss:StyleID='s28'><Data ss:Type='String'>" + dr["Msg016"] + "</Data></Cell>"); writer.WriteLine("<Cell ss:StyleID='s28'><Data ss:Type='String'>" + dr["Msg017"] + "</Data></Cell>"); writer.WriteLine("<Cell ss:StyleID='s28'><Data ss:Type='String'>" + dr["Msg018"] + "</Data></Cell>"); writer.WriteLine("<Cell ss:StyleID='s28'><Data ss:Type='String'>" + dr["Msg019"] + "</Data></Cell>");
writer.WriteLine("</Row>"); int DateLen = ds.Tables[2 * num + 1].Rows.Count; string EmployeeManagement = "";
for (int i = 0; i < DateLen; i++) { writer.WriteLine("<Row>"); writer.WriteLine("<Cell ss:StyleID='s37'><Data ss:Type='Number'>" + ds.Tables[2 * num + 1].Rows[i]["EmployeeManagementID"].ToString() + "</Data></Cell>"); if (!EmployeeManagement.Equals(ds.Tables[2 * num + 1].Rows[i]["EmployeeManagementID"].ToString())) { writer.WriteLine("<Cell ss:StyleID='s35'><Data ss:Type='Number'>" + ds.Tables[2 * num + 1].Rows[i]["EmployeeCode"].ToString() + "</Data></Cell>"); writer.WriteLine("<Cell ss:StyleID='s35'><Data ss:Type='String'>" + ds.Tables[2 * num + 1].Rows[i]["EmployeeName"].ToString() + "</Data></Cell>"); writer.WriteLine("<Cell ss:StyleID='s35'><Data ss:Type='String'>" + ds.Tables[2 * num + 1].Rows[i]["BefEmployeeName2"].ToString() + "</Data></Cell>"); writer.WriteLine("<Cell ss:StyleID='s35'><Data ss:Type='String'>" + ds.Tables[2 * num + 1].Rows[i]["EmployeeName2"].ToString() + "</Data></Cell>"); writer.WriteLine("<Cell ss:StyleID='s38'><Data ss:Type='Number'>" + ds.Tables[2 * num + 1].Rows[i]["EvalLevel1Code"].ToString() + "</Data></Cell>"); writer.WriteLine("<Cell ss:StyleID='s35'><Data ss:Type='String'>" + ds.Tables[2 * num + 1].Rows[i]["EvalLevel1Name"].ToString() + "</Data></Cell>"); EmployeeManagement = ds.Tables[2 * num + 1].Rows[i]["EmployeeManagementID"].ToString(); } else { writer.WriteLine("<Cell ss:StyleID='s35'><Data ss:Type='String'></Data></Cell>"); writer.WriteLine("<Cell ss:StyleID='s35'><Data ss:Type='String'></Data></Cell>"); writer.WriteLine("<Cell ss:StyleID='s35'><Data ss:Type='String'></Data></Cell>"); writer.WriteLine("<Cell ss:StyleID='s35'><Data ss:Type='String'></Data></Cell>"); writer.WriteLine("<Cell ss:StyleID='s38'><Data ss:Type='String'></Data></Cell>"); writer.WriteLine("<Cell ss:StyleID='s35'><Data ss:Type='String'></Data></Cell>"); } writer.WriteLine("<Cell ss:StyleID='s39'><Data ss:Type='Number'>" + ds.Tables[2 * num + 1].Rows[i]["EvalLevel2Code"].ToString() + "</Data></Cell>"); writer.WriteLine("<Cell ss:StyleID='s35'><Data ss:Type='String'>" + ds.Tables[2 * num + 1].Rows[i]["EvalLevel2Name"].ToString() + "</Data></Cell>"); writer.WriteLine("</Row>"); } writer.WriteLine(" </Table>"); writer.WriteLine(" </Worksheet>"); }
writer.WriteLine("</Workbook>"); writer.Close();
FileDownload(ExcelFileName); } catch (System.Exception ex) {
} finally { Response.End(); } } public void FileDownload(FullFileName) { FileInfo DownloadFile = new FileInfo(FullFileName); Response.Clear(); Response.ClearHeaders(); Response.Buffer = true; Response.AppendHeader("Content-Disposition", "attachment;filename=" + System.Web.HttpUtility.UrlEncode(System.Text.Encoding.UTF8.GetBytes(MyFile".xls"))); Response.ContentType = "application/ms-excel;charset=UTF-8";//DownloadFile.FullNameoctet-stream Response.ContentEncoding = System.Text.Encoding.GetEncoding("shift-jis"); Response.AppendHeader("Content-Length", DownloadFile.Length.ToString()); Response.WriteFile(FullFileName); Response.Flush();
if (File.Exists(FullFileName)) { File.Delete(FullFileName); } }

方法四 用微軟的COM組件操作Excel。雖然可以很方便的操作單元格,並且能保留VBA代碼,它相當於直接打開一個EXCEL進程。

 

當初這個COM組件式給WinForm准備的,但在Web端有很多東西的支持不盡人意,例如無法用組件中的方法關閉Excel對象,

只能通過強制關閉Excel進程的方式(這其中還有很多問題,例如只能關閉當前打開的這個Excel的進程,否則會把其他用戶的Excel進程關閉)。在這里不推薦

方法五 用流的方式,把內容以Table的格式向Excel中放數據 好處是 可以生成格式豐富復雜的Excel,頁面無刷新

aspx部分

代碼如下:
<asp:Button ID="hidExport" onClick="hidExport_Click()" Runat="server"></asp:Button>

aspx.cs部分

代碼如下:
//內容很好理解,只需當成Table來拼字符串即可 private string getExcelContent() { StringBuilder sb = new StringBuilder();
sb.Append("<table borderColor='black' border='1' >"); sb.Append("<thead><tr><th colSpan='2' bgColor='#ccfefe'>標題</th></tr>"); sb.Append("<tr><th bgColor='#ccfefe'>號碼</th><th bgColor='#ccfefe'>名字</th></tr></thead>"); sb.Append("<tbody>"); sb.Append("<tr class='firstTR'><td bgcolor='#FF99CC'></td><td></td></tr>"); sb.Append("<tr class='secondTR'><td></td><td bgcolor='lightskyblue'></td></tr>"); sb.Append("</tbody></table>"); return sb.ToString(); }
private void hidExport_Click(object sender, System.EventArgs e) { string content = getExcelContent(); string css = ".firstTR td{color:blue;width:100px;}.secondTR td{color:blue;width:100px;}"; string filename = "Test.xls";
CommonTool.ExportToExcel(filename, content ,css); }

工具類CommonTool

代碼如下:
public class CommonTool { /// <summary> /// 以流的形式,可以設置很豐富復雜的樣式 /// </summary> /// <param name="content">Excel中內容(Table格式)</param> /// <param name="filename">文件名</param> /// <param name="cssText">樣式內容</param> public static void ExportToExcel(string filename, string content,string cssText) { var res = HttpContext.Current.Response; content = String.Format("<style type='text/css'>{0}</style>{1}",cssText,content);
res.Clear(); res.Buffer = true; res.Charset = "UTF-8"; res.AddHeader("Content-Disposition", "attachment; filename=" + filename); res.ContentEncoding = System.Text.Encoding.GetEncoding("UTF-8"); res.ContentType = "application/ms-excel;charset=UTF-8"; res.Write(content); res.Flush(); res.End(); } }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM