читать и писать с использованием phpexcel при использовании listWorksheetNames ()

У меня есть файл .xlsx. В файле .xlsx есть 4 листа «активность», «производительность», «магазин», «отображение». Я хочу загрузить только один лист в памяти за один раз и после добавления данных, чтобы сообщить о записи. мой код ниже

$objReader = PHPExcel_IOFactory::createReader('Excel2007'); $worksheet_names = $objReader->listWorksheetNames('/tmp/ac.xlsx'); $objReader->setLoadSheetsOnly('store'); $objPHPExcel = $objReader->load('/tmp/ac.xlsx'); $objPHPExcel->setActiveSheetIndexByName('store'); $sheet = $objPHPExcel->getActiveSheet(); $max_row = $sheet->getHighestRow(); $sheet->setCellValue("A$max_row", "Data"); $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); $objWriter->setPreCalculateFormulas(false); $objWriter->save('/tmp/ac.xlsx'); $objPHPExcel->disconnectWorksheets(); unset($objPHPExcel); 

проблема в том, что он пишет на листе магазина и удаляет все остальные листы. Как я могу сохранить все листы при обновлении «листа хранилища», есть ли какая-либо функция, которая будет писать один лист за раз, сохраняя другие листы.

Только то, что вы загрузили в объект PHPExcel, будет помещено в ваш новый файл.

CreateWriter не редактирует файл и не сохраняет листы, он просто пишет новую копию того, что вы передаете, в имя файла, которое вы ему даете. В этом случае он перезапишет файл, потому что это тот же самый файл, который вы только что открыли для чтения. Итак, вы должны принять некоторую осторожность, чтобы сначала захватить всю книгу, а затем изменить то, что вы хотите (со всего листа). После этого напишите все в файл с новыми изменениями.

Приведенный ниже код поможет вам сохранить остальные листы. Чтобы редактировать только отдельные листы, просто введите имена листов, которые вы хотите изменить, в массиве $ editable_worksheets. Я был очень охарактеризован с комментариями, поэтому, надеюсь, они будут прояснять шаг за шагом, как это делается.

 // Load your PHPExcel class require_once 'classes/PHPExcel/Classes/PHPExcel.php'; // Set variables for file location and type to make code more portable and // less memory intensive $file = '/tmp/ac.xlsx'; $file_type = 'Excel2007'; // Open file for reading $objReader = PHPExcel_IOFactory::createReader($file_type); // Take all exisiting worksheets in open file and place their names into an array $worksheet_names = $objReader->listWorksheetNames($file); // Array of worksheet names that should be editable $editable_worksheets = array('activity', 'store'); // You will need to load ALL worksheets if you intend on saving to the same // file name, so we will pass setLoadSheetsOnly() the array of worksheet names // we just created. $objReader->setLoadSheetsOnly($worksheet_names); // Load the file $objPHPExcel = $objReader->load($file); // Loop through each worksheet in $worksheet_names array foreach($worksheet_names as $worksheet_name) { // Only edit the worksheets with names we've allowed in // the $editable_worksheets array if(in_array($worksheet_name, $editable_worksheets)) { // Take each sheet, one at a time, and set it as the active sheet $objPHPExcel->setActiveSheetIndexByName($worksheet_name); // Grab the sheet you just made active $sheet = $objPHPExcel->getActiveSheet(); // Grab the highest row from the current active sheet $max_row = $sheet->getHighestRow(); // Set the value of column "A" in the last row to the text "Data" $sheet->setCellValue("A" . $max_row, "Data"); } // Foreach loop will repeat until all sheets in the workbook have been looped // through } // Unset variables to free up memory unset($worksheet_names, $worksheet_name, $sheet, $max_row); // Prepare to write a new file $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, $file_type); // Tell excel not to precalculate any formulas $objWriter->setPreCalculateFormulas(false); // Save the file $objWriter->save($file); // This must be called before unsetting to prevent memory leaks $objPHPExcel->disconnectWorksheets(); // Again, unset variables to free up memory unset($file, $file_type, $objReader, $objPHPExcel); 

Вы загружаете только один лист, поэтому объект PHPExcel в памяти содержит только этот лист. Когда вы сохраняете, вы перезаписываете exoisting файл с книгой в памяти (не редактируя исходный файл). Если вы хотите сохранить одноименное имя и сохранить все четыре листа; вам нужно загрузить все четыре листа.