читать и писать с помощью phpexcel при использовании listWorksheetNames () - PullRequest
3 голосов
/ 28 июня 2011

У меня есть файл .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);

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

Ответы [ 2 ]

2 голосов
/ 31 января 2013

Только то, что вы загрузили в объект 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);
1 голос
/ 07 июля 2011

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

...