Clase para crear y modificar un archivo Excel desde PHP

Iniciado por ANTRAX, Febrero 24, 2010, 11:42:44 AM

Tema anterior - Siguiente tema

0 Miembros y 3 Visitantes están viendo este tema.

Febrero 24, 2010, 11:42:44 AM Ultima modificación: Marzo 27, 2014, 06:14:13 PM por Expermicid
Clase para crear y modificar un archivo Excel desde PHP

Esta clase de PHP permite crear, cargar, leer, escribir y grabar en libros y hojas de Microsoft Excel.


Código: php
<?php
/* Class for use with PHP4 scripts only*/
/*
* This is an Excel class to create,load,read,write,save and use some of the internal
* functionalities of workbooks and sheets.
* Tested with Windows 98 - MS Office 2000
* Apache 1.3.9 PHP4.02 Running as CGI
* (c) Alain M. Samoun 09/2000.
* alain @sonic.net
* Gnu GPL code (see www.fsf.org for more information).
*/

class Excel {
/* variables */
var $ex;
var $pathin;
var $pathout;
var $workbook;
var $sheet;
var $visible;
var $fformatin;
var $fformatout;
var $cell;
var $rangesens;
var $range;
var $ext;
var $oext;
var $error = 0;
var $msg_error;

/* Constructor */
function excel()
{
#Instantiate Excel
$this->ex = new COM("Excel.Application") or $this->error = 1;
if ($this->get_error()==0)
return true;
else
return false;
}

function XL($workbook,$pathin="",$sheet="Hoja1")
{
if ($workbook != "")
{
#Load the workbook
$wkb =  @$this->ex->application->Workbooks->Open($pathin.$workbook) or $this->error = 2;
}else{
#New workbook
$wkb =  @$this->ex->application->Workbooks->Add or $this->error = 3;
}
if ($this->error==0)
if ($sheet != "")
{
#Activate the sheet
$sheets =  @$wkb->Worksheets($sheet) or $this->error = 4;
}else{
#new sheet
$sheet = "Hoja1" ;
}
#Excel Won't prompt the user when replacing or closing workbooks
#Comment the line below if you want Excel to prompt
// $this->ex->application->DisplayAlerts = "False";
if ($this->get_error()==0)
return true;
else
return false;
}

function readrange($sheet="Hoja1",$range)
{
#Read all the cells in the range to $result and return it
unset ($result);
$range = trim($range);
#Determine start and end of range
$tokstart = strtok($range,":");
$tokend = strtok(":");
if ($tokend =="")
{
#Read one single cell
$sheets = $this->ex->Application->Worksheets($sheet);
$sheets->activate;
#Select the cell
$selcell = $sheets->Range($range);
$selcell->activate;
return $selcell->value;
}
#Read a range of cells
#determine column and row numbers
$sheets = $this->ex->Application->Worksheets($sheet);
$sheets->activate;
$rgstart = $sheets->range($tokstart);
$colstart = $rgstart->column;
$rowstart = $rgstart->row;
$rgend = $sheets->range($tokend);
$colend = $rgend->column;
$rowend = $rgend->row;
if ($colstart>$colend or $rowstart>$rowend)
{
Print ("Notation Error! Cell Column/Row should be increasing.");
return;
}
#Now read each cell
if ($colstart == $colend)
{
#Read Vertically
$j=0;
For ($i= $rowstart; $i<=$rowend; $i++)
{
$selcell = $sheets->cells($i,$colstart);
$selcell->activate;
$result[$j] = $selcell->value;
$j++;
}
}else
{
#Read horizontally
$j=0;
For ($i= $colstart; $i<=$colend; $i++)
{
$selcell = $sheets->cells($rowstart,$i);
$selcell->activate;
$result[$j] = $selcell->value;
$j++;
}
}
return $result;
}

function writerange($sheet="Hoja1",$range,$value)
{
#Fill up all the cells in the range with array
$range = trim($range);
#Determine start and end of range
$tokstart = strtok($range,":");
$tokend = strtok(":");
if ($tokend =="")
{
# Write to a single cell in the active sheet
$cell = trim($range);
#Select the sheet
$sheets = $this->ex->Application->Worksheets($sheet);
$sheets->activate;
#Select the cell
$selcell = $sheets->Range($cell);
$selcell->activate;
$selcell->value = $value;
return;
}
#determine column and row numbers
$sheets = $this->ex->Application->Worksheets($sheet);
$sheets->activate;
$rgstart = $sheets->range($tokstart);
$colstart = $rgstart->column;
$rowstart = $rgstart->row;
$rgend = $sheets->range($tokend);
$colend = $rgend->column;
$rowend = $rgend->row;
if ($colstart>$colend or $rowstart>$rowend)
{
Print ("Notation Error! Cell Column/Row should be increasing.");
return;
}
#Now write each cell
if ($colstart == $colend)
{
#write Vertically
$j=0;
For ($i= $rowstart; $i<=$rowend; $i++)
{
$selcell = $sheets->cells($i,$colstart);
$selcell->activate;
$selcell->value = $value[$j];
$j++;
}
}else
{
#Write horizontally
$j=0;
For ($i= $colstart; $i<=$colend; $i++)
{
$selcell = $sheets->cells($rowstart,$i);
$selcell->activate;
$selcell->value = $value[$j];
$j++;
}
}
return 1;
}
function saveas($workbook,$pathout,$ext)
{

#First get the file format code for the extension $ext
$code = $this->fileformater($ext);
$basefile = strtok($workbook,".");
$newworkbook = $basefile."."."$ext";

#If no prompt and file exists it will be replaced.

#Save the current workbook as new workbook
#The following line will work for converting spreadsheets file to xls
#but if the original is an excel file and the new file another format
#then it may not work because limitations of excel.(See excel doc)
$this->ex->Application->ActiveWorkbook->SaveAS($pathout.$newworkbook,$code);

return 1;
}

function fileformater($ext)
{
switch(strtolower($ext))
{
case "slk":
return 2;
break;
case "xlt":
return -4143;
break;
case "txt":
return -4158;
break;
case "csv":
return 6;
break;
case "xlw":
return 35;
break;
case "w4k":
return 38;
break;
case "wq1":
return 34;
break;
case "prn":
return -4158;
break;
case "dif":
return 9;
break;
case "xla":
return -4143;
break;
case "wk3":
return 32;
break;
case "xls":
return -4143;
break;
case "htm":
return 44;
break;
case "wks":
return 4;
break;
default:
return -4143;

}
}
function XLTranslate($pathin,$pathout,$oext,$ext,$kill=0)
{
#This function will translate automatically all spreadsheets files, with the
#$oext extension, in the $pathin directory, to another spreadsheet file,
#with the $ext extension, to the $pathout directory.
#It will erase the original file if $kill switch = 1.
#Limitations: Will work always when translating none excel files to
#excel files(Extension=xl*) and with the translation xls->htm . It will
#not generally work when translating excel files to other formats because
#the questions asked by the excel program stop the script.
#Get all files in the source directory $pathin to the $filelist array
chdir($pathin);
$dir=dir (".");
$i=1;
while($file=$dir->read())
{
$filelist [$i] = $file;
$i++;
}
$dir->close;
#Translate each file, with the original extension $oext, in the $filelist
#to the needed extension $ext.
for ($i=1;$i<= sizeof($filelist); $i++)
{
$file = $filelist[$i];
$basefile = strtok($file,".");
$extension = strtok(".");

if (strtolower($extension) == strtolower($oext))
{
echo "<BR> $file";
$this->XL($file,$pathin,$sheet="");
$this->saveas($file,$pathout,$ext,"");
#Erase the original file if $kill=1
if ($kill)
{
chmod ($file,0777);
unlink ($pathin.$file);
}
#Close the new workbook
$this->closeXL();
}
}
return 1;
}

function closexl()
{
#Close active workbook without prompt from Excel
$this->ex->application->ActiveWorkbook->Close("False");
return 1;
}
function runfunction($funct,$arrayparam)
{
#Run and return value of an excel function
$params = implode(",",$arrayparam);
eval ("$result = $this->ex->application->$funct($params);");
return $result;
}
Function runmacro($workbook,$macroname)
{
$this->ex->application->Run("$workbook!$macroname");
return 1;
}
Function createhyperlink($sheet="Hoja1",$cell,$hyperl)
{
#Not working as 9/2/00 4:57PM
print "<br>link = $hyperl <br>";
$sheets = $this->ex->Application->Worksheets($sheet);
$sheets->activate;
#Select the cell
$selcell = $sheets->Range($cell);
$sheets->hyperlinks->add($selcell,$hyperl);

return 1;
}
function calculate($sheet="Hoja1")
{
#Calculate (update) the current sheet
$sheets = $this->ex->Application->Worksheets($sheet); #Select the sheet
$sheets->activate;
$sheets->Calculate;
return 1;
}

function get_error()
{
return $this->error;
}

function set_error($id_error)
{
$this->error = $id_error;
}

function get_msg_error($id_error)
{
switch($id_error)
{
// case 1: return "Did not instantiate Excel";
case 1: return "No se puede abrir el fichero Excel";
// case 2: return "Did not open $pathin $workbook";
case 2: return "No se puede abrir el fichero Excel seleccionado";
// case 3: return "Unable to add a workbook";
case 3: return "Unable to add a workbook";
// case 4: return "Unable to activate $sheet";
case 4: return "No se puede abrir el fichero Excel seleccionado";
}
}
} /* end of Excel class */
?>