fputcsv

1.a是從結尾添加,w是從頭添加,不知爲什麽 這樣寫最後一行會是錯的,似乎不會自動添加換行符,只有在最後以行寫上"\r\n",才會正確.

  $fp = sugar_fopen('file.csv','w');
  fputcsv($fp, $this->_currentRow);
  fwrite($fp,"\r\n");
  fclose($fp);

转载于:https://www.cnblogs.com/sui84/p/6777137.html

public function streamConvertExcelToCsv(string $ excelPath, string $ csvPath): void { $ reader = IOFactory::createReader('Xlsx'); $ reader->setReadDataOnly(true); $ reader->setReadEmptyCells(false); // 获取工作表信息 $ worksheetInfo = $ reader->listWorksheetInfo($ excelPath); $ totalRows = $ worksheetInfo[0]['totalRows']; $ totalColumns = $ worksheetInfo[0]['totalColumns']; // 打开CSV文件句柄 $ csvHandle = fopen($ csvPath, 'w'); // 分块读取(每块5000行) $ chunkSize = 5000; $ chunkFilter = new ChunkReadFilter(); $ reader->setReadFilter($ chunkFilter); // 写入标题行(如果需要) $ chunkFilter->setRows(1, 1); $ spreadsheet = $ reader->load($ excelPath); $ row = $ spreadsheet->getActiveSheet()->toArray()[0]; fputcsv($ csvHandle, $ row); $ spreadsheet->disconnectWorksheets(); unset($ spreadsheet); // 分块处理数据 for ($ startRow = 2; $ startRow <= $ totalRows; $ startRow += $ chunkSize) { $ endRow = min($ startRow + $ chunkSize - 1, $ totalRows); $ chunkFilter->setRows($ startRow, $ chunkSize); // 加载当前块 $ spreadsheet = $ reader->load($ excelPath); $ sheet = $ spreadsheet->getActiveSheet(); // 写入CSV for ($ row = $ startRow; $ row <= $ endRow; $ row++) { $ rowData = $ sheet->rangeToArray('A'.$ row.':'.$ this->getColumnLetter($ totalColumns).$ row)[0]; fputcsv($ csvHandle, $ rowData); } // 释放内存 $ spreadsheet->disconnectWorksheets(); unset($ spreadsheet); gc_collect_cycles(); // 进度显示(可选) $ progress = round(($ endRow / $ totalRows) * 100, 2); echo "转换进度: {$ progress}%\n"; } fclose($ csvHandle); } private function getColumnLetter(int $ colIndex): string { $ letter = ''; while ($ colIndex >= 0) { $ letter = chr(65 + ($ colIndex % 26)) . $ letter; $ colIndex = (int)($ colIndex / 26) - 1; } return $ letter; } 我在考虑您提供的最终的方案里面将excel表格转换为了csv格式,如果100万数据excel表格就好几百M 很耗时间,所以我在想能不能采用流式分块的形式去读取excel表格数据呢?然后再结合批量插入,这样是不是更快一些呢?
最新发布
07-07
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值