如何用PHP将CSV文件中Style列非空值填充至同列空单元格
解决CSV文件Style列空值自动填充问题
我看了你当前的代码,里面处理空值的那行$data = $data[5] ?: $data[5];其实没有实际作用——它只是把值赋给自己,完全没实现你要的“当Style列值变化时填充同Style对应值”的逻辑。
要实现这个需求,我们需要在遍历CSV行的时候,维护一个变量来记录最近一次出现的非空Style值,遇到空的Style单元格时,就用这个变量的值来填充。具体修改如下:
修改后的完整代码
<?php //上传xlsx文件保存 $xlsx="C:/wamp64/www/Extract_pictures_Excel/xlsx_files/".date('Y_m_d H-i-s')."_file.xlsx"; move_uploaded_file($_FILES["mon_fichier"]["tmp_name"],$xlsx); //将Excel转换为CSV $excel = PHPExcel_IOFactory::load($xlsx); $writer = PHPExcel_IOFactory::createWriter($excel, 'CSV'); $writer->setDelimiter(";"); $writer->setEnclosure(""); $nomcsv = "C:/wamp64/www/Extract_pictures_Excel/csv/".date('Ymd_His').".csv"; $writer->save($nomcsv); $delimiter = ";"; $csv_data = array(); $row = 1; // 新增变量:保存当前最新的非空Style值 $current_style = ''; if (($handle = fopen($nomcsv, 'r')) !== FALSE) { while (($data = fgetcsv($handle, 1000, $delimiter)) !== FALSE) { // 处理表头行(如果第一行是表头,跳过赋值,只记录表头) if ($row === 1) { $csv_data[] = $data; $row++; continue; } // 假设Style列是第6列(数组索引为5,因为从0开始计数) if (!empty(trim($data[5]))) { // 如果当前Style值非空,更新current_style $current_style = $data[5]; } else { // 如果当前Style值为空,用最近的非空值填充 $data[5] = $current_style; } $csv_data[] = $data; $row++; } fclose($handle); } if (($handle = fopen($nomcsv, 'w')) !== FALSE) { foreach ($csv_data as $data) { fputcsv($handle, $data, $delimiter); } fclose($handle); } ?>
关键修改点说明
- 新增了
$current_style变量,用来追踪最近一次出现的非空Style值。 - 增加了表头判断:如果是第一行(表头),直接保留原数据,不进行填充逻辑(避免把表头也修改了)。
- 针对Style列(索引5)做判断:
- 当单元格非空时,更新
$current_style为当前值; - 当单元格为空时,用
$current_style的值填充该单元格。
- 当单元格非空时,更新
注意事项
- 确认Style列的索引是否正确:如果你的Style列不是第6列(从左数第1列是索引0),需要把
$data[5]改成对应的索引值。 - 用
trim()处理空值是为了避免单元格里只有空格被误判为非空值。
内容的提问来源于stack exchange,提问作者Patrick62
相关产品推荐
相关产品推荐

