从Repeater导出到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(); } 

但是这不是我想要的。 相反,它是给我在Excel文件中的HTML(虽然数据在那里),这是我得到的(每行是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> 

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

你需要把所有这些都放在表格标签中。 Excel可以理解HTML表格结构。

尝试:

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

你应该使输出文件一个适当的HTML文件,与HTML和身体标签。 这应该会更好。

不要直接回答你的问题,而是给你我的意见

对于那种数据,在我看来,你应该使用一个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> 

使用一个GridView,你只需要在HTML部分写入:

 <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将始终与表标记。

希望能帮助到你

顺便说一句,我testing了你的情况,即使我没有写斯宾塞提到的标签,我也没有任何问题。

看到我的代码: 文件与HTML和方法 – 文件与myObject