【发布时间】:2019-12-18 14:09:10
【问题描述】:
我有一个页面,其中包含航班费用、酒店住宿费用和总费用的行的简单概述,它使用 phpspreadsheet 添加了 xlsx 导出。 费用需要以欧元显示,格式为:
€ 1120,46
或者
€ 1.120,46
无论哪种方式都可以。
航班费用的值是可变的,并且来自数据库,以十进制 (6,2) 形式来自早期的用户输入。酒店费用为固定金额 (76) * 天数(基于航班日期)。
我还在电子表格中使用 sum 函数来添加列的总数,但其余的计算是通过 PHP 完成的,并作为单元格的值添加。
对于带有数字的单元格,使用:
...->setFormatCode(PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_CURRENCY_EUR);
或“FORMAT_CURRENCY_EUR_SIMPLE”,结果相同,但数字后面的欧元符号,不是我需要的。所以我用这个:
...->setFormatCode('[$€ ]#,##0.00_-');
在 xlsx 导出中,它适用于不带小数的数字。数字显示正确,求和功能也有效,包括正确位置的€符号。
但是当数字包含小数时,它会停止工作。
如果我添加像“120.45”这样的数字,xlsx 导出显示“120.45.0”并且 Excel 不会报告任何问题,而且 sum 函数不会计算任何内容。
如果我添加像“120,45”这样的数字,xlsx 导出显示“120,45”,但 Excel 报告它不是数字,并且 sum 函数不会计算任何内容。然后,您可以单击 Excel 中的警告三角形并将其设为数字。此时,该值通过 sum 函数添加到总数中。
这两个选项也未能添加欧元符号。
我尝试在 PHP 端使用这些类型的格式添加数字:
$sheet->setCellValue('S5, number_format ($price, 2, ",", ""));
$sheet->setCellValue('S5, number_format ($price, 2, ".", ""));
$sheet->setCellValue('S5, str_replace(',','.',$price));
$sheet->setCellValue('S5, str_replace('.',',',$price));
这对十进制值产生了与上述相同的结果,并且'number_format(...)' 使非十进制值也作为值,因此没有数字和求和函数正常工作。
你知道这可能是什么吗?
【问题讨论】:
-
可能 phpspreadsheet 只支持没有千位分隔符的数值转换(文档确实说:数字字符串将转换为数字,这样会具有误导性) - 即您是否尝试在导出之前使用 php 转换您的数字字符串(例如浮动)?
-
我没有在添加到导出的值中使用千位分隔符。或者你建议我应该使用它们吗?数字
-
尝试使用这个: $sheet->setCellValueExplicit('V5, number_format ($price, 2, ",", ""), DataType::TYPE_NUMERIC);有点作品......因为它删除了小数。所以不是预期的效果,但现在公式正在起作用。使用“。”来执行此操作作为十进制分隔符,使用额外的 '.' 产生与以前相同的结果,现在创建 '4.556.0' 而不是 '4556,45' 或 '€ 4.556,45' 并再次破坏一切。打开 xlsx 时也会提示错误。
-
作为一种解决方法,我删除了 setFormatCode 和公式。然后将数据类型设置为字符串并手动添加€-sign infront...这样excel至少会显示正确的数字。
标签: php phpspreadsheet