0
$objReader = PHPExcel_IOFactory::createReader('CSV');

$objPHPExcel = $objReader->load($fileName);
$worksheet = $objPHPExcel->getActiveSheet();
$rowCount = 0;
foreach ($worksheet->getRowIterator() as $row) {
    if ($rowCount != 0){
        $sql_text = 'INSERT INTO test.data("A", "B", "C", "D", "E", "F") VALUES (';
        $cellIterator = $row->getCellIterator();
        $cellIterator->setIterateOnlyExistingCells(false); // Loop all cells, even if it is not set
        foreach ($cellIterator as $cell) {
            if (!is_null($cell)) {
                $sql_text.= "'" .pg_escape_string($cell->getValue()) ."',";
            }
        }
        $sql_text.=" '$Id";
        $query->setSql($sql_text);
        $results = json_decode($query->exec(true), true);
    }
    $rowCount++
}

这里第一列(带有标题 A)总是缺少前导零。A 列可能有也可能没有零,它可以占用的最大字符数是 32。

4

1 回答 1

0

PHPExcel 采用与 MS Excel 本身类似的方法......如果您在单元格中输入数字,则将其视为数字(整数或浮点数)。即使您输入前导零,它们也不是数字本身的一部分,因此会被忽略。您必须明确告诉 MS Excel 将带有前导零的数值视为字符串而不是数字,方法是为其加上引号(CSV 没有格式化机制,因此无法应用引号前缀)或应用格式掩码用前导零显示它 - 尽管在内部它仍然是一个数字 - 而且 CSV 没有格式,所以这不是一个选项。

PHPExcel 通过一个称为“值绑定器”的代码块来模拟这种 Excel 行为,该代码块在每个值存储在单元格中时对其进行测试,并将其转换为适当的数据类型......这是你的前导零被“剥离”和value 被转换/转换为标准的 PHP 整数或浮点数。还提供了另一种“高级值绑定器”作为处理更复杂值的选项,例如“2/4”之类的分数,并将它们转换为 0.5,并在单元格上使用适当的格式掩码以将显示保留为分数。


这为您提供了两种选择。

首先,您可以编写自己的 Binder 来测试前导零的值并将它们视为字符串,而不是将它们转换为数字,覆盖默认行为,其方式类似于高级值绑定器处理分数的方式。

另一种方法是修改foreach ($cellIterator as $cell) {循环内的代码,将它们转换回带有前导零的字符串。

于 2015-12-04T09:17:54.653 回答