Экспортировать в 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>
и так далее...теперь данные верны, но как я могу заставить их правильно отображаться в электронной таблице?
Решение
Вам нужно заключить все это в теги таблицы.Excel может понимать структуры таблиц HTML.
Пытаться:
Response.Write("<table>");
Response.Write(stringWrite.ToString());
Response.Write("</table>");
Другие советы
не для того, чтобы ответить на ваш вопрос прямо, а высказал свое мнение
для такого рода данных, по моему мнению, вам следует использовать элемент управления 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, а не повторителя, и у вас никогда не возникнет подобных проблем, поскольку рендеринг GridView всегда будет сопровождаться тегами таблицы.
Надеюсь, поможет
И, кстати, я проверил ваш случай, и у меня не возникло никаких проблем, даже если я не писал теги, подобные упоминанию Спенсера.
чтобы увидеть мой код: Файл с HTML и методом - Файл с моим объектом
вам следует сделать выходной файл правильным HTML-файлом с тегами html и body.Это должно работать лучше.