使用PhpSpreadsheet生成长数字文本时遇格式及值错误求助
用PhpSpreadsheet把长数字准确存成Excel文本的解决办法
问题根源
你碰到的两个问题:数值末位变0、显示成科学计数法,本质是两个原因:
- 数值精度丢失:PHP处理超大数字时,如果不小心把字符串转成数字类型,会自动转成浮点数,导致末尾精度丢失;
- Excel默认格式:长数字会被Excel自动识别为数字,用科学计数法显示。
靠谱解决步骤
要同时保证数值准确+文本格式显示,得两步一起做:
确保传给单元格的是纯字符串
用setCellValueExplicit的时候,第二个参数必须是字符串(加引号或者强制转成字符串),别传数字。比如:// 直接传带引号的字符串字面量,避免PHP转成浮点数 $sheet->setCellValueExplicit('G5', '8899900000083365', \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);如果数字来自变量,记得先转成字符串:
(string)$yourLongNumber,别让PHP自动处理。给单元格设置文本格式
@
光设置单元格类型不够,得让Excel也知道这是文本,所以要设置格式代码:$sheet->getStyle('G5')->getNumberFormat()->setFormatCode('@');
为啥之前的方法不行
- 方法1失败:你可能没传字符串,直接传了数字
8899900000083365,PHP把它转成浮点数时丢了精度,存到Excel里自然是错的; - 方法2失败:
#是数字格式,Excel还是把内容当数字处理,超大数字照样丢精度; - 方法3失败:只改了格式,但单元格里的内容还是被当成数字解析了,所以还是会显示成科学计数法。
完整示例代码
use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; use PhpOffice\PhpSpreadsheet\Cell\DataType; $spreadsheet = new Spreadsheet(); $sheet = $spreadsheet->getActiveSheet(); // 先把字符串内容写入单元格,指定为文本类型 $sheet->setCellValueExplicit('G5', '8899900000083365', DataType::TYPE_STRING); // 再设置单元格为文本格式 $sheet->getStyle('G5')->getNumberFormat()->setFormatCode('@'); // 保存文件 $writer = new Xlsx($spreadsheet); $writer->save('test.xlsx');
内容的提问来源于stack exchange,提问作者Ares
相关产品推荐
相关产品推荐

