2017-09-17 1 views
1

Je travaille sur staff attendance. L'utilisateur peut télécharger une feuille de présence et mon système donnera la vue de la feuille de présence à l'utilisateur et ensuite il peut l'enregistrer dans la base de données. Les valeurs d'Excel feuille sauver avec succès dans la base de données. Le problème est que l'utilisateur peut ajouter un enregistrement dans les colonnes de la feuille Excel dans n'importe quel format, mais quand je reçois PHP, le format de la date ne va pas.Convertir le format des colonnes excelsheet en PHP ne fonctionne pas

par exemple. lorsque l'utilisateur ajouter la date de présence dans la colonne, le format de la colonne est date et quand il peut enregistrer dans le temps, il peut être le format numérique et lorsque l'utilisateur télécharger cette feuille Excel, l'aperçu de la date est entré dans unix time stamp.

Voici des exemples dans les images

  1. date dans la feuille Excel enter image description here

    1. temps et en feuille Excel enter image description here

    2. Lorsque l'utilisateur aller sur le site et télécharger cette feuille Excel enter image description here

    3. Ensuite, une fenêtre pop-up ouvert enter image description here

    4. Ensuite, l'utilisateur de naviguer dans la feuille Excel puis je montre Excel vue de la feuille, que l'affichage mauvais enter image description here

Vous pouvez voir dans l'image ci-dessus que la date est convertie en horodatage unix et l'heure d'entrée et de sortie en numérique.

Je veux cette vue lorsqu'un utilisateur peut télécharger une feuille Excel.

enter image description here

Alors espérons que vous comprendrez mon problème et ce que je veux.

Voici mon téléchargement et afficher des fichiers Excel Code feuille:

$excel_file = $_FILES['file']['name']; 
$target = SERVERPATH . 'assets/attendance_excel/'; 
$ext = pathinfo($excel_file, PATHINFO_EXTENSION); 

$filename = rand() . date("YmdHis"); 

move_uploaded_file($_FILES['file']['tmp_name'], $target . $filename . '.' . $ext); 

include(EXCEL_CLASS); 

$inputFileName = $target . $filename . '.' . $ext; 
//   chmod($inputFileName,0777); 

try { 
    $objPHPExcel = PHPExcel_IOFactory::load($inputFileName); 
} catch (Exception $e) { 
    die('Error loading file "' . pathinfo($inputFileName, PATHINFO_BASENAME) . '": ' . $e->getMessage()); 
} 

$objWorksheet = $objPHPExcel->getActiveSheet(); 
//   $objWorksheet->getStyle('A1:E433')->getNumberFormat()->setFormatCode('Text'); 

$highestRow = $objWorksheet->getHighestRow(); // e.g. 10 
$highestColumn = $objWorksheet->getHighestDataRow(); 

$highestColumn = $objWorksheet->getHighestColumn(); // e.g 'F' 

$highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn); // e.g. 5 


$td_data = ''; 
$row_no = 0; 

for ($row = 1; $row <= $highestRow; ++$row) { 
    $check_empty_column = 0; 

    for ($col = 0; $col <= $highestColumnIndex; ++$col) { 
     if ($objWorksheet->getCellByColumnAndRow($col, $row)->getValue() == null) { 
      $check_empty_column++; 
     } 
    } 

    if ($check_empty_column < $highestColumnIndex) { 
     for ($col = 0; $col < $highestColumnIndex; ++$col) { 

      $td_data .= '<td>' . $objWorksheet->getCellByColumnAndRow($col, $row)->getValue() . '</td>'; 

     } 
    } 

    $tr_data[$row_no] = $td_data; 
    $td_data = ''; 
    $row_no++; 
} 

$data_all = array(
    'data' => $tr_data, 
    't_col' => $highestColumnIndex, 
    'name' => $filename . '.' . $ext 
); 
echo json_encode($data_all); 

je recherche aussi beaucoup à ce sujet et trouvé quelque chose comme ça setFormatCode, PHPExcel_Style_NumberFormat::FORMAT_GENERAL etc mais ne fonctionne pas pour moi. Je fais de mon mieux.

Alors s'il vous plaît donnez-moi une solution à ce problème.

Note: Je ne peux pas interdire à un utilisateur qu'il convertit les colonnes et que d'ajouter des données.

espère que vous comprenez ma question

Répondre

2

MS Excel stocke les dates comme une valeur flottante, un horodatage sérialisé, le nombre de jours depuis le 1er Janvier 1900 (ou 1er Janvier 1904 si le fichier utilise le calendrier Mac) et c'est le masque de format de nombre pour la cellule qui l'affiche comme une date formatée.

PHPExcel fournit une série de méthodes pour convertir entre cette MS Exce horodatage sérialisés et timestamp unix ou objets PHP DateTime

$unixTimestamp = PHPExcel_Shared_Date::ExcelToPHP($excelTimestampValue); 

convertit l'horodatage MS Excel à un horodatage Unix

$phpDateTimeObject = PHPExcel_Shared_Date::ExcelToPHPObject($excelTimestampValue); 

sera convertir l'horodatage MS Excel en un objet DateTime PHP

Et vous pouvez ensuite utiliser la norme PHP date() f ou la méthode format() de l'objet DateTime pour formater cette valeur comme bon vous semble.

$excelTimestamp = PHPExcel_Shared_Date::ExcelToPHPObject($phpDateTimeObject); 
$excelTimestamp = PHPExcel_Shared_Date::ExcelToPHPObject($unixTimestamp); 

vous permet de convertir soit un unix un objet DateTime PHPP à une valeur d'horodatage sérialisé MS Excel

Si vous voulez changer la façon dont un horodatage sérialisé MS Excel est affiché dans une feuille de calcul, vous besoin d'utiliser un masque de format Excel qui correspond aussi un masque de date/heure .... PHPExcel_Style_NumberFormat :: FORMAT_GENERAL est pas un masque de format pour les dates/heures

+0

pouvez-vous s'il vous plaît me dire comment puis-je faire en mon code ... parce que j'ai toutes les colonnes et les lignes dynamiquement – deemi

+1

Comme vous savez quelles cellules contiennent des dates, vous récupérez la valeur de la cellule en utilisant '$ objWorksheet-> getCellByColumnAndRow ($ col, $ row) -> getValue()' et passez le résultat en argument à 'PHPExcel_Shared_Date :: ExcelToPHPObject() ', récupérant ce résultat, puis utilisant la méthode' format() 'de l'objet DateTime pour lui indiquer comment afficher le résultat –

+1

Alternativement, vous pouvez utiliser' getFormattedValue() 'plutôt que' getValue() 'pour indiquer PHPExcel pour retourner le résultat pré-formaté selon le masque de format numérique qui a été défini dans le tableur lui-même –