2013-09-05 30 views
5

Tôi đang xuất dữ liệu vào Excel từ một trang web. Đây không phải là không có trí tuệ, nhưng có <p> thẻ trong dữ liệu. Điều này làm cho Excel tạo các hàng mới khi dữ liệu tất cả nên ở trong cùng một ô. Sau một số nghiên cứu tôi thấy rằng vị trí mso-data nên thực hiện thủ thuật, nhưng nó không hoạt động. Excel mở ra, dữ liệu được hiển thị, nhưng các hàng thừa không cần thiết được tạo ra. Dưới đây là đoạn code tôi sử dụng để xuất dữ liệu:mso-data-placement: cùng một ô không hoạt động

protected void doexcel() 
    { 
     string style = @"<style type='text/css'>P {mso-data-placement:same-cell; font-weight:bold;}</style>"; 


    HttpResponse response = HttpContext.Current.Response; 

    // first let's clean up the response.object 
    response.Clear(); 
    response.Charset = ""; 

    //set the response mime type for excel 
    response.ContentType = "application/vnd.ms-excel"; 
    Random RandomClass = new Random(); 
    int RandomNumber = RandomClass.Next(); 
    String filename = "a" + RandomNumber + DateTime.Now + ".xls"; 
    response.AddHeader("Content-Disposition", "attachment;filename=\"" + filename + "\""); 

    // create a string writer 
    using (StringWriter sw = new StringWriter()) 
    { 
     using (HtmlTextWriter htw = new HtmlTextWriter(sw)) 
     { 

     HttpContext.Current.Response.Write(style); 
      SqlDataSourceEmployeeAssets.ConnectionString = MyObjects.Application.CurrentContext.ConnectionString; 
      String sql = (string)Session["sql"]; 
      SqlDataSourceEmployeeAssets.SelectCommand = sql; 
      // lCount.Text = "Query returned " + getCount(query) + " rows."; 
      DataGrid dge = new DataGrid(); 
      dge.DataSource = SqlDataSourceEmployeeAssets; 
      dge.DataBind(); 
      dge.RenderControl(htw); 
      response.Write(sw.ToString()); 
      response.End(); 
     } 
    } 
} 

Đây là một ví dụ về các dữ liệu thô trong cơ sở dữ liệu đó là đem lại cho tôi đau buồn:

<P>4/13/2011 : Cheng "Jonathan" Vaing is with BSES Graffiti Unit.</P><P>4/13/2011 : Cheng "Jonathan" Vaing is with</P> 

Gợi ý?


Tôi đã thử một vài điều khác

  1. tôi đã đi thẳng đến dữ liệu và thêm thuộc tính mso-dữ liệu vị trí cho thẻ đoạn inline. Vẫn không hoạt động. Các dữ liệu trông như thế này

<P style="mso-data-placement:same-cell> my data </p>

  1. tôi đã cố gắng mso- thuộc tính * khác, điều đó không làm việc, hoặc. Ví dụ, tôi đã thay đổi kiểu của tôi trông như thế này

<style type='text/css'>P {mso-highlight:yellow}</style>";

Tại sao oh lý do tại sao không Excel nhận ra thuộc tính * mso- của tôi?!?!

Trả lời

0

Có giải pháp nhưng không sạch.

Sau dge.DataBind, hãy đặt mã sau đây. Điều này sẽ mã hóa văn bản của mỗi ô

foreach (DataGridItem dgi in dge.Items) 
{     
     foreach (TableCell cell in dgi.Cells) 
     { 
      cell.Text = WebUtility.HtmlEncode(cell.Text);; 
     } 
}   

Tệp Excel, khi được mở, sẽ hiển thị dữ liệu thô có đánh dấu, tất cả trong một ô.

Tôi thấy rằng điều này hoạt động vì Excel thực sự cũng mã hóa văn bản. Để xem Excel hoạt động như thế nào, hãy làm như sau:

  1. Tạo sổ làm việc mới trong Excel (Tôi đang sử dụng Office 2013).
  2. Trong ô đầu tiên, dán dữ liệu thô (như bạn đã hiển thị). Làm điều này bằng cách đầu tiên nhấn F2 (chèn vào ô), sau đó dán văn bản.
  3. Lưu sổ làm việc dưới dạng tệp HTML (hoặc trang web).
  4. Sử dụng trình khám phá cửa sổ, đi tới vị trí thư mục nơi bạn đã lưu tệp. Nên có một thư mục ẩn (tôi nghĩ rằng nó là ẩn) với cùng tên với tập tin của bạn. Ví dụ, nếu sổ làm việc của bạn là Book1.htm, sẽ có một thư mục có nhãn Book1_files.
  5. Trong thư mục này, phải có tệp HTM có tên sheet001.htm. Mở tệp này bằng notepad (hoặc bất kỳ trình soạn thảo văn bản nào ... không xuất sắc hoặc từ)
  6. Tìm dữ liệu thô của bạn. Bạn sẽ thấy rằng văn bản không hiển thị đánh dấu HTML, thay vì nó đang hiển thị phiên bản được mã hóa.

Hy vọng điều này sẽ hữu ích.

Các vấn đề liên quan