【问题标题】:PHPExcel not reading complete number in XML cellPHPExcel没有读取XML单元格中的完整数字
【发布时间】:2016-10-05 18:00:42
【问题描述】:

我必须从第三方 XML 文件中提取数据。 对于一列包含逗号千位分隔符和点小数分隔符的数字,一切都很好。

在 Excel 或 OpenOffice 中通常表示为“10,000.00”的数字,PHPExcel 仅将其读取为“10”。

require_once dirname(__FILE__) . '/../Classes/PHPExcel/IOFactory.php';

$inputFileName = "myfile.xml";

/**  Identify the type of $inputFileName  **/
$inputFileType = PHPExcel_IOFactory::identify($inputFileName);

/**  Create a new Reader of the type that has been identified  **/
$objReader = PHPExcel_IOFactory::createReader($inputFileType);

/**  Load $inputFileName to a PHPExcel Object  **/
$objPHPExcel = $objReader->load($inputFileName);

$format = $objPHPExcel->getActiveSheet()->getStyle('C24')->getNumberFormat()->getFormatCode();

注意单元格的格式代码返回为General

尝试读取导致问题的单元格之一:

$getValue = $objPHPExcel->getActiveSheet()->getCellByColumnAndRow(2, 24)->getValue();
$getCalculatedValue = $objPHPExcel->getActiveSheet()->getCellByColumnAndRow(2, 24)->getCalculatedValue();
$getFormattedValue = $objPHPExcel->getActiveSheet()->getCellByColumnAndRow(2, 24)->getFormattedValue();

总是相同的值,在千位分隔符处截断:“10”而不是“10,000.00”

这里是xml文件的详细信息:

`<?xml version="1.0" encoding="UTF-8"?>
<?mso-application progid="Excel.Sheet"?>
<ss:Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:ext="http://fxcm.com/xslt/extension" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:of="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:html="http://www.w3.org/TR/REC-html40">`

风格定义

`<ss:Style ss:ID="cell_merged_top_odd_integer" ss:Parent="cell_merged_top_odd">
            <ss:NumberFormat ss:Format="#,##0"/>
</ss:Style>`

编号导致问题的单元格

`<ss:Cell ss:StyleID="cell_merged_top_odd_integer" ss:Index="3">
    <ss:Data ss:Type="Number">10,000.00</ss:Data>
</ss:Cell>`

手动解决问题的方法 当我从 OpenOffice 或 Excel 中保存文件时,弹出以下消息warning message OpenOffice,PHPExcel 最终按预期工作,显示为“10000”。

我不能让第三方更改其 XML 文件,也不能要求用户在将文件上传到我的网站之前重新保存文件。

你知道这里可能出现什么问题吗?

warning message OpenOffice

【问题讨论】:

    标签: xml numbers format phpexcel


    【解决方案1】:

    按照马克贝克的建议,我从源头上解决了问题,通过PHPExcel的过程来替换str_replace逗号。

    在文件Excel2003XML.php(识别文件类型后调用的第一个库)中,我修改了公共函数loadIntoExisting()如下:

    public function loadIntoExisting($pFilename, PHPExcel $objPHPExcel)
        {
        ...
        if (isset($cell->Data)) {
           $cellValue = $cellData = $cell->Data;
           //REPLACE THE COMMA
           $cellValue = str_replace(",", "", $cellValue);
        ...
        }
    }
    

    我意识到这会影响所有包含逗号的单元格,但到目前为止它解决了问题。 只有在以后检测到特定数字格式时,我才会考虑替换逗号。

    同时,感谢 Mark 的指导!

    【讨论】:

    • 您始终可以包含基于数据类型的if 测试,并且只有在它是数字时才执行 str_replace,这样可以防止在声明的字符串中替换逗号时出现问题
    • 很抱歉(在某些方面)我不能直接在 PHPExcel 中执行此操作,但验证和修复无效标记的额外开销不应该是库的责任,即旨在读取有效的电子表格文件格式
    【解决方案2】:

    不足为奇的是,PHPExcel 在读取实际上包含字符串值10,000.00 的数字时只读取10 Numberss:Typess:Data 应该包含一个数值,而不是格式化的字符串; IE。它应该包含10000 的实际数值,并且ss:Index 应该指向格式...因为XML 已经说过该值是数字,所以PHPExcel 正在尝试将其读取为数字,使用标准松散- 打字规则;并且由于, 不是数值,它只读取该非数字字符之前的数字

    【讨论】:

    • 我已经尝试预先更改单元格的数据类型
    • $cellStr = $worksheet-&gt;getCellByColumnAndRow(2, 24)-&gt;setDataType(PHPExcel_Cell_DataType::TYPE_STRING);
    • 问题不是你可以通过PHPExcel修改数据类型,而是读取xml的Reader;当 PHPExcel 可以看到数据时,它已经被 Reader 存储为10 .....这个文件是如何首先使用错误的数据类型/值创建的?
    • 基本上,您要求 PHPExcel 应该从 xml 文件中读取无效数据,并使其有效......真正的解决方案是从源头解决这个问题......你能做到的最好是修改 Reader 以在将其转换为浮点数之前从任何标识为类型编号的值中去除逗号
    • 原始XML文件由第三方软件自动生成;我几乎无法改变这一点。
    猜你喜欢
    • 1970-01-01
    • 2015-10-02
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多