From 2d309f947d94c9bdc6290458ec49c87dc23030f0 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 13 Sep 2011 21:59:44 +0000 Subject: [PATCH] New: Can export into Excel 2007 format --- ChangeLog | 1 + .../modules/export/export_excel.modules.php | 2 +- .../export/export_excel2007.modules.php | 367 ++++++++++++++++++ htdocs/lib/files.lib.php | 1 + 4 files changed, 370 insertions(+), 1 deletion(-) create mode 100755 htdocs/includes/modules/export/export_excel2007.modules.php diff --git a/ChangeLog b/ChangeLog index 2dfff9a6e0a..d2146e5e548 100644 --- a/ChangeLog +++ b/ChangeLog @@ -17,6 +17,7 @@ For users: - New: task #11261 : Add an entry into menu called "New shipment". - New: Make option MAIN_GENERATE_DOCUMENTS_WITHOUT_VAT available by default. - New: Can build PDF in USLetter format or canada format. +- New: Can export into Excel 2007 format. For developers: - Qual: Removed no more used external libraries. diff --git a/htdocs/includes/modules/export/export_excel.modules.php b/htdocs/includes/modules/export/export_excel.modules.php index d8bfbad7ea4..b6061a245da 100644 --- a/htdocs/includes/modules/export/export_excel.modules.php +++ b/htdocs/includes/modules/export/export_excel.modules.php @@ -57,7 +57,7 @@ class ExportExcel extends ModeleExports $this->db = $db; $this->id='excel'; // Same value then xxx in file name export_xxx.modules.php - $this->label='Excel'; // Label of driver + $this->label='Excel 95'; // Label of driver $this->desc='Excel file format (.xls)
This is native Excel 95 format.'; $this->extension='xls'; // Extension for generated file by this driver $this->picto='mime/xls'; // Picto diff --git a/htdocs/includes/modules/export/export_excel2007.modules.php b/htdocs/includes/modules/export/export_excel2007.modules.php new file mode 100755 index 00000000000..af826212d03 --- /dev/null +++ b/htdocs/includes/modules/export/export_excel2007.modules.php @@ -0,0 +1,367 @@ + + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * \file htdocs/includes/modules/export/export_excel.modules.php + * \ingroup export + * \brief File of class to generate export file with Excel format + * \author Laurent Destailleur + */ + +require_once(DOL_DOCUMENT_ROOT."/includes/modules/export/modules_export.php"); +require_once(DOL_DOCUMENT_ROOT."/includes/modules/export/export_excel.modules.php"); + + +/** + * \class ExportExcel2007 + * \brief Class to build export files with Excel format + */ +class ExportExcel2007 extends ExportExcel +{ + var $id; + var $label; + var $extension; + var $version; + + var $label_lib; + var $version_lib; + + var $workbook; // Handle fichier + var $worksheet; // Handle onglet + var $row; + var $col; + var $file; // To save filename + + + /** + * Constructor + * + * @param DoliDB $db Database handler + */ + function ExportExcel2007($db) + { + global $conf; + $this->db = $db; + + $this->id='excel2007'; // Same value then xxx in file name export_xxx.modules.php + $this->label='Excel 2007'; // Label of driver + $this->desc='Excel file format (.xslx)
This is native Excel 2007 format.'; + $this->extension='xslx'; // Extension for generated file by this driver + $this->picto='mime/xls'; // Picto + $this->version='1.30'; // Driver version + + // If driver use an external library, put its name here + $this->label_lib='PhpExcel'; + $this->version_lib='1.7.2'; + + $this->row=0; + } + + function getDriverId() + { + return $this->id; + } + + function getDriverLabel() + { + return $this->label; + } + + function getDriverDesc() + { + return $this->desc; + } + + function getDriverExtension() + { + return $this->extension; + } + + function getDriverVersion() + { + return $this->version; + } + + function getLibLabel() + { + return $this->label_lib; + } + + function getLibVersion() + { + return $this->version_lib; + } + + + /** + * Open output file + * + * @param string $file File name to generate + * @param Translate $outputlangs Output language object + * @return int <0 if KO, >=0 if OK + */ + function open_file($file,$outputlangs) + { + global $user,$conf,$langs; + + if (! empty($conf->global->MAIN_USE_PHP_WRITEEXCEL)) + { + $outputlangs->charset_output='ISO-8859-1'; // Because Excel 5 format is ISO + } + + dol_syslog("ExportExcel::open_file file=".$file); + $this->file=$file; + + $ret=1; + + $outputlangs->load("exports"); + if (! empty($conf->global->MAIN_USE_PHP_WRITEEXCEL)) + { + require_once(PHP_WRITEEXCEL_PATH."class.writeexcel_workbookbig.inc.php"); + require_once(PHP_WRITEEXCEL_PATH."class.writeexcel_worksheet.inc.php"); + require_once(PHP_WRITEEXCEL_PATH."functions.writeexcel_utility.inc.php"); + $this->workbook = new writeexcel_workbookbig($file); + $this->workbook->set_tempdir($conf->export->dir_temp); // Set temporary directory + $this->workbook->set_sheetname($outputlangs->trans("Sheet")); + $this->worksheet = &$this->workbook->addworksheet(); + } + else + { + require_once(PHPEXCEL_PATH."PHPExcel.php"); + require_once(PHPEXCEL_PATH."PHPExcel/Style/Alignment.php"); + $this->workbook = new PHPExcel(); + $this->workbook->getProperties()->setCreator($user->getFullName($outputlangs).' - Dolibarr '.DOL_VERSION); + //$this->workbook->getProperties()->setLastModifiedBy('Dolibarr '.DOL_VERSION); + $this->workbook->getProperties()->setTitle($outputlangs->trans("Export").' - '.$file); + $this->workbook->getProperties()->setSubject($outputlangs->trans("Export").' - '.$file); + $this->workbook->getProperties()->setDescription($outputlangs->trans("Export").' - '.$file); + + $this->workbook->setActiveSheetIndex(0); + $this->workbook->getActiveSheet()->setTitle($outputlangs->trans("Sheet")); + $this->workbook->getActiveSheet()->getDefaultRowDimension()->setRowHeight(15); + } + return $ret; + } + + /** + * Write header + * + * @param Translate $outputlangs Object lang to translate values + * @return int <0 if KO, >0 if OK + */ + function write_header($outputlangs) + { + //$outputlangs->charset_output='ISO-8859-1'; // Because Excel 5 format is ISO + + return 0; + } + + + /** + * Output title line into file + * + * @param array $array_export_fields_label Array with list of label of fields + * @param array $array_selected_sorted Array with list of field to export + * @param Translate $outputlangs Object lang to translate values + * @return int <0 if KO, >0 if OK + */ + function write_title($array_export_fields_label,$array_selected_sorted,$outputlangs) + { + // Create a format for the column headings + if (! empty($conf->global->MAIN_USE_PHP_WRITEEXCEL)) + { + $outputlangs->charset_output='ISO-8859-1'; // Because Excel 5 format is ISO + + $formatheader =$this->workbook->addformat(); + $formatheader->set_bold(); + $formatheader->set_color('blue'); + //$formatheader->set_size(12); + //$formatheader->set_font("Courier New"); + //$formatheader->set_align('center'); + } + else + { + $this->workbook->getActiveSheet()->getStyle('1')->getFont()->setBold(true); + $this->workbook->getActiveSheet()->getStyle('1')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); + } + + $this->col=0; + foreach($array_selected_sorted as $code => $value) + { + $alias=$array_export_fields_label[$code]; + //print "dd".$alias; + if (empty($alias)) dol_print_error('','Bad value for field with code='.$code.'. Try to redefine export.'); + if (! empty($conf->global->MAIN_USE_PHP_WRITEEXCEL)) + { + $this->worksheet->write($this->row, $this->col, $outputlangs->transnoentities($alias), $formatheader); + } + else + { + $this->workbook->getActiveSheet()->SetCellValueByColumnAndRow($this->col, $this->row+1, $outputlangs->transnoentities($alias)); + } + $this->col++; + } + $this->row++; + return 0; + } + + /** + * Output record line into file + * + * @param array $array_selected_sorted Array with list of field to export + * @param resource $objp A record from a fetch with all fields from select + * @param Translate $outputlangs Object lang to translate values + * @return int <0 if KO, >0 if OK + */ + function write_record($array_selected_sorted,$objp,$outputlangs) + { + // Create a format for the column headings + if (! empty($conf->global->MAIN_USE_PHP_WRITEEXCEL)) + { + $outputlangs->charset_output='ISO-8859-1'; // Because Excel 5 format is ISO + } + + // Define first row + $this->col=0; + + foreach($array_selected_sorted as $code => $value) + { + $alias=str_replace(array('.','-'),'_',$code); + if (empty($alias)) dol_print_error('','Bad value for field with code='.$code.'. Try to redefine export.'); + $newvalue=$objp->$alias; + + $newvalue=$this->excel_clean($newvalue); + + // Traduction newvalue + if (preg_match('/^\((.*)\)$/i',$newvalue,$reg)) + { + $newvalue=$outputlangs->transnoentities($reg[1]); + } + else + { + $newvalue=$outputlangs->convToOutputCharset($newvalue); + } + + if (preg_match('/^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]$/i',$newvalue)) + { + if (! empty($conf->global->MAIN_USE_PHP_WRITEEXCEL)) + { + $formatdate=$this->workbook->addformat(); + $formatdate->set_num_format('yyyy-mm-dd'); + //$formatdate->set_num_format(0x0f); + $arrayvalue=preg_split('/[.,]/',xl_parse_date($newvalue)); + //print "x".$arrayvalue[0].'.'.strval($arrayvalue[1]).'
'; + $newvalue=strval($arrayvalue[0]).'.'.strval($arrayvalue[1]); // $newvalue=strval(36892.521); directly does not work because . will be convert into , later + $this->worksheet->write($this->row, $this->col, $newvalue, PHPExcel_Shared_Date::PHPToExcel($formatdate)); + } + else + { + $newvalue=dol_stringtotime($newvalue); + $this->workbook->getActiveSheet()->SetCellValueByColumnAndRow($this->col, $this->row+1, PHPExcel_Shared_Date::PHPToExcel($newvalue)); + $coord=$this->workbook->getActiveSheet()->getCellByColumnAndRow($this->col, $this->row+1)->getCoordinate(); + $this->workbook->getActiveSheet()->getStyle($coord)->getNumberFormat()->setFormatCode('yyyy-mm-dd'); + } + } + elseif (preg_match('/^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]$/i',$newvalue)) + { + if (! empty($conf->global->MAIN_USE_PHP_WRITEEXCEL)) + { + $formatdatehour=$this->workbook->addformat(); + $formatdatehour->set_num_format('yyyy-mm-dd hh:mm:ss'); + //$formatdatehour->set_num_format(0x0f); + $arrayvalue=preg_split('/[.,]/',xl_parse_date($newvalue)); + //print "x".$arrayvalue[0].'.'.strval($arrayvalue[1]).'
'; + $newvalue=strval($arrayvalue[0]).'.'.strval($arrayvalue[1]); // $newvalue=strval(36892.521); directly does not work because . will be convert into , later + $this->worksheet->write($this->row, $this->col, $newvalue, $formatdatehour); + } + else + { + $newvalue=dol_stringtotime($newvalue); + $this->workbook->getActiveSheet()->SetCellValueByColumnAndRow($this->col, $this->row+1, PHPExcel_Shared_Date::PHPToExcel($newvalue)); + $coord=$this->workbook->getActiveSheet()->getCellByColumnAndRow($this->col, $this->row+1)->getCoordinate(); + $this->workbook->getActiveSheet()->getStyle($coord)->getNumberFormat()->setFormatCode('yyyy-mm-dd h:mm:ss'); + } + } + else + { + if (! empty($conf->global->MAIN_USE_PHP_WRITEEXCEL)) + { + $this->worksheet->write($this->row, $this->col, $newvalue); + } + else + { + $this->workbook->getActiveSheet()->SetCellValueByColumnAndRow($this->col, $this->row+1, $newvalue); + } + } + $this->col++; + } + $this->row++; + return 0; + } + + + /** + * Write footer + * + * @param Translate $outputlangs Output language object + * @return int <0 if KO, >0 if OK + */ + function write_footer($outputlangs) + { + return 0; + } + + + /** + * Close Excel file + * + * @return int <0 if KO, >0 if OK + */ + function close_file() + { + if (! empty($conf->global->MAIN_USE_PHP_WRITEEXCEL)) + { + $this->workbook->close(); + } + else + { + require_once(PHPEXCEL_PATH."PHPExcel/Writer/Excel5.php"); + $objWriter = new PHPExcel_Writer_Excel2007($this->workbook); + $objWriter->save($this->file); + $this->workbook->disconnectWorksheets(); + unset($this->workbook); + } + return 0; + } + + + /** + * Clean a cell to respect rules of Excel file cells + * + * @param string $newvalue String to clean + * @return string Value cleaned + */ + function excel_clean($newvalue) + { + // Rule Dolibarr: No HTML + $newvalue=dol_string_nohtmltag($newvalue); + + return $newvalue; + } +} + +?> diff --git a/htdocs/lib/files.lib.php b/htdocs/lib/files.lib.php index 5ddc040f6cc..a369c1861fb 100644 --- a/htdocs/lib/files.lib.php +++ b/htdocs/lib/files.lib.php @@ -235,6 +235,7 @@ function dol_mimetype($file,$default='application/octet-stream',$mode=0) if (preg_match('/\.xls(b|m|x)?$/i',$tmpfile)) { $mime='application/vnd.ms-excel'; $imgmime='xls.png'; } if (preg_match('/\.xlt(x)?$/i',$tmpfile)) { $mime='application/vnd.ms-excel'; $imgmime='xls.png'; } if (preg_match('/\.xla(m)?$/i',$tmpfile)) { $mime='application/vnd.ms-excel'; $imgmime='xls.png'; } + if (preg_match('/\.xsl(b|m|x)?$/i',$tmpfile)) { $mime='application/vnd.ms-excel'; $imgmime='xls.png'; } if (preg_match('/\.pps(m|x)?$/i',$tmpfile)) { $mime='application/vnd.ms-powerpoint'; $imgmime='ppt.png'; } if (preg_match('/\.ppt(m|x)?$/i',$tmpfile)) { $mime='application/x-mspowerpoint'; $imgmime='ppt.png'; } // Other