6

现在我正在使用它来导出一个中继器(具有多个嵌套中继器)到 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>

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

4

3 回答 3

13

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

尝试:

Response.Write("<table>");
Response.Write(stringWrite.ToString()); 
Response.Write("</table>");
于 2009-01-13T07:37:36.747 回答
1

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

对于那种数据,我认为您应该使用 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 的文件

于 2009-01-13T08:18:09.957 回答
0

您应该使用 html 和 body 标记使输出文件成为正确的 html 文件。那应该会更好。

于 2009-01-13T07:40:21.873 回答