2017-09-17 20 views
1

我上staff attendance工作。用戶可以上傳考勤表,我的系統會出席Excel表單的用戶的視圖,然後他就可以將它保存到數據庫中。從Excel工作表中的值在數據庫成功保存。轉換excelsheet列格式在PHP不工作

問題是,用戶可以在Excel工作表的列添加到任何格式的記錄,但是當我在PHP中得到的日期格式出錯。

例如 當用戶在列中添加起止日期,列的格式是date,當他可以在節省出來的時間也可能是數字格式,當用戶上傳此Excel工作表,日期預覽中unix time stamp不見了。

以下是在圖像的例子

  1. 日期在Excel工作表 enter image description here

  2. 時間和縮小在Excel工作表 enter image description here

  3. 當用戶進入網站,上傳此Excel工作表 enter image description here

  4. 然後打開一個彈出窗口 enter image description here

  5. 然後用戶瀏覽Excel工作表,然後我展示了Excel表視圖,在觀看錯 enter image description here

您可以在上圖中看到日期正在轉換爲unix時間戳和時間輸入和輸出數字。

我想要這個視圖,當用戶可以上傳Excel表。

enter image description here

所以希望你明白我的問題,我想要什麼。

這是我上傳和查看Excel工作表代碼:

$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); 

我也搜索了很多關於這一點,發現像這樣setFormatCodePHPExcel_Style_NumberFormat::FORMAT_GENERAL等,但它不是爲我工作。我盡力了。

所以,請給我這個問題的解決方案。

注:我不能限制他轉換列,比添加數據的用戶。

希望你明白我的問題

回答

2

MS Excel存儲日期爲浮點值,序列化的時間戳,天自1900年1月1日(或1904年1月1日,如果該文件是使用Mac日曆)的數量,並且它是單元格的數字格式掩碼,將其顯示爲格式化的日期。

PHPExcel提供了一系列的方法爲MS EXCE串行化時間戳和UNIX時間戳或PHP日期時間之間轉換對象

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

將MS Excel的時間戳轉換爲Unix時間戳

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

將將MS Excel時間戳轉換爲PHP日期時間對象

然後您可以使用PHP的標準date() f或者使用DateTime對象的format()方法來設置該值的格式。

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

將轉換或者Unix時間戳或PHPP DateTime對象到MS Excel的系列化時間戳值

如果你想改變一個MS Excel的系列化時間戳顯示在電子表格的方式,那麼你需要使用對應得的日期/時間掩碼爲Excel格式面具.... PHPExcel_Style_NumberFormat :: FORMAT_GENERAL是格式掩碼的日期/時間

+0

請你能告訴我,我怎麼能做到這一點的我的代碼......因爲我得到了所有專欄和動態行 – deemi

+1

如您所知,哪些單元格包含日期,然後使用'$ objWorksheet-> getCellByColumnAndRow($ col,$ row) - > getValue()'檢索單元格值,並將結果作爲參數傳遞給'PHPExcel_Shared_Date :: ExcelToPHPObject()',檢索結果,然後使用DateTime對象的'format()'方法告訴它你想如何顯示結果 –

+1

或者,你可以使用'getFormattedValue()'而不是'getValue()'來告訴PHPExcel返回根據電子表格中已設置的數字格式掩碼預格式化的結果 –