2010-07-16 17 views
6

Ho riscontrato un problema strano impostando un formato di data personalizzato con PHPExcel: sto scrivendo una data sql in una cella e impostando il suo formato con setFormatCode su 'd/m/y '. Quando lo apro in Excel 2007, mostra il formato della data originale finché non faccio doppio clic sulla cella e poi viene aggiornato al formato desiderato. C'è un modo per farlo rinfrescare senza di me aiutare?Formato cella PHPExcel personalizzato visualizzato solo dopo il doppio clic

$sheet->setCellValueByColumnAndRow($column, $row, '2010-07-16'); 
$sheet->getStyleByColumnAndRow($column, $row)->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_DMYSLASH); 

risposta

13

A meno che non si sta usando "Advanced Valore Binder" di PHPExcel, allora $ a foglio> setCellValueByColumnAndRow ($ colonna, $ row, '2010-07-16'); memorizzerà il valore come una stringa, non come una data, quindi il formato della data impostato nella riga successiva non ha senso se applicato a una stringa finché non si legge il file risultante in Excel e si impone un aggiornamento ... Excel stesso quindi corregge il tuo errore.

Per garantire che il valore sia archiviato correttamente, è necessario archiviarlo come data/timestamp/numero anziché una stringa, quindi impostare la maschera di formattazione per garantire che venga trattata come data/ora piuttosto che un valore numerico.

O convertire la stringa in una data PHP utilizzando strtotime(), quindi utilizzare di PHPExcel costruito in data metodi di conversione:

$PHPDateValue = strtotime('2010-07-16'); 
$ExcelDateValue = PHPExcel_Shared_Date::PHPToExcel($PHPDateValue); 
$sheet->setCellValueByColumnAndRow($column, $row, $ExcelDateValue); 
$sheet->getStyleByColumnAndRow($column, $row)->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_DMYSLASH); 

o utilizzare il metodo built-in per convertire una stringa data-formattata in un Excel valore datetime direttamente

$dateString = '2010-07-16'; 
$ExcelDateValue = PHPExcel_Shared_Date::stringToExcel($dateString); 
$sheet->setCellValueByColumnAndRow($column, $row, $ExcelDateValue); 
$sheet->getStyleByColumnAndRow($column, $row)->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_DMYSLASH); 

o utilizzare) la funzione del libreria di funzioni motori di calcolo DATEVALUE (:

$dateString = '2010-07-16'; 
$ExcelDateValue = PHPExcel_Calculation_Functions::DATEVALUE($dateString); 
$sheet->setCellValueByColumnAndRow($column, $row, $ExcelDateValue); 
$sheet->getStyleByColumnAndRow($column, $row)->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_DMYSLASH); 

o, l'opzione 4, è quello di utilizzare "Valore avanzata Binder" di PHPExcel

Per abilitare questa funzione, eseguire la seguente chiamata statica

PHPExcel_Cell::setValueBinder(new PHPExcel_Cell_AdvancedValueBinder()); 

prima di istanzia l'oggetto cartella di lavoro o caricarlo da file

Poi PHPExcel identificherà che il valore è una data, e gestire la conversione di un Excel data/ora e data e formattare automaticamente

$dateString = '2010-07-16'; 
$sheet->setCellValueByColumnAndRow($column, $row, $dateString); 
+0

Questa è un'ottima risposta. Grazie! – ISBL

+0

Non può essere sbagliato se viene risposto da uno dei creativi di PHPExcel da solo –

1

Vorrei aggiungere un'opzione 5 ...

Se si desidera utilizzare questo con SetValueExplicit si dovrebbe fare in questo modo:

\\convert bDate to dDate 
$dDate = PHPExcel_Shared_Date::PHPToExcel(strtotime($bDate)); 

\\must use type numeric 
$worksheet->getCell($col_row)->setValueExplicit($dDate,PHPExcel_Cell_DataType::TYPE_NUMERIC); 
\\use FORMAT_DATE of your choice i am using "YYYY-MM-DD" 
$worksheet->getStyle($col_row)->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDD2); 

Si prega di notare che i formati di data nella documentazione e in linea sembra essere obsoleto. Per un elenco completo di tutti i diversi tipi di FORMAT_DATE_XYZ, cerca nel file PHPExcel \ Style \ Number_Format.php nella tua copia della libreria.

Probabilmente è più semplice utilizzare l'Advanced Value Binder, ma se non puoi o non vuoi, allora spero che queste informazioni ti siano state utili.

Problemi correlati