Экспорт в Excel из репитера? - PullRequest
6 голосов
/ 13 января 2009

Сейчас я использую это для экспорта повторителя (с несколькими вложенными повторителями) в 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>

и так далее ... теперь данные верны, но как мне заставить их правильно отображаться в электронной таблице?

Ответы [ 3 ]

13 голосов
/ 13 января 2009

Вы должны заключить все это в теги таблицы. Excel может понимать структуру таблиц HTML.

Попытка:

Response.Write("<table>");
Response.Write(stringWrite.ToString()); 
Response.Write("</table>");
1 голос
/ 13 января 2009

не для того, чтобы ответить на ваш вопрос напрямую, но, учитывая ваше мнение

для такого рода данных, по моему мнению, вы должны использовать элемент управления 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 всегда будет идти с тегами таблицы.

Надеюсь, это поможет

И, кстати, я проверил ваш случай, и у меня не возникло никаких проблем, даже если я не писал такие теги, как упоминание Спенсера.

чтобы увидеть мой код: Файл с HTML и методом - Файл с myObject

0 голосов
/ 13 января 2009

вы должны сделать выходной файл правильным html-файлом с тэгами html и body. Это должно работать лучше.

...