Underc0de

Programación Web => Back-end => Mensaje iniciado por: ANTRAX en Febrero 24, 2010, 11:42:44 AM

Título: Clase para crear y modificar un archivo Excel desde PHP
Publicado por: ANTRAX en Febrero 24, 2010, 11:42:44 AM
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) [Seleccionar]
<?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 */
?>