从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