[PHP]Laravel中使用PhpOffice精度问题

文章讨论了在业务开发中使用SAAS系统时遇到的Excel导出和导入长数字问题,通过调整PhpOffice的PHPExcel库,提出将长数字列设置为文本显示导出,以及导入时启用只读模式并获取格式化值的解决方案。
摘要由CSDN通过智能技术生成

在这里插入图片描述

在业务开发的过程中,由于SAAS系统推进度的过程中会存在大量使用表格的情况,此时PhpOffice不可或缺;

最近遇到的问题,由于某一列数据存在长达20位的数字(客户录入的纯数字),正常导出Excel的时候,就会变成科学计数法展示;
我们导出完Excel还有需要需要上传再修改信息,这时候上传读取该列数据,又存在科学计数法展示,更新入库就出错;

两个问题:

  • 导出Excel列的数据要正常数字展示;(当导出列该数据数字正常展示,导入Excel也会变为科学计数法,还存在精度问题 )
  • 导入Excel列的数据要正常数字读取并且更新成功;

解决方案:

  • 导出Excel强制将长数字列改为文本展示;(setCellValueExplicit)
  • 导入Excel开启只读模式,并且设置读取该列格式化的值;(getFormattedValue)

列举下语言插件环境

  • Laravel Framework 8.83.14
  • PHP版本: 7.3.27
  • “phpoffice/phpspreadsheet”: “^1.20”

代码演示

1、导出Excel设置数字列强转文本

<?php
require 'vendor/autoload.php'; // 请确保已经安装了 PhpSpreadsheet,并加载其自动加载文件

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

// 创建一个新的 Excel 对象
$spreadsheet = new Spreadsheet();

// 获取工作表
$sheet = $spreadsheet->getActiveSheet();

// 将数据设为字符串类型
$data = "12345678901234567890";

// 设置单元格的值为字符串
$sheet->setCellValueExplicit('A1', $data, \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);

// 导出 Excel 文件
$writer = new Xlsx($spreadsheet);
$writer->save('exported_file.xlsx');

?>

2、导入样本设置数字列获取格式化后的值

<?php
require 'vendor/autoload.php'; // 请确保已经安装了 PhpSpreadsheet,并加载其自动加载文件

use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Reader\Xlsx as XlsxReader;

$reader = new XlsxReader();
$reader->setReadDataOnly(true);

// 读取 Excel 文件
$spreadsheet = IOFactory::load('your_excel_file.xlsx');

// 获取第一个工作表
$worksheet = $spreadsheet->getActiveSheet();

// 获取单元格的格式化值
$cellFormattedValue = $worksheet->getCell('A1')->getFormattedValue();

// 输出格式化后的值
echo "Formatted Value: $cellFormattedValue\n";
?>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ifanatic

觉得对您有用,可以友情打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值