开发者

Generate MS word document in Joomla

What I try to accomplish:

  1. Admin creates MS Word document with placeholders that will be filled with data from Joomla database
  2. Admin uploades MS Word file to Joomla and connects it with SQL statement
  3. User execute "Generate MS Word" function and g开发者_运维知识库ets MS Word document filled with data from database.

Is there any components for Joomla that does this? I have done this in my application using Interop libraries.


recently I've done this for a joomla component using phpdocx and pclzip libraries, where a *.docx file is generated from a template file.

Config:

$params         = Object with form data;    // data from requeest
$template       = 'xml_file_name';          // jfrom xml file name and *.docx template file name
$pl             = '#';                      // place holder prefix & suffix: (example: #PLACEHOLDER#)
$date_placehold = '#DATE#';                 // will be replaced with current date
$date_formt     = 'F j, Y';                 // php date format
$template_path  = JPATH_COMPONENT_SITE .DS.'templates'.DS.$template.'.docx';
$temp_dir       = JPATH_ROOT.DS.'tmp'.DS.'phpdocx-temp-dir';    // + write access
$output_mime    = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';
$filename       = $params->first_name .' - '. $params->second_name.'.docx';

// get names of all form fields of type 'list' from xml file
$lists      = (array) ComponentHelper::getJFormLists($template);
// get all field names from the xml file
$fields = (array) ComponentHelper::getJFormFieldsNames($template);

Initialize variables:

$doc =& JFactory::getDocument();
$doc->setMimeEncoding($output_mime); 

// require phpdocx class
require_once(JPATH_COMPONENT_ADMINISTRATOR . DS . 'helpers'.DS.'pclzip.lib.php');
require_once(JPATH_COMPONENT_ADMINISTRATOR . DS . 'helpers'.DS.'phpdocx.php');

$phpdocx = new phpdocx($template_path, $temp_dir);

bind form fields with user params:

foreach($params as $field => $value)
{
    if(array_key_exists($field,$lists) && is_array($lists[$field]) && array_key_exists($value, $lists[$field]) )
    {
        // if the field is JFormInput with type "list" its value is not important but its label
        $var = $lists[$field][$value];
    } else {
        $var = $value;
    }

    // use openxml carriage return on new lines
    if(strpos($var, "\n")) {
        $var = str_replace("\n", '<w:br/>', $var);
    }

    $fields[$field] = $var;
}

foreach application form fields:

foreach($fields as $field => $value)
{
        // replace placeholder with form value
        $phpdocx->assign($pl.strtoupper($field).$pl, $value);
}

// assign date for filled-in applications
if(!empty($date_placehold)
{
    $phpdocx->assign($date_placehold, date($date_formt));
}

output the file:

$phpdocx->stream($filename, $output_mime);

return true;
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜