I don't think there's much I can suggest to help speed things up. If there was a simple code change that could cut your 15 minutes down to 1 minute, I'd have made that change months ago. There are a few tricks that you can try when building your worksheet,
such as using row/column styling (or applying styles to ranges of cells) rather than setting styles for each individual cell, and applying styles from a style array is faster than issuing a whole series of lines to set several style features. There's also
a host of discussions here on the board describing how you can improve performance with the way you write your code.
If you're using
$objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow($col, $row, $value[$id[$p]][$s1][$s2]);
for every cell that you set, change your code to:
$worksheet = $objPHPExcel->getActiveSheet();
and then within your loop, use
$worksheet->setCellValueByColumnAndRow($col, $row, $value[$id[$p]][$s1][$s2]);
This save the code from having to call getActiveSheet() for every single cell.
Alternatively, look at the fromArray() method to populate a number of cells with a single statement; or at call chaining.