2011-06-28 28 views
2

私は.xlsxファイルを持っています。 .xlsxファイルには、 "activity"、 "performance"、 "store"、 "display"の4つのシートがあります。 一度に1枚のシートをメモリに読み込み、その後にデータを追加した後、 レポートを書きます。問題は、それが店のシートに書き込み、他のすべてのシートを削除されているlistWorksheetNames()を使ってphpexcelを読み書きする

$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); 

の下に私のコードです。 は、他のシートを保持している間に一枚ずつ書き込む機能があります。

答えて

1

1枚のシートしかロードしていないため、メモリ内のPHPExcelオブジェクトにはそのシートのみが含まれています。保存すると、元のファイルを編集するのではなく、メモリ内のワークブックでエキゾーストファイルを上書きします。同じ名前で保存し、4つのワークシートをすべて保持する場合は、 4つのワークシートをすべて読み込む必要があります。

+0

こんにちはマーク、提案のためのおかげで..私は同じprobleamに直面しています...あなたはそれが行われる必要がありますどのように「あなたはiPodにすべての4つのワークシートを必要とする」ことを、あなたのソリューションの最後の行に書いています? – Denish

+0

可能であれば、私にコードを提供してください...それは私にとって非常に緊急です....事前にたくさんありがとう:)) – Denish

2

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); 
関連する問題