2009-01-13 8 views
5

Ngay bây giờ tôi đang sử dụng này để xuất khẩu một repeater (với nhiều bộ lặp lồng nhau) vượt trội:Xuất sang Excel từ một Repeater?

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(); 
} 

Nhưng điều này không làm những gì tôi muốn. Thay vào đó nó cho tôi html trong tập tin excel (mặc dù dữ liệu là có) đây là những gì tôi nhận được (mỗi dòng là một tế bào trong bảng 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> 

và cứ thế ... bây giờ dữ liệu là chính xác, nhưng làm thế nào tôi có thể làm cho nó hiển thị chính xác trong bảng tính?

Trả lời

12

Bạn cần phải đính kèm tất cả điều đó trong thẻ bảng. Excel có thể hiểu cấu trúc bảng HTML.

Hãy thử:

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

đơn giản như vậy ... không thể tin rằng tôi bị mất rằng, cảm ơn! – naspinski

0

bạn nên thực hiện các tập tin đầu ra một file html thích hợp, với html và thân thẻ. Điều đó sẽ hoạt động tốt hơn.

0

không để trả lời câu hỏi của bạn trực tiếp, nhưng đưa cho bạn quan điểm của tôi

cho rằng kinda của dữ liệu, là theo ý kiến ​​của tôi rằng bạn nên sử dụng một điều khiển GridView, lấy ví dụ của bạn, bạn sẽ cần phải viết một cái gì đó như:

<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> 

sử dụng một GridView tất cả ou nee dto ghi ở phần HTML duy nhất là:

<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> 

một cái gì đó đơn giản hơn và dễ dàng hơn để đọc

bạn sẽ có nhiều quyền kiểm soát hơn bằng cách sử dụng đối tượng GridView thay vì lặp lại và bạn sẽ không bao giờ gặp vấn đề đó, vì việc hiển thị GridView sẽ luôn đi kèm với thẻ bảng.

Hy vọng nó giúp

Và BTW, tôi đã kiểm tra trường hợp của bạn và tôi đã không có bất kỳ vấn đề ngay cả khi tôi đã không được ghi chép lại các thẻ như Spencer đề cập đến.

để xem mã của tôi: File with HTML and Method-File with myObject