2009-01-13 18 views
5

现在我用这个导出一个中继器(具有多重嵌套中继器)擅长:从中继器导出到Excel?

protected void ExportToExcel(object sender, EventArgs e) 
{  
Response.Clear(); 
Response.Buffer = true; 
Response.AddHeader("content-disposition", "attachment;filename=finance.xls"); 
Response.Charset = ""; 
Response.ContentType = "application/vnd.ms-excel"; 
System.IO.StringWriter stringWrite = new System.IO.StringWriter(); 
System.Web.UI.HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite); 
rptMinistry.RenderControl(htmlWrite); 
Response.Write(stringWrite.ToString()); 
Response.End(); 
} 

但这不是做我想要的。相反,它是HTML给我的Excel文件(尽管数据有),这是我所得到的(每行是在Excel工作表单元格):

<tr class="alt"> 
<td class='hidden'>LOR In Development</td> 
<td>MOD</td> 
<td>Air Force</td> 
<td class="size1"></td> 
<td>Hellfire (AGM-114) Follow On</td> 
<td>10-Mar-08</td> 
<td class="align_right ">$50,000,000.00</td> 
<td class="align_right hidden">$0.00</td> 
</tr> 

<tr class="alt"> 
<td class='hidden'>LOR In Development</td> 
<td>MOD</td> 
<td>Air Force</td> 
<td class="size1"></td> 
<td>Precision Strike Mi-17 (block 20)</td> 
<td>17-May-08</td> 
<td class="align_right ">$20,100,000.00</td> 
<td class="align_right hidden">$0.00</td> 
</tr> 

等等...现在数据是正确的,但我怎样才能让它在电子表格中正确显示?

回答

12

您需要将所有这些都包含在表标记中。 Excel可以理解HTML表格结构。

尝试:

Response.Write("<table>"); 
Response.Write(stringWrite.ToString()); 
Response.Write("</table>"); 
+0

那么简单......不能相信我错过了,谢谢! – naspinski 2009-01-13 07:50:28

0

你应该让输出文件一个适当的HTML文件,用html和body标签。这应该更好。

0

没有直接回答你的问题,而是给了你我的意见

对于还挺数据,在我看来,你应该使用一个GridView控件,把你的例子中,你需要写类似:

<asp:Repeater ID="rpt" runat="server" DataSourceID="ods"> 
    <HeaderTemplate> 
     <table> 
     <tr> 
      <td>Header</td> 
      <td>Type</td> 
      <td>Name</td> 
      <td>Date</td> 
      <td>Amount</td> 
     </tr> 
    </HeaderTemplate> 
    <ItemTemplate> 
     <tr> 
      <td> 
       <%#Eval("Header")%> 
      </td> 
      <td> 
       <%#Eval("Type")%> 
      </td> 
      <td> 
       <%#Eval("Name")%> 
      </td> 
      <td> 
       <%#Eval("Date", "{0:d}")%> 
      </td> 
      <td> 
       <%#Eval("Value", "{0:c}")%> 
      </td> 
     </tr> 
    </ItemTemplate> 
    <FooterTemplate> 
     </table> 
    </FooterTemplate> 
</asp:Repeater> 

使用HTML部分GridView中的所有OU东东DTO写只是:简单和容易

<asp:GridView ID="gv" runat="server" DataSourceID="ods" AutoGenerateColumns="false"> 
    <Columns> 
     <asp:BoundField DataField="Header" HeaderText="Header" /> 
     <asp:BoundField DataField="Type" HeaderText="Type" /> 
     <asp:BoundField DataField="Name" HeaderText="Name" /> 
     <asp:BoundField DataField="Date" DataFormatString="{0:d}" HeaderText="Date" /> 
     <asp:BoundField DataField="Value" DataFormatString="{0:c}" HeaderText="Value" /> 
    </Columns> 
</asp:GridView> 

东西可以读

使用GridView对象而不是Repeater,你将拥有更多的控制权,而且,你永远不会遇到这样的问题,因为渲染gridView将始终伴随着table标签。

希望它可以帮助

而且顺便说一句,我测试你的情况,我没有得到,即使我没有像书面方式斯宾塞标签提任何问题。

看到我的代码:File with HTML and Method - File with myObject