当前位置: 首页 > news >正文

记录一次使用thinkphp使用PhpSpreadsheet扩展导出数据,解决身份证号码等信息科学计数法问题处理

PhpSpreadsheet官网

PhpSpreadsheet安装

composer require phpoffice/phpspreadsheet

使用composer安装时一定要下载php对应的版本,下载之前使用php -v检查当前php版本

简单使用

<?php
require 'vendor/autoload.php';use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;// 创建Spreadsheet对象
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();// 动态表头
$headers = ['ID', '姓名', '性别', '职业', '新增字段', '新增字段2', '新增字段3', '新增字段4', '新增字段5', '新增字段6', '新增字段7', '新增字段8', '新增字段9', '新增字段10', '新增字段11', '新增字段12', '新增字段13', '新增字段14', '新增字段15', '新增字段16', '新增字段17', '新增字段18', '新增字段19', '新增字段20', '新增字段21', '新增字段22', '新增字段23', '新增字段24', '新增字段25', '新增字段26', '新增字段27', '新增字段28', '新增字段29', '新增字段30'];// 动态数据
$data = [[1, '李云龙', '男', '军人', '1427141544485854854485', '字段1', '字段2', '字段3', '字段4', '字段5', '字段6', '字段7', '字段8', '字段9', '字段10', '字段11', '字段12', '字段13', '字段14', '字段15', '字段16', '字段17', '字段18', '字段19', '字段20', '字段21', '字段22', '字段23', '字段24', '字段25', '字段26', '字段27', '字段28', '字段29', '字段30'],[2, '苏乞儿', '男', '乞丐', '值2', '字段1', '字段2', '字段3', '字段4', '字段5', '字段6', '字段7', '字段8', '字段9', '字段10', '字段11', '字段12', '字段13', '字段14', '字段15', '字段16', '字段17', '字段18', '字段19', '字段20', '字段21', '字段22', '字段23', '字段24', '字段25', '字段26', '字段27', '字段28', '字段29', '字段30'],[3, '周星驰', '男', '导演', '值3', '字段1', '字段2', '字段3', '字段4', '字段5', '字段6', '字段7', '字段8', '字段9', '字段10', '字段11', '字段12', '字段13', '字段14', '字段15', '字段16', '字段17', '字段18', '字段19', '字段20', '字段21', '字段22', '字段23', '字段24', '字段25', '字段26', '字段27', '字段28', '字段29', '字段30'],[4, '林允儿', '女', '演员', '值4', '字段1', '字段2', '字段3', '字段4', '字段5', '字段6', '字段7', '字段8', '字段9', '字段10', '字段11', '字段12', '字段13', '字段14', '字段15', '字段16', '字段17', '字段18', '字段19', '字段20', '字段21', '字段22', '字段23', '字段24', '字段25', '字段26', '字段27', '字段28', '字段29', '字段30'],
];// 设置表头和数据
$allData = array_merge([$headers], $data);
$sheet->fromArray($allData, null, 'A1');// 设置表头样式
$styleArray = ['alignment' => ['horizontal' => 'center','vertical' => 'center',],'font' => ['name' => '宋体',// 'bold' => true,// 'size' => 22]
];$headerRange = 'A1:' . chr(ord('A') + count($headers) - 1) . '1';
$sheet->getStyle($headerRange)->getNumberFormat()  // 先获取NumberFormat对象->setFormatCode(NumberFormat::FORMAT_TEXT)->applyFromArray($styleArray);// 保存文件
$writer = new Xlsx($spreadsheet);
$writer->save('dynamic_example.xlsx');?>

在thinkphp项目中使用

// 如果将该扩展直接安装到thinkphp6项目中提示找不到Class 'PhpOffice\\PhpSpreadsheet\\Spreadsheet' not found,将该扩展放置项目根目录的extend文件夹中(参考下图),随后打开下行代码
// require_once app()->getRootPath() . 'extend/PhpSpreadsheet/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
use PhpOffice\PhpSpreadsheet\Cell\DataType;public function export_data($data){// 获取所有要查询的字段和名称$header_arr = [];$fields_arr = [];foreach($data['export_data'] as $key=>$val){array_push($header_arr, $val['label']);array_push($fields_arr, $val['field']);} // 文件存储目录$public = app()->getRootPath().'public/';$path = 'uploads/export_data/';if(!file_exists($path)){mkdir($path, 0777);}// 文件名$res_file = $file_name . '_all.xlsx';$finalFile = $public . $path . $res_file;$currentRow = 1; // 当前写入行$spreadsheet = new Spreadsheet();$sheet = $spreadsheet->getActiveSheet();// 3. 计算列范围 - 安全方法$lastColumn = Coordinate::stringFromColumnIndex(count($header_arr));$headerRange = 'A:' . $lastColumn;// $sheet->setTitle('Sheet1');// 如果是第一次运行,创建新文件并写入头部if (!file_exists($finalFile)) {$spreadsheet = new Spreadsheet();$sheet = $spreadsheet->getActiveSheet();$sheet->getStyle($headerRange)->getNumberFormat()->setFormatCode(NumberFormat::FORMAT_TEXT);// 写入头部$sheet->fromArray([$header_arr], null, 'A1');$currentRow = 2;// 设置表头样式$styleArray = ['alignment' => ['horizontal' => 'center','vertical' => 'center',],// 'font' => [// 'name' => '宋体',// 'bold' => true,// 'size' => 22// ]];// $headerRange = 'A1:' . chr(ord('A') + count($header_arr) - 1) . '1';$sheet->getStyle($headerRange)->applyFromArray($styleArray);// 保存文件$writer = new Xlsx($spreadsheet);$writer->save($finalFile);// echo "创建新文件并写入头部\n";}// 分批导出并追加数据$totalBatches = 3; // 假设总共3批for ($batch = 1; $batch <= $totalBatches; $batch++) {// 加载现有文件$reader = IOFactory::createReader('Xlsx');$spreadsheet = $reader->load($finalFile);$sheet = $spreadsheet->getActiveSheet();// 获取当前最后一行$currentRow = $sheet->getHighestRow() + 1;// 生成测试数据 - 实际应用中从数据库获取$data = [];$perBatch = 10000;$start = ($batch - 1) * $perBatch + 1;$end = $batch * $perBatch;for ($i = $start; $i <= $end; $i++) {$data[] = [$i,"姓名{$i}",($i % 2) ? '男' : '女',"职业{$i}"];}// 追加数据$stringContent = array_map(function($row) use ($sheet, $currentRow) {return array_map(function($cell) {return (string)$cell; // 只返回值,不返回类型}, $row);}, $data);// 先设置数据$sheet->fromArray($stringContent, null, "A{$currentRow}");// 部分列强制文本格式$forceTextColumns = ['CI', 'AQ', 'AH']; // 需要强制文本的列for ($row = $currentRow; $row <= $highestRow; $row++) {foreach ($forceTextColumns as $col) {$cell = $sheet->getCell($col.$row);$cell->setValueExplicit($cell->getValue(),DataType::TYPE_STRING);$sheet->getStyle($col.$row)->getNumberFormat()->setFormatCode('@');}}// 保存文件$writer = new Xlsx($spreadsheet);$writer->save($finalFile);echo "批次 {$batch} 数据已追加到 {$finalFile} (行 {$currentRow}-" . ($currentRow + count($data) - 1) . ")\n";}echo "所有数据已导出到 {$finalFile}\n";
}

在这里插入图片描述

相关文章:

  • 【MySQL】存储引擎 - FEDERATED详解
  • 笔记,麦克风的灵敏度
  • allure生成测试报告(搭配Pytest、allure-pytest)
  • 遗传算法(GA)
  • 第十六章,网络型攻击防范技术
  • 传统数据展示 vs 可视化:谁更打动人心?
  • TCP套接字通信核心要点
  • 多线程面试题总结
  • ⭐️⭐️⭐️【课时1:大模型是什么?】学习总结 ⭐️⭐️⭐️ for《大模型Clouder认证:基于百炼平台构建智能体应用》认证
  • NetSuite Saved Search如何在Criteria中利用Expressions处理不同Transaction之间的关系?
  • 【深度学习新浪潮】智能追焦技术全解析:从算法到设备应用
  • 集群/微服务/分布式
  • 芋道框架 账号未登录、租户标识未传递
  • 华为云Flexus+DeepSeek征文|从开通到应用:华为云DeepSeek-V3/R1商用服务深度体验
  • 七、Hadoop 历史追踪、数据安全阀与 MapReduce初体验
  • 密码学--AES
  • 数据结构【二叉搜索树(BST)】
  • C语言| sizeof(array)占多少字节
  • K8S - GitLab CI 自动化构建镜像入门
  • 打造网络安全堡垒,企业如何应对DDoS、CC、XSS和ARP攻击
  • 欧洲史上最严重停电事故敲响警钟:能源转型如何保证电网稳定?
  • 牛市早报|国家发改委:今年将推出约3万亿元优质项目,支持民营企业参与
  • 高盛上调A股未来12个月目标点位,沪深300指数潜在回报15%
  • 阿森纳被打得毫无脾气,回天无力的阿尔特塔只剩嘴硬
  • 深入贯彻中央八项规定精神学习教育中央第七指导组指导督导中国船舶集团见面会召开
  • 罗氏制药全新生物制药生产基地投资项目在沪启动:预计投资20.4亿元,2031年投产