2006-01-27 21:52:56 +01:00
< ? php
2011-09-10 14:21:41 +02:00
/* Copyright ( C ) 2006 - 2011 Laurent Destailleur < eldy @ users . sourceforge . net >
2008-10-27 00:15:09 +01:00
*
* 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
2011-08-01 01:24:38 +02:00
* along with this program . If not , see < http :// www . gnu . org / licenses />.
2008-10-27 00:15:09 +01:00
*/
2006-01-27 21:52:56 +01:00
/**
2009-10-03 14:08:48 +02:00
* \file htdocs / includes / modules / export / export_excel . modules . php
* \ingroup export
2011-02-02 22:05:09 +01:00
* \brief File of class to generate export file with Excel format
2009-10-03 14:08:48 +02:00
* \author Laurent Destailleur
2008-10-27 00:15:09 +01:00
*/
2006-01-27 21:52:56 +01:00
require_once ( DOL_DOCUMENT_ROOT . " /includes/modules/export/modules_export.php " );
/**
2009-10-03 14:08:48 +02:00
* \class ExportExcel
* \brief Class to build export files with Excel format
2008-10-27 00:15:09 +01:00
*/
2006-01-27 21:52:56 +01:00
class ExportExcel extends ModeleExports
{
2008-10-27 00:15:09 +01:00
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 ;
2011-08-11 21:12:37 +02:00
var $file ; // To save filename
2008-10-27 00:15:09 +01:00
/**
2011-08-11 21:12:37 +02:00
* Constructor
*
2011-09-10 14:21:41 +02:00
* @ param DoliDB $db Database handler
2008-10-27 00:15:09 +01:00
*/
function ExportExcel ( $db )
{
global $conf ;
$this -> db = $db ;
$this -> id = 'excel' ; // Same value then xxx in file name export_xxx.modules.php
$this -> label = 'Excel' ; // Label of driver
2009-10-03 14:08:48 +02:00
$this -> desc = '<b>Excel</b> file format (.xls)<br>This is native Excel 95 format.' ;
2008-10-27 00:15:09 +01:00
$this -> extension = 'xls' ; // Extension for generated file by this driver
2009-05-19 02:14:27 +02:00
$this -> picto = 'mime/xls' ; // Picto
2011-08-27 21:15:14 +02:00
$this -> version = '1.30' ; // Driver version
2008-10-27 00:15:09 +01:00
// If driver use an external library, put its name here
2011-08-11 21:12:37 +02:00
$this -> label_lib = 'PhpExcel' ;
$this -> version_lib = '1.7.2' ;
2008-10-27 00:15:09 +01:00
$this -> row = 0 ;
}
function getDriverId ()
{
return $this -> id ;
}
function getDriverLabel ()
{
return $this -> label ;
}
2009-09-28 22:06:15 +02:00
function getDriverDesc ()
{
return $this -> desc ;
}
2008-10-27 00:15:09 +01:00
function getDriverExtension ()
{
return $this -> extension ;
}
function getDriverVersion ()
{
return $this -> version ;
}
function getLibLabel ()
{
return $this -> label_lib ;
}
function getLibVersion ()
{
return $this -> version_lib ;
}
/**
2011-08-11 21:12:37 +02:00
* Open output file
*
2011-09-10 14:21:41 +02:00
* @ param string $file File name to generate
* @ param Translate $outputlangs Output language object
* @ return int < 0 if KO , >= 0 if OK
2008-10-27 00:15:09 +01:00
*/
function open_file ( $file , $outputlangs )
{
2011-08-11 21:12:37 +02:00
global $user , $conf , $langs ;
2009-02-11 02:39:14 +01:00
2011-08-11 21:12:37 +02:00
if ( ! empty ( $conf -> global -> MAIN_USE_PHP_WRITEEXCEL ))
{
$outputlangs -> charset_output = 'ISO-8859-1' ; // Because Excel 5 format is ISO
}
2009-02-11 02:39:14 +01:00
2009-02-20 23:53:15 +01:00
dol_syslog ( " ExportExcel::open_file file= " . $file );
2011-08-11 21:12:37 +02:00
$this -> file = $file ;
2008-03-30 17:49:25 +02:00
$ret = 1 ;
2006-01-27 21:52:56 +01:00
2011-08-11 21:12:37 +02:00
$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 );
}
2008-10-27 00:15:09 +01:00
return $ret ;
}
/**
2011-08-11 21:12:37 +02:00
* Write header
2008-10-27 00:15:09 +01:00
*
2011-09-10 14:21:41 +02:00
* @ param Translate $outputlangs Object lang to translate values
* @ return int < 0 if KO , > 0 if OK
2008-10-27 00:15:09 +01:00
*/
function write_header ( $outputlangs )
{
2011-08-11 21:12:37 +02:00
//$outputlangs->charset_output='ISO-8859-1'; // Because Excel 5 format is ISO
2009-02-11 02:39:14 +01:00
2008-10-27 00:15:09 +01:00
return 0 ;
}
/**
2011-09-10 14:21:41 +02:00
* Output title line into file
2011-08-11 21:12:37 +02:00
*
2011-09-10 14:21:41 +02:00
* @ 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
2008-10-27 00:15:09 +01:00
*/
function write_title ( $array_export_fields_label , $array_selected_sorted , $outputlangs )
{
2008-05-17 02:14:03 +02:00
// Create a format for the column headings
2011-08-11 21:12:37 +02:00
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 );
}
2007-07-01 13:51:55 +02:00
2008-10-27 00:15:09 +01:00
$this -> col = 0 ;
foreach ( $array_selected_sorted as $code => $value )
{
2011-02-02 22:05:09 +01:00
$alias = $array_export_fields_label [ $code ];
2008-10-27 00:15:09 +01:00
//print "dd".$alias;
2009-02-20 23:53:15 +01:00
if ( empty ( $alias )) dol_print_error ( '' , 'Bad value for field with code=' . $code . '. Try to redefine export.' );
2011-08-11 21:12:37 +02:00
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 ));
}
2008-10-27 00:15:09 +01:00
$this -> col ++ ;
}
$this -> row ++ ;
return 0 ;
}
/**
2011-09-10 14:21:41 +02:00
* Output record line into file
2011-08-11 21:12:37 +02:00
*
2011-09-10 14:21:41 +02:00
* @ 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
2008-10-27 00:15:09 +01:00
*/
2011-02-02 22:05:09 +01:00
function write_record ( $array_selected_sorted , $objp , $outputlangs )
2008-10-27 00:15:09 +01:00
{
2011-08-11 21:12:37 +02:00
// 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
}
2009-02-11 02:39:14 +01:00
2011-08-11 21:12:37 +02:00
// Define first row
2008-10-27 00:15:09 +01:00
$this -> col = 0 ;
2011-08-11 21:12:37 +02:00
2008-10-27 00:15:09 +01:00
foreach ( $array_selected_sorted as $code => $value )
{
2011-02-02 22:05:09 +01:00
$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 ;
2008-11-06 02:31:57 +01:00
$newvalue = $this -> excel_clean ( $newvalue );
2008-10-27 00:15:09 +01:00
// Traduction newvalue
2009-10-22 17:09:04 +02:00
if ( preg_match ( '/^\((.*)\)$/i' , $newvalue , $reg ))
2008-10-27 00:15:09 +01:00
{
$newvalue = $outputlangs -> transnoentities ( $reg [ 1 ]);
}
else
{
2008-10-29 22:26:59 +01:00
$newvalue = $outputlangs -> convToOutputCharset ( $newvalue );
2008-10-27 00:15:09 +01:00
}
2009-10-22 17:09:04 +02:00
if ( preg_match ( '/^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]$/i' , $newvalue ))
2008-10-27 00:15:09 +01:00
{
2011-08-11 21:12:37 +02:00
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]).'<br>';
$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' );
}
2008-10-27 00:15:09 +01:00
}
2009-10-22 17:09:04 +02:00
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 ))
2008-10-27 00:15:09 +01:00
{
2011-08-11 21:12:37 +02:00
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]).'<br>';
$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' );
}
2008-10-27 00:15:09 +01:00
}
else
{
2011-08-11 21:12:37 +02:00
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 );
}
2008-10-27 00:15:09 +01:00
}
$this -> col ++ ;
}
$this -> row ++ ;
return 0 ;
}
2011-08-11 21:12:37 +02:00
/**
* Write footer
*
2011-09-10 14:21:41 +02:00
* @ param Translate $outputlangs Output language object
* @ return int < 0 if KO , > 0 if OK
2011-08-11 21:12:37 +02:00
*/
2008-10-27 00:15:09 +01:00
function write_footer ( $outputlangs )
{
return 0 ;
}
2011-08-11 21:12:37 +02:00
/**
* Close Excel file
2011-09-10 14:21:41 +02:00
*
* @ return int < 0 if KO , > 0 if OK
2011-08-11 21:12:37 +02:00
*/
2008-10-27 00:15:09 +01:00
function close_file ()
{
2011-08-11 21:12:37 +02:00
if ( ! empty ( $conf -> global -> MAIN_USE_PHP_WRITEEXCEL ))
{
$this -> workbook -> close ();
}
else
{
require_once ( PHPEXCEL_PATH . " PHPExcel/Writer/Excel5.php " );
$objWriter = new PHPExcel_Writer_Excel5 ( $this -> workbook );
$objWriter -> save ( $this -> file );
$this -> workbook -> disconnectWorksheets ();
unset ( $this -> workbook );
}
2008-10-27 00:15:09 +01:00
return 0 ;
}
2006-01-27 21:52:56 +01:00
2009-02-11 02:39:14 +01:00
2008-11-06 02:31:57 +01:00
/**
* Clean a cell to respect rules of Excel file cells
2011-08-11 21:12:37 +02:00
*
2011-09-10 14:21:41 +02:00
* @ param string $newvalue String to clean
* @ return string Value cleaned
2008-11-06 02:31:57 +01:00
*/
function excel_clean ( $newvalue )
{
// Rule Dolibarr: No HTML
$newvalue = dol_string_nohtmltag ( $newvalue );
2009-02-11 02:39:14 +01:00
2008-11-06 02:31:57 +01:00
return $newvalue ;
}
2006-01-27 21:52:56 +01:00
}
?>