如何获取通过PhpSpreadsheet创建的Excel文件大小?
当然可以获取用PhpSpreadsheet生成的Excel文件大小啦!这里有几种实用的实现方法,你可以根据自己的使用场景来选择:
方法一:保存到物理文件后获取大小
如果你的需求是先把生成的Excel保存到服务器本地,再获取大小,这种方式最直接:
use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; // 创建并填充表格数据 $spreadsheet = new Spreadsheet(); $activeSheet = $spreadsheet->getActiveSheet(); $activeSheet->setCellValue('A1', '测试数据'); $activeSheet->setCellValue('B1', 2024); // 定义保存路径 $savePath = './my_generated_excel.xlsx'; // 写入文件 $writer = new Xlsx($spreadsheet); $writer->save($savePath); // 获取文件大小(单位:字节) $fileSizeBytes = filesize($savePath); // 转换成更易读的KB/MB格式 $fileSizeKB = round($fileSizeBytes / 1024, 2); $fileSizeMB = round($fileSizeBytes / (1024*1024), 2); echo "文件大小:{$fileSizeBytes} 字节 / {$fileSizeKB} KB / {$fileSizeMB} MB"; // 记得释放内存,避免内存泄漏 $spreadsheet->disconnectWorksheets(); unset($spreadsheet);
方法二:内存中生成后直接获取大小(无需保存到本地)
如果不想生成物理文件,比如要直接把Excel输出给用户同时知道文件大小,可以用这两种方式:
子方法1:利用输出缓冲区捕获内容
use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; $spreadsheet = new Spreadsheet(); // ... 填充你的表格数据 ... // 开启输出缓冲区 ob_start(); $writer = new Xlsx($spreadsheet); $writer->save('php://output'); // 捕获缓冲区内容并关闭缓冲区 $excelContent = ob_get_clean(); // 内容长度就是文件大小(字节) $fileSize = strlen($excelContent); // 如果要输出到浏览器下载,可以加上这些Header header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); header("Content-Disposition: attachment;filename='download.xlsx'"); header('Content-Length: ' . $fileSize); echo $excelContent; // 释放内存 $spreadsheet->disconnectWorksheets(); unset($spreadsheet);
子方法2:使用内存流(php://temp)
use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; $spreadsheet = new Spreadsheet(); // ... 填充你的表格数据 ... // 打开一个内存流 $tempStream = fopen('php://temp', 'r+'); $writer = new Xlsx($spreadsheet); $writer->save($tempStream); // 移动到流的末尾获取长度 fseek($tempStream, 0, SEEK_END); $fileSize = ftell($tempStream); // 重置流指针到开头,方便后续读取内容 rewind($tempStream); echo "文件大小:{$fileSize} 字节"; // 后续可以读取流内容用于输出或其他操作 $excelContent = stream_get_contents($tempStream); fclose($tempStream); // 释放内存 $spreadsheet->disconnectWorksheets(); unset($spreadsheet);
小提示
filesize()、strlen()返回的都是字节数,你可以根据需求自行换算成KB、MB等单位;- 处理超大Excel文件时,内存流方式要注意PHP的内存限制,必要时可以调整
php.ini里的memory_limit参数。
内容的提问来源于stack exchange,提问作者rhog23
相关产品推荐
相关产品推荐

