在业务开发的过程中,由于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 PhpOfficePhpSpreadsheetSpreadsheet; use PhpOfficePhpSpreadsheetWriterXlsx; // 创建一个新的 Excel 对象 $spreadsheet = new Spreadsheet(); // 获取工作表 $sheet = $spreadsheet->getActiveSheet(); // 将数据设为字符串类型 $data = "12345678901234567890"; // 设置单元格的值为字符串 $sheet->setCellValueExplicit('A1', $data, PhpOfficePhpSpreadsheetCellDataType::TYPE_STRING); // 导出 Excel 文件 $writer = new Xlsx($spreadsheet); $writer->save('exported_file.xlsx'); ?>
2、导入样本设置数字列获取格式化后的值
<?php require 'vendor/autoload.php'; // 请确保已经安装了 PhpSpreadsheet,并加载其自动加载文件 use PhpOfficePhpSpreadsheetIOFactory; use PhpOfficePhpSpreadsheetReaderXlsx 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 "; ?>