2013-07-11 9 views
5

Attualmente sto realizzando un programma per il mio lavoro che utilizza PHPexcel per prelevare fondamentalmente tutti i dati da un foglio Excel, creare un nuovo foglio Excel e formattarlo in testo e trasferire tutto i dati dal vecchio foglio excel.PHPExcel, Data analizzata erroneamente

Il mio php deve essere in grado di acquisire i valori dal vecchio foglio excel e analizzarli correttamente, in particolare date/numeri/ecc.

Tutto funziona bene tranne le date. Per qualche motivo quando ottengo il valore formattato della cella; non corrisponde al formato della data nel primo foglio. Specificamente un valore come questo: 31/12/2099. Per qualche ragione, legge il codice di formattazione in modo errato come mm-dd-yy e output 12-31-99. Questo è estremamente frustrante e ho setacciato metà di internet per una risposta. Aiuto per favore; Non sono sicuro di quale sia il problema! Codice:

<?php 
$spreadSheet=$_FILES["filebrowser"]["tmp_name"]; 
/** PHPExcel_IOFactory */ 
require_once 'Classes/PHPExcel/IOFactory.php'; 
require_once 'Classes/PHPExcel/Shared/Date.php'; 
$objReader = PHPExcel_IOFactory::createReader('Excel2007'); 
//Create temporary sheet from uploaded file data 
$objPHPExcel = $objReader->load($spreadSheet); 
$sheet = $objPHPExcel->getActiveSheet(); 
$sheet->setTitle("Original Data"); 
$data=$sheet->getCell("D9")->getFormattedValue(); 

var_dump($data); 
exit;?> 

D9 è una cella con il formato DATE e un valore di 12/31/2099. Questo codice stampa 12-31-99 ...

+0

Prova getValue() al posto di getFormattedValue() – aynber

+0

getValue() ottiene il valore dei dati non elaborati della cella e restituisce un valore float. –

+0

Da quello che posso dire qui (http://phpexcel.codeplex.com/discussions/371418) dovresti essere in grado di utilizzare Date :: Time per convertirlo nel formato data desiderato. – aynber

risposta

6

Uso PHPExcel v1.7.9

Aprire il file "PHPExcel \ Style \ NumberFormat.php"

andare alla riga 278:

self::$_builtInFormats[22] = 'm/d/yy h:mm'; 

sostituirli con

self::$_builtInFormats[22] = 'dd-mm-yyyy hh:mm'; 

o qualsiasi formato tu voglia.

Non riesco a trovare un modo efficiente per modificarlo al volo e non ho motivo di formattare la data in un modo diverso da questo, quindi questa soluzione funziona per me.

+0

Avevo lo stesso esatto problema, questa risposta era la più vicina/più semplice 1. Il numero di riga che deve essere modificato è self :: $ _ builtInFormats [14] = 'mm-dd-yy'; a: self :: $ _ builtInFormats [14] = 'mm/gg/aaaa'; – Bryant

+0

Grazie per così bella risposta @steve ma per me funziona linea no 270 self :: $ _ builtInFormats [14] = 'mm-dd-yy'; a: self :: $ _ builtInFormats [14] = 'aaaa-mm-gg' –

2

Utilizzando v1.7.8 e assumendo Excel2007 aka .xlsx file di

$a1Cell = $sheet->getCell('A1'); 
$a1CellFormattedValue = trim($a1Cell->getFormattedValue()); 
if (!empty($a1CellFormattedValue)) { 
    $dateInTimestampValue = PHPExcel_Shared_Date::ExcelToPHP($a1Cell->getValue()); 
} 

Mi spiego ogni riga.

  • linea 1 è quello di ottenere l'oggetto cellulare
  • linea 2 e il blocco if è così che eseguiamo solo per le celle non vuote
  • linea 4 è come trasformare il valore all'interno della cellula in unix timestamp.

Si è lasciato a decidere quali formati di data per scrivere il valore nel file Excel di destinazione. Il mio suggerimento è che tu decida con gli stakeholder che TUTTE le date nei file excel di destinazione seguiranno un particolare formato.

Questo è il modo più pulito che riesco a pensare.

P.S. Se hai una cella vuota e provi a fare PHPExcel_Shared_Date::ExcelToPHP sul valore della cella, otterrai la data corrente.

UPDATE

appena realizzato che i tuoi commenti parlare non si può arbitrariamente decidere il formato. Mi dispiace per quello Se mi imbatto in qualcosa che aiuta, aggiornerò questa risposta.

0

Ho appena trovato la tua domanda. se si conosce il formato in cui Excel è salvare la data, quindi è possibile utilizzare la classe PHP DateTime come una rappresentazione data intermedia

$data=$sheet->getCell("D9")->getFormattedValue(); 
$date = DateTime::createFromFormat ("m-d-y" , $data); 
$string_date = $date->format($format); 

dove $format è qualsiasi formato desiderato