php将身份证号写入excel文件出现科学计数法问题解决

在 PHP 中生成 Excel 文件并处理身份证号时,通常使用 PHPExcel 或其继任者 PhpSpreadsheet 库。身份证号通常是以字符串形式存储的,但在某些情况下,如果身份证号很长(例如,超过 15 位数字),在 Excel 中可能会以科学计数法(如:4.77887E+17)显示。为了避免这种情况,我们需要确保在写入数据时将其作为文本格式处理。

以下是如何使用 PhpSpreadsheet 库来生成 Excel 文件,并确保身份证号不会以科学计数法显示:

  1. 安装 PhpSpreadsheet

    如果你还没有安装 PhpSpreadsheet,可以通过 Composer 安装:

    composer require phpoffice/phpspreadsheet

  2. 创建并保存 Excel 文件

    使用以下 PHP 代码来创建一个 Excel 文件,并确保身份证号作为文本格式写入:

    php 复制代码
    <?php
    
    use PhpOffice\PhpSpreadsheet\Spreadsheet;
    use think\facade\Filesystem;
    use think\facade\Request;
    use PhpOffice\PhpSpreadsheet\IOFactory;
    use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
    
    
    /**
     * 写入excel文件信息  并去除身份证科学计数法
     *
     * @param $data  文件内容
     * @param $title 文件名称前缀
     * @param $savePath 文件存储路径
     * @return string 生成的文件地址
     * @throws \PHPExcel_Exception
     * @throws \PHPExcel_Reader_Exception
     * @throws \PHPExcel_Writer_Exception
     */
    function writerXls($data, $title, $savePath='')
    {
        $objPHPExcel = new Spreadsheet();
        $filename = $title . '-' . date('YmdHis') . '.xls';
        $objPHPExcel->createSheet();
        $objPHPExcel->setActiveSheetIndex(0); //设置第一个工作表为活动工作表
        $objPHPExcel->getActiveSheet()->setTitle('sheet1'); //设置工作表名称
    
        $sheet = $objPHPExcel->getActiveSheet();
    
        foreach ($data as $k => $val) {
            foreach ($val as $i => $v) {
                // 将列索引转换为字母(如 1 -> A, 2 -> B, 3 -> C)
                $colLetter = Coordinate::stringFromColumnIndex($i + 1);
                // 动态生成单元格坐标(如 A1, B2, C3 等)
                $cellCoordinate = $colLetter . ($k + 1);
    
                // 如果是身份证号列,强制存储为文本
                if ($i >= 0) {//都存储为字符串型  此处可设置哪些列设置为字符串类型 判断$i列值即可
                    $sheet->setCellValueExplicit($cellCoordinate, $v, 'str');
                } else {
                    $sheet->setCellValue($cellCoordinate, $v);
                }
    
            }
        }
    
        foreach ($data[0] as $k => $val) {
            in_array($k, array(0, 6)) ? $objPHPExcel->getActiveSheet()->getColumnDimension(chr($k + 65))->setWidth(30) :
                $objPHPExcel->getActiveSheet()->getColumnDimension(chr($k + 65))->setWidth(25);
        }
    
        //输出
        $objWriter = IOFactory::createWriter($objPHPExcel, 'Xls');
    
        if(!$savePath){
             $savePath = '/runtime/storage/upload/error';
        }
        //创建文件夹
        if (!file_exists($savePath)) {
            mkdir($savePath,0777,true);
        }
    
        $objWriter->save($savePath . '/' . $filename);
        unset($objPHPExcel);
    
        return $savePath . '/' . $filename;
    }
    
    ?>
    
    <?php
        // 示例数据
        $data = [
            ['姓名', '身份证号', '手机号'],
            ['张三', '123456789012345678', '13800138000'],
            ['李四', '987654321098765432', '13900139000'],
        ];
        //调用生成xsl文件函数
        $excel_url = writerXls($data, 'id_numbers',  '/download/idcard');
    ?>
  3. 运行代码

    运行上述 PHP 脚本后,你将得到一个名为 id_numbers-20250313******.xls 的 Excel 文件,其中身份证号不会以科学计数法显示。每个身份证号都会被正确识别为文本格式。

通过以上步骤,你可以确保在生成的 Excel 文件中,所有的身份证号都不会被错误地以科学计数法显示。

相关推荐
BingoGo6 小时前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack6 小时前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
JaguarJack1 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo1 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
JaguarJack2 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
郑州光合科技余经理3 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
QQ5110082853 天前
python+springboot+django/flask的校园资料分享系统
spring boot·python·django·flask·node.js·php
WeiXin_DZbishe3 天前
基于django在线音乐数据采集的设计与实现-计算机毕设 附源码 22647
javascript·spring boot·mysql·django·node.js·php·html5
LAM LAB3 天前
【VBA】Excel指定单元格范围内字体设置样式,处理导出课表单元格
excel·vba
在这habit之下3 天前
Keepalived学习总结
excel