2010-07-22 13 views
27

Iam che esporta un DataTable in un file Excel utilizzando l'interoperabilità di Office. Il problema è che Excel non riconosce le date come tali, ma visualizza numeri. In un altro caso, passo una stringa che poi riconosce come data. In entrambi i casi i dati sono incasinati.Come formattare la data corretta durante la scrittura dei dati in Excel

Ho provato NumberFormat @ che dovrebbe memorizzare la cella in formato testo, ma non ha funzionato neanche.

  Application app = new Application(); 
      app.Visible = false; 
      app.ScreenUpdating = false; 
      app.DisplayAlerts = false; 
      app.EnableAnimations = false; 
      app.EnableAutoComplete = false; 
      app.EnableSound = false; 
      app.EnableTipWizard = false; 
      app.ErrorCheckingOptions.BackgroundChecking = false; 

      Workbook wb = app.Workbooks.Add(XlWBATemplate.xlWBATWorksheet); 
      Worksheet ws = (Worksheet)wb.Worksheets[1]; 

      for (int j = 0; j < dt.Rows.Count; j++) 
      { 
       for (int i = 0; i < dt.Columns.Count; i++) 
       { 
        Range rng = ws.Cells[j+2, i+1]as Range; 
        rng.Value2 = dt.Rows[j][i].ToString(); 
        rng.NumberFormat = "@"; 
       } 
      }   

      wb.SaveAs(filename, Missing.Value, Missing.Value, Missing.Value, Missing.Value, 
        Missing.Value, XlSaveAsAccessMode.xlExclusive, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value); 

      wb.Close(false, Missing.Value, Missing.Value);    

      app.Workbooks.Close(); 
      app.Application.Quit(); 
      app.Quit();  
      System.Runtime.InteropServices.Marshal.ReleaseComObject(ws); 
      System.Runtime.InteropServices.Marshal.ReleaseComObject(wb); 
      System.Runtime.InteropServices.Marshal.ReleaseComObject(app); 
      ws = null; 
      wb = null; 
      app = null; 
      GC.Collect(); 

Perché non il mio NumberFormat @ work? Non dovrebbe Textformat visualizzare tutto come ho messo?

risposta

31

Hai provato a formattare l'intera colonna come colonna della data? Qualcosa di simile a questo:

Range rg = (Excel.Range)worksheetobject.Cells[1,1]; 
rg.EntireColumn.NumberFormat = "MM/DD/YYYY"; 

L'altra cosa che si potrebbe provare sarebbe mettere un solo tick prima che l'espressione di stringa prima di caricare il testo nella cella di Excel (non so se quello che conta o no, ma funziona il testo durante la digitazione direttamente in una cella).

+0

La formattazione di ogni cella separatamente non dovrebbe essere diversa. Come posso formattare correttamente tutto come testo? – codymanix

+0

Se si desidera che Excel consideri la colonna come una colonna di data, dovrebbe avere un formato di data, altrimenti accadranno cose strane, che hai già sperimentato. Tuttavia, puoi fare riferimento alla mia ultima modifica per un'altra possibile soluzione alternativa. – dcp

7

Provare a utilizzare

DateTime.ToOADate() 

E mettere che come un doppio nella cella. Potrebbero esserci problemi con Excel su sistemi Mac (utilizza un diverso datetime -> doppia conversione), ma dovrebbe funzionare bene nella maggior parte dei casi.

Spero che questo aiuti.

+0

Perché my @ non funziona? Voglio che tutto sia come se l'avessi messo. – codymanix

+0

Buona soluzione ... tutto il resto è fallito! – Sheridan

+0

Voto positivo! Ha funzionato quando tutto il resto ha fallito! –

2

So che questa domanda è vecchia ma la compilazione di Excell Cells with Dates tramite VSTO ha un paio di trucchi.

ho trovato Formula non funzionano su date con formato AAAA-mmm-dd - anche se le celle erano FORMATO DATA! Devi tradurre le date in formato gg/mm/aaaa per l'uso in formula.

Per esempio le date sto ottenendo tornare da SQL Analysis Server e ho dovuto capovolgere loro e poi formattare loro:

using (var dateRn = xlApp.Range["A1"].WithComCleanup()) 
{ 
    dateRn.Resource.Value2 = Convert.ToDateTime(dateRn.Resource.Value2).ToString("dd-MMM-yyyy"); 
} 


using (var rn = xlApp.Range["A1:A10"].WithComCleanup()) 
{ 
    rn.Resource.Select(); 
    rn.Resource.NumberFormat = "d-mmm-yyyy;@"; 
} 

Altrimenti di formula utilizzando le date non funziona - la formula nella cella C4 è lo stesso di C3:

enter image description here

1

vecchia questione, ma ancora attuale.Ho generato un dizionario che ottiene il formato datetime appropriato per ogni regione, qui è la classe helper ho generato:

https://github.com/anakic/ExcelDateTimeFormatHelper/blob/master/FormatHelper.cs

FWIW questo è come sono andato su di esso:

  1. aperto excel , inserito manualmente un datetime nella prima cella di una cartella di lavoro
  2. ha aperto la finestra di dialogo delle regioni nel pannello di controllo
  3. utilizzato Spy per trovare la casella combinata di HWND delle regioni e il pulsante Apply in modo da poter utilizzare SetFore groundWindow e SendKey per modificare la regione (impossibile trovare la modalità di modifica della regione tramite l'API di Windows)
  4. iterato attraverso tutte le regioni e per ogni regione ha chiesto a Excel il NumberFormat della cella che conteneva la data, salvando questi dati in un file
+0

Probabilmente non è stata la risposta che l'interlocutore aveva in mente, ma trovo molto utile (ma speravo che ci fosse una soluzione più semplice ...). Grazie per aver condiviso il tuo codice! – habakuk

+1

Sì, stavo cercando anche una soluzione più semplice, ma dopo aver trascorso parecchie ore concludeva che non ce n'era uno. Excel non espone semplicemente un modo agnostico per la regione delle date di formattazione. Ho postato questo perché la risposta accettata non tiene conto di ciò; funziona bene per l'inglese e la maggior parte delle altre culture ma fallirebbe ad es. Tedesco, francese e molte altre regioni. Sì, forse non è la risposta che merita OP, ma la risposta di cui ha bisogno :) – anakic

0

Questo ha funzionato per me:

hoja_trabajo.Cells[i + 2, j + 1] = fecha.ToString("dd-MMM-yyyy").Replace(".", ""); 
0

Questo ha funzionato per me:

sheet.Cells[currentRow, ++currentColumn] = "'" + theDate.ToString("MM/dd/yy"); 

Nota il segno di spunta m arca aggiunta prima della data.

Problemi correlati