在PHP中转换excelsheet列格式无法正常工作

时间:2017-09-17 15:56:21

标签: php excel codeigniter phpexcel

我正在研究staff attendance。用户可以上传考勤表,我的系统会向用户提供考勤表的查看,然后他可以将其保存到数据库。 excel表中的值在数据库中成功保存。

问题是用户可以以任何格式在Excel工作表的列中添加记录,但是当我使用PHP时,日期格式出错了。

e.g。 当用户在列中添加出勤日期时,列的格式为date,当他可以保存时间时,它可能是数字格式,当用户上传此excel表时,日期预览消失在unix time stamp

  

以下是图片中的示例

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

    1. excel表中的进出时间 enter image description here

    2. 当用户访问网站并上传此Excel工作表enter image description here

    3. 然后打开一个弹出窗口 enter image description here

    4. 然后用户浏览Excel工作表然后显示excel工作表视图,查看错误 enter image description here

  2. 您可以在上面的图片中看到日期正在以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等内容,但它并不适用于我。我尽我所能。

    所以请给我解决这个问题的方法。

      

    注意:我不能限制用户转换列而不是添加数据。

    希望你理解我的问题

1 个答案:

答案 0 :(得分:2)

MS Excel将日期存储为浮点值,序列化时间戳,自1900年1月1日(或1904年1月1日,如果文件使用Mac日历)以来的天数,并且它是单元格的数字格式掩码将其显示为格式化日期。

PHPExcel提供了一系列用于在MS Exce序列化时间戳和unix时间戳或PHP DateTime对象之间进行转换的方法

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

将MS Excel时间戳转换为Unix时间戳

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

将MS Excel时间戳转换为PHP DateTime对象

然后您可以使用PHP的标准date()函数或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 日期/时间的格式掩码