Using PHP to Make Excel Easier
Excel, PHP, Programming May 12th. 2007, 10:38amRecently, I was presented with the task of counting the number times filenames repeated in an excel document. Being a 16,000+ row file, with well over 500 unique filenames, there was no simple solution in excel.
Having some experience exporting excel documents using PHP, I knew importing them wouldn’t be too hard. A few google searches later and I came across Excel Reader which fit the bill perfectly.
After sorting my excel document by filename, I created a loop in PHP that would read the first filename, count the number of times it repeated until it changed, then append that data to a string that would be exported to a new excel document once it was done reading the data.
// Starting at 2 to skip the headers | +1 so it compares the last row for ($i = 2; $i <= $data->sheets[0]['numRows']+1; $i++) { if ($data->sheets[0]['cells'][$i][3]==$curFileName) { $curFileCount++; } else { // Output the data line: "Device","User","Filename","Filecount" $stringData = "\"".$data->sheets[0]['cells'][$i-1][1]."\",\"".$data->sheets[0]['cells'][$i -1][2]."\",\"".$data->sheets[0]['cells'][$i-1][3]."\",\"".$curFileCount."\"\ n"; fwrite($fh, $stringData); // Reset the count and update the curFileName $curFileName = $data->sheets[0]['cells'][$i][3]; $curFileCount=1; } echo "Row: ".$i."\n"; }
Of course… I didn’t have just one of these files but 6 and manually entering each filename would be a waste of my time. My software solution for this was to create an “Input” and “Output” folder and have PHP cycle through the “Input” folder.
// For every file in the dir "Input", generate a report if ($handle = opendir('Input')) { while (false !== ($orgFileName = readdir($handle))) { if($orgFileName != '..' && $orgFileName != '.') { // Echo the file we're reading, then read that file echo $orgFileName."\n"; $data->read("Input/".$orgFileName);
Eventually it all came together as such:
<?php // Don't change any of this require_once 'Excel/reader.php'; $data = new Spreadsheet_Excel_Reader(); $data->setOutputEncoding('CP1251'); // For every file in the dir "Input", generate a report if ($handle = opendir('Input')) { while (false !== ($orgFileName = readdir($handle))) { if($orgFileName != '..' && $orgFileName != '.') { // Echo the file we're reading echo $orgFileName."\n"; $data->read("Input/".$orgFileName); // Set the first filename to compare $curFileName = $data->sheets[0]['cells'][2][3]==$curFileName; $curFileCount = 0; // Create a file and open it for writing $myFile = "Output/File_Count-".str_replace(".xls",".csv",$orgFileName); $fh = fopen($myFile, 'w') or die("can't open file"); // Starting at 2 to skip the headers | +1 so it compares the last row for ($i = 2; $i <= $data->sheets[0]['numRows']+1; $i++) { if ($data->sheets[0]['cells'][$i][3]==$curFileName) { $curFileCount++; } else { // Output the data line: "Device","User","Filename","Filecount" $stringData = "\"".$data->sheets[0]['cells'][$i-1][1]."\",\"".$data->sheets[0]['cells'][$i -1][2]."\",\"".$data->sheets[0]['cells'][$i-1][3]."\",\"".$curFileCount."\"\ n"; fwrite($fh, $stringData); // Reset the count and update the curFileName $curFileName = $data->sheets[0]['cells'][$i][3]; $curFileCount=1; } echo "Row: ".$i."\n"; } // Close file fclose($fh); } } } ?>
My apologies for the less than perfect code, I was on a deadline and perfect code wasn’t a requirement :).
Here are some screenshots of the script in action.





















