2013-09-05 17 views
5

Sto esportando i dati in Excel da una pagina web. Questo dovrebbe essere un gioco da ragazzi, ma ci sono i tag <p> nei dati. Ciò causa che Excel crea nuove righe quando i dati dovrebbero essere tutti nella stessa cella. Dopo alcune ricerche ho scoperto che il posizionamento di mso-data dovrebbe fare il trucco, ma non funziona. Excel si apre, i dati vengono visualizzati, ma vengono create altre righe non necessarie. Qui è il codice che uso per esportare i dati:mso-data-placement: stessa cella non funzionante

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

Questo è un esempio dei dati grezzi nel database che mi sta dando il dolore:

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

Suggerimenti?


Ho provato un paio di altre cose

  1. sono andato dritto ai dati e ha aggiunto l'attributo mso-dati-placement al paragrafo tag in linea. Ancora non ha funzionato. I dati sembravano questo

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

  1. ho provato altri attributi mso- *, che non ha funzionato neanche. Per esempio, ho cambiato il mio foglio di stile per assomigliare a questo

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

Perché oh perché non riconosce Excel miei attributi mso- *?!?!

risposta

0

C'è una soluzione ma non è pulita.

Dopo dge.DataBind, inserire il seguente codice. Ciò codificare il testo di ogni cella di

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

Il file Excel, quando ha aperto, dovrebbe mostrare i dati grezzi con il markup, tutti in una cella.

Ho scoperto che questo funziona perché anche Excel codifica effettivamente il testo. Per vedere cosa fa Excel in azione, effettuare le seguenti operazioni:

  1. Creare una nuova cartella di lavoro in Excel (sto utilizzando Office 2013).
  2. Nella prima cella, incolla i dati non elaborati (come hai visualizzato). Fai questo premendo prima F2 (inserisci nella cella), quindi incolla il testo.
  3. Salvare la cartella di lavoro come file HTML (o pagina Web).
  4. Utilizzando Windows Explorer, andare al percorso della cartella in cui è stato salvato il file. Ci dovrebbe essere una cartella nascosta (penso che sia nascosta) con lo stesso nome del tuo file. Ad esempio, se la cartella di lavoro è Book1.htm, dovrebbe esserci una cartella denominata Book1_files.
  5. In questa cartella, dovrebbe esserci un file HTM con il nome sheet001.htm. Apri questo file in Blocco note (o qualsiasi editor di testo ... non Excel o Word)
  6. Individua i tuoi dati grezzi. Vedrai che il testo non mostra la marcatura HTML, ma mostra la versione codificata.

Spero che questo aiuti.