NYCPHP Meetup

NYPHP.org

[nycphp-talk] Code Optimization Help

Joseph Crawford codebowl at gmail.com
Fri Sep 16 14:55:46 EDT 2005


Hello Everyone,

I have some code that is using COM to interact with MS Word to create a mail 
merge based on my mysql database, however it is running dreadfully slow 
13.53846 seconds to be exact. This is only running on 34 records, i could 
imagine running this on a few hundred records not to mention thousand. Is 
COM usually this slow? These load times i believe to be accurate as they 
come from zend studio's profiler.
You can see screenshots of the profile @ 
http://codebowl.dontexist.net/bugs/MailMerge/ Below you will see my code, 
anything you guys see that i could do to speed this up quite a bit i would 
appreciate it. It seems the naughty methods are CreateHeader, 
CreateDataSource, CreateDocument.


CODE
=====================================================
<?php

class MailMerge {
private $mm_data_dir;
private $obj;
private $fieldcnt;
private $rowcnt;
private $letter_template;
private $envelope_template;

public function __construct($list = null, $letter = 'Has_Site', $envelope = 
'Envelope', $data_dir = 'data/mailmerge') {
if(!is_array($list)) throw new Exception('Cannot Create A Mail Merge With An 
Empty List.');
$this->mm_data_dir = 'F:/htdocs/csaf/'.$data_dir;
$this->list = $list;
$this->letter_template = $letter;
$this->envelope_template = $envelope;
$this->initilize();

$this->CreateHeaderFile();
$this->CreateDataSource();
$this->CreateDocument($this->letter_template);
$this->CreateDocument($this->envelope_template);
}

public function __destruct() {
unlink($this->mm_data_dir.'/ds.doc');
unlink($this->mm_data_dir.'/header.doc');
}

private function initilize() {
$this->rowcnt = count($this->list);
$this->fieldcnt = count($this->list[0]);
}

private function Close() {
$this->obj->Documents->Close();
}

private function Quit() {
$this->obj->Quit(); 
}

private function Release() {
$this->obj = NULL; 
}

private function CreateHeaderFile() {
$this->obj = new COM("word.application") or die('Couldnt load Word!');
if(!is_object($this->obj)) throw new Exception('Unable to instanciate 
Word!');
$this->obj->Documents->Add();
$this->obj->ActiveDocument->Tables->Add($this->obj->Selection->Range,1,$this->fieldcnt);

for($i = 0; $i <= $this->rowcnt; $i++) {
foreach($this->list[$i] as $key => $value) {
$this->obj->Selection->TypeText($key);
$this->obj->Selection->MoveRight();
} 
}
$this->obj->ActiveDocument->SaveAs($this->mm_data_dir.'/header.doc');
$this->Close();
$this->Quit();
$this->Release();
}

private function CreateDataSource() {
$this->obj = new COM("word.application");
if(!is_object($this->obj)) throw new Exception('Unable to instanciate 
Word!');
$this->obj->Documents->Add();
$this->obj->ActiveDocument->Tables->Add($this->obj->Selection->Range,$this->rowcnt,$this->fieldcnt);

for($i = 0; $i <= $this->rowcnt; $i++) {
foreach($this->list[$i] as $key => $value) {
$this->obj->Selection->TypeText($value);
$this->obj->Selection->MoveRight();
}
}
$this->obj->ActiveDocument->SaveAs($this->mm_data_dir.'/ds.doc');
$this->Close();
$this->Quit();
$this->Release();
}

private function CreateDocument($template) {
$this->obj = new COM("word.application"); 
if(!is_object($this->obj)) throw new Exception('Unable to instanciate 
Word!');
$this->obj->Documents->Open($this->mm_data_dir.'/'.$template.'.dot');
$this->obj->ActiveDocument->MailMerge->OpenHeaderSource($this->mm_data_dir.'/header.doc');
$this->obj->ActiveDocument->MailMerge->OpenDataSource($this->mm_data_dir.'/ds.doc');
$this->obj->ActiveDocument->MailMerge->Execute();
$this->obj->ActiveDocument->SaveAs($this->mm_data_dir.'/'.$template.'.doc');
$this->Close();
$this->Quit();
$this->Release();
}
}
?>

-- 
Joseph Crawford Jr.
Codebowl Solutions, Inc.
1-802-671-2021
codebowl at gmail.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.nyphp.org/pipermail/talk/attachments/20050916/fb8738e8/attachment.html>


More information about the talk mailing list