我正在研究staff attendance
。用户可以上传考勤表,我的系统会向用户提供考勤表的查看,然后他可以将其保存到数据库。 excel表中的值在数据库中成功保存。
问题是用户可以以任何格式在Excel工作表的列中添加记录,但是当我使用PHP时,日期格式出错了。
e.g。
当用户在列中添加出勤日期时,列的格式为date
,当他可以保存时间时,它可能是数字格式,当用户上传此excel表时,日期预览消失在unix time stamp
。
以下是图片中的示例
您可以在上面的图片中看到日期正在以unix时间戳转换,时间以数字形式进出。
当用户可以上传Excel工作表时,我想要此视图。
希望您了解我的问题以及我想要的内容。
这是我的上传和查看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);
我也搜索了很多关于此事的内容并发现了类似setFormatCode
,PHPExcel_Style_NumberFormat::FORMAT_GENERAL
等内容,但它并不适用于我。我尽我所能。
所以请给我解决这个问题的方法。
注意:我不能限制用户转换列而不是添加数据。
希望你理解我的问题
答案 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 不 日期/时间的格式掩码