在Symfony2中使用PHPExcel读取Excel文件,编辑一个单元格的内容,然后保存到数据库

麦克伯克

我建立了一个系统,客户端使用电子表格将数据上传到该系统。它使用的是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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Symfony2中使用PHPExcel读取Excel文件,编辑一个单元格的内容,然后保存到数据库

来自分类Dev

在Symfony2中使用2个数据库和一个实体管理器

来自分类Dev

将已编辑的单元格从JTable保存到数据库

来自分类Dev

将空白Excel单元格保存到Rails Postgres数据库

来自分类Dev

在Android中更改数据库行中的一个单元格

来自分类Dev

onClick HTML表格单元格保存到django数据库中

来自分类Dev

当我编辑一个单元格并按 ENTER 时,我想更新数据库

来自分类Dev

如何在R Studio AND SQL中使用限制器将数据中的一个单元格拆分为2个单元格

来自分类Dev

如何在Excel中使用数据透视表对一个单元格中的多个值进行计数?

来自分类Dev

一个人可以在Symfony2中的Doctrine迁移中使用不同的数据库凭据吗?

来自分类Dev

只有一个参数正在保存到数据库中的 2 个

来自分类Dev

将一组数据保存到一个单元格

来自分类Dev

PHPexcel保存到CSV链接单元格到另一个工作表是空的

来自分类Dev

使用ajax时无法将数据(下拉值)保存到symfony2中的数据库

来自分类Dev

使用Python读取CSV文件行中的最后一个非空单元格

来自分类Dev

从PHP检索数据库中的数据时,如何在一个表中连接2个单元格?

来自分类Dev

将请求字符串持久保存到symfony2中的数据库失败?

来自分类Dev

在Swift中另一个文件中使用单元格

来自分类Dev

查找范围内的空单元格,然后返回与空单元格在同一行中的另一个单元格的内容

来自分类Dev

Excel-在一个单元格中定义一个公式,以在具有不同输入(如函数)的其他单元格中使用

来自分类Dev

Symfony 2:如何在PHPExcel中读取Excel文件内容

来自分类Dev

在Excel中搜索列中另一个单元格的内容,并返回单元格值

来自分类Dev

从熊猫数据框中读取5行,然后将其插入另一熊猫数据框中的每行一个单元格中

来自分类Dev

ui网格将更新的单元格数据保存到数据库

来自分类Dev

Excel VBA宏将多个excel中使用的单元格复制到一个excel中

来自分类Dev

Excel VBA - 将单元格的内容添加到文件名的第一个空格中

来自分类Dev

Excel –检查一个主单元格中是否存在多个单元格的内容

来自分类Dev

当另一个单元格在Excel中写入某些内容时,如何更改单元格的颜色?

来自分类Dev

Excel VBA-如何在一个单元格中标识年(日期),然后检查另一个单元格中的数据,然后计数

Related 相关文章

  1. 1

    在Symfony2中使用PHPExcel读取Excel文件,编辑一个单元格的内容,然后保存到数据库

  2. 2

    在Symfony2中使用2个数据库和一个实体管理器

  3. 3

    将已编辑的单元格从JTable保存到数据库

  4. 4

    将空白Excel单元格保存到Rails Postgres数据库

  5. 5

    在Android中更改数据库行中的一个单元格

  6. 6

    onClick HTML表格单元格保存到django数据库中

  7. 7

    当我编辑一个单元格并按 ENTER 时,我想更新数据库

  8. 8

    如何在R Studio AND SQL中使用限制器将数据中的一个单元格拆分为2个单元格

  9. 9

    如何在Excel中使用数据透视表对一个单元格中的多个值进行计数?

  10. 10

    一个人可以在Symfony2中的Doctrine迁移中使用不同的数据库凭据吗?

  11. 11

    只有一个参数正在保存到数据库中的 2 个

  12. 12

    将一组数据保存到一个单元格

  13. 13

    PHPexcel保存到CSV链接单元格到另一个工作表是空的

  14. 14

    使用ajax时无法将数据(下拉值)保存到symfony2中的数据库

  15. 15

    使用Python读取CSV文件行中的最后一个非空单元格

  16. 16

    从PHP检索数据库中的数据时,如何在一个表中连接2个单元格?

  17. 17

    将请求字符串持久保存到symfony2中的数据库失败?

  18. 18

    在Swift中另一个文件中使用单元格

  19. 19

    查找范围内的空单元格,然后返回与空单元格在同一行中的另一个单元格的内容

  20. 20

    Excel-在一个单元格中定义一个公式,以在具有不同输入(如函数)的其他单元格中使用

  21. 21

    Symfony 2:如何在PHPExcel中读取Excel文件内容

  22. 22

    在Excel中搜索列中另一个单元格的内容,并返回单元格值

  23. 23

    从熊猫数据框中读取5行,然后将其插入另一熊猫数据框中的每行一个单元格中

  24. 24

    ui网格将更新的单元格数据保存到数据库

  25. 25

    Excel VBA宏将多个excel中使用的单元格复制到一个excel中

  26. 26

    Excel VBA - 将单元格的内容添加到文件名的第一个空格中

  27. 27

    Excel –检查一个主单元格中是否存在多个单元格的内容

  28. 28

    当另一个单元格在Excel中写入某些内容时,如何更改单元格的颜色?

  29. 29

    Excel VBA-如何在一个单元格中标识年(日期),然后检查另一个单元格中的数据,然后计数

热门标签

归档