我建立了一个系统,客户端使用电子表格将数据上传到该系统。它使用的是CSV,但其中包含的数据意味着上传不太可靠。因此,相反,我将使用Symfony2的PHPExcel和PHPExcel捆绑软件读取上载的Excel电子表格,并将此数据插入数据库。
使用PHPExcel有两个问题。首先是在上传的文件中将有一列,其中包含英国格式(DD / MM / YYYY)的日期。但是,显然,MySQL使用美国格式(YYYY-MM-DD)。所以我想做的是格式化一个特定的单元格以使用YYYY-MM-DD格式,而不是DD / MM / YYYY。
我遇到的第二个问题是,我想以最有效的方式将所有这些数据插入MySQL数据库。我不确定确切如何做到这一点。我知道在使用庞大的电子表格时,PHPExcel会遇到内存问题,因此,我想确保尽可能高效地保存到数据库。
到目前为止,由于我一直专注于读取Excel文件,因此这是我的代码:
$objPHPExcel = $this->get('phpexcel')->createPHPExcelObject($dir.$fileName);
$objPHPExcel->setActiveSheetIndex(0);
$row = $objPHPExcel->getActiveSheet()->getHighestRow()+1;
foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) {
echo 'Worksheet - ' , $worksheet->getTitle();
echo '<table>';
foreach ($worksheet->getRowIterator() as $row) {
//echo '<trRow number - ' , $row->getRowIndex() , EOL;
echo '<tr>';
$cellIterator = $row->getCellIterator();
$cellIterator->setIterateOnlyExistingCells(false); // Loop all cells, even if it is not set
foreach ($cellIterator as $cell) {
if (!is_null($cell)) {
echo '<td>'.$cell->getFormattedValue().'</td>';
}
}
echo '<tr>';
}
echo '</table>';
}
当尝试格式化单个单元格时,然后将代码更改为此:
$objPHPExcel = $this->get('phpexcel')->createPHPExcelObject($dir.$fileName);
foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) {
echo 'Worksheet - ' , $worksheet->getTitle();
echo '<table>';
foreach ($worksheet->getRowIterator() as $row) {
//echo '<trRow number - ' , $row->getRowIndex() , EOL;
echo '<tr>';
$cellIterator = $row->getCellIterator();
$cellIterator->setIterateOnlyExistingCells(false); // Loop all cells, even if it is not set
foreach ($cellIterator as $cell) {
if (!is_null($cell)) {
echo '<td>'.$cell[0]->getFormattedValue().'</td>';
echo '<td>'.$cell[1]->getFormattedValue().'</td>';
echo '<td>'.$cell[2]->getFormattedValue().'</td>';
echo '<td>'.$cell[3]->getFormattedValue().'</td>';
echo '<td>'.$cell[4]->getFormattedValue().'</td>';
echo '<td>'.$cell[5]->getFormattedValue().'</td>';
echo '<td>'.$cell[6]->getFormattedValue().'</td>';
echo '<td>'.$cell[7]->getFormattedValue().'</td>';
echo '<td>'.$cell[8]->getFormattedValue().'</td>';
echo '<td>'.$cell[9]->getFormattedValue().'</td>';
echo '<td>'.date('Y-m-d', strtotime($cell[10]->getFormattedValue())).'</td>';
echo '<td>'.$cell[11]->getFormattedValue().'</td>';
echo '<td>'.$cell[12]->getFormattedValue().'</td>';
echo '<td>'.$cell[13]->getFormattedValue().'</td>';
echo '<td>'.$cell[14]->getFormattedValue().'</td>';
echo '<td>'.$cell[15]->getFormattedValue().'</td>';
echo '<td>'.$cell[16]->getFormattedValue().'</td>';
echo '<td>'.$cell[17]->getFormattedValue().'</td>';
echo '<td>'.$cell[18]->getFormattedValue().'</td>';
echo '<td>'.$cell[19]->getFormattedValue().'</td>';
echo '<td>'.$cell[20]->getFormattedValue().'</td>';
echo '<td>'.$cell[21]->getFormattedValue().'</td>';
}
}
echo '<tr>';
}
echo '</table>';
}
但这在Apache2日志中产生了以下错误:
PHP致命错误:无法将类型为PHPExcel_Cell的对象用作数组
任何帮助,将不胜感激。
是的,$cell
不是数组,而是对象,因此使用$cell[0]
无效
替换整个代码块:
foreach ($cellIterator as $cell) {
if (!is_null($cell)) {
echo '<td>'.$cell[0]->getFormattedValue().'</td>';
echo '<td>'.$cell[1]->getFormattedValue().'</td>';
echo '<td>'.$cell[2]->getFormattedValue().'</td>';
echo '<td>'.$cell[3]->getFormattedValue().'</td>';
echo '<td>'.$cell[4]->getFormattedValue().'</td>';
echo '<td>'.$cell[5]->getFormattedValue().'</td>';
echo '<td>'.$cell[6]->getFormattedValue().'</td>';
echo '<td>'.$cell[7]->getFormattedValue().'</td>';
echo '<td>'.$cell[8]->getFormattedValue().'</td>';
echo '<td>'.$cell[9]->getFormattedValue().'</td>';
echo '<td>'.date('Y-m-d', strtotime($cell[10]->getFormattedValue())).'</td>';
echo '<td>'.$cell[11]->getFormattedValue().'</td>';
echo '<td>'.$cell[12]->getFormattedValue().'</td>';
echo '<td>'.$cell[13]->getFormattedValue().'</td>';
echo '<td>'.$cell[14]->getFormattedValue().'</td>';
echo '<td>'.$cell[15]->getFormattedValue().'</td>';
echo '<td>'.$cell[16]->getFormattedValue().'</td>';
echo '<td>'.$cell[17]->getFormattedValue().'</td>';
echo '<td>'.$cell[18]->getFormattedValue().'</td>';
echo '<td>'.$cell[19]->getFormattedValue().'</td>';
echo '<td>'.$cell[20]->getFormattedValue().'</td>';
echo '<td>'.$cell[21]->getFormattedValue().'</td>';
}
}
和
foreach ($cellIterator as $cell) {
if (!is_null($cell)) {
if ($cell->getColumn() == 'K') {
// The 10th column (column K) is a date that needs reformatting
$cellValue = date('Y-m-d', strtotime($cell->getFormattedValue()));
} else {
$cellValue = $cell->getFormattedValue();
}
echo '<td>'.$cellValue.'</td>';
}
}
使用PHPExcel自己的日期处理方法比依赖日期单元格的格式化值更好,因此
$cellValue = PHPExcel_Shared_Date::ExcelToPHPObject($cell->getValue())
->format('Y-m-d');
会比
$cellValue = date('Y-m-d', strtotime($cell->getFormattedValue()));
另外,如果其他列可能包含日期值,而不是检查特定列,则替换
if ($cell->getColumn() == 'K') {
// The 10th column (column K) is a date that needs reformatting
和
if (PHPExcel_Shared_Date::isDateTime($cell)) {
// Cell contains a date value that needs reformatting
因此,最终结果应类似于:
foreach ($cellIterator as $cell) {
if (!is_null($cell)) {
if (PHPExcel_Shared_Date::isDateTime($cell)) {
// Cell contains a date value that needs reformatting
$cellValue = PHPExcel_Shared_Date::ExcelToPHPObject($cell->getValue())
->format('Y-m-d');
} else {
$cellValue = $cell->getFormattedValue();
}
echo '<td>'.$cellValue.'</td>';
}
}
您可能还需要考虑if (!is_null($cell))
通过设置消除测试
$cellIterator->setIterateOnlyExistingCells(true);
最后一点,当您计划将所有这些行数据插入MySQL数据库时,请在迭代时为该行中的每个单元格构建一个数组,然后在每行的末尾进行插入。但是,由于数字值的格式值可能包含数千个分隔符,货币代码等(例如$ 123,456.789
),所以最好123456.789
使用getValue()
而不是getFormattedValue()
所有非日期值来获取原始值(),否则您可能会尝试将具有数千个分隔符的格式化值插入数据库表的FLOAT或INTEGER列时,SQL会出错
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句