2013-09-05 3 views
5

Я экспортирую данные в Excel с веб-страницы. Это не должно быть проблемой, но в данных есть <p> тегов. Это заставляет Excel создавать новые строки, когда все данные должны находиться в одной и той же ячейке. После некоторых исследований я обнаружил, что размещение mso-данных должно делать трюк, но оно не работает. Excel открывается, данные отображаются, но создаются дополнительные незатребованные строки. Вот код, я использую, чтобы экспортировать данные:mso-data-placement: same-cell not working

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

Это является примером необработанных данных в базе данных, которая дает мне горе:

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

Предложения?


Я попробовал несколько других вещей

  1. Я пошел прямо к данным и добавлен атрибут МСО-данных размещения в пункте метки инлайн. Все еще не сработало. Данные выглядели как этот

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

  1. Я попробовал другие mso- * атрибуты, которые не работают либо. Например, я изменил свою таблицу стилей, чтобы выглядеть так

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

Почему о, почему не Excel распознает mso- * атрибуты?!?!

ответ

0

Существует решение, но оно не является чистым.

После dge.DataBind поместите следующий код. Это будет кодировать текст каждой ячейки

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

В файле Excel, при открытии, должны показать исходные данные с разметкой, все в одной ячейке.

Я обнаружил, что это работает, потому что Excel на самом деле кодирует текст. Чтобы узнать, что делает Excel в действии, выполните следующие действия:

  1. Создайте новую книгу в Excel (я использую Office 2013).
  2. В первой ячейке вставьте исходные данные (как показано на рисунке). Сделайте это, сначала нажав F2 (вставьте в ячейку), затем вставьте текст.
  3. Сохраните книгу как файл HTML (или веб-страницу).
  4. Используя проводник Windows, перейдите в папку, где вы сохранили файл. Должна быть скрытая папка (я думаю, что она скрыта) с тем же именем, что и ваш файл. Например, если ваша книга Book1.htm, должна быть папка с надписью Book1_files.
  5. В этой папке должен быть HTM-файл с именем sheet001.htm. Откройте этот файл в блокноте (или любом текстовом редакторе ... не excel или word)
  6. Найдите исходные данные. Вы увидите, что текст не отображает разметку HTML, а показывает кодированную версию.

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