Files
aportil/themes/codebase4.0/grid-excel-php/gridExcelWrapper.php

350 lines
13 KiB
PHP

<?php
error_reporting(0);
require_once './lib/PHPExcel.php';
require_once './lib/PHPExcel/IOFactory.php';
class gridExcelWrapper {
private $currentRow = 1;
private $columns;
public function createXLS($headerFileName, $headerLinesNum, $creator, $lastModifiedBy, $title, $subject, $dsc, $keywords, $category) {
if ($headerFileName) {
$this->excel = PHPExcel_IOFactory::load($headerFileName);
} else {
$this->excel = new PHPExcel();
}
$this->headerLinesNum = $headerLinesNum;
$this->currentRow += $this->headerLinesNum;
$this->excel->getProperties()->setCreator($creator)
->setLastModifiedBy($lastModifiedBy)
->setTitle($title)
->setSubject($subject)
->setDescription($dsc)
->setKeywords($keywords)
->setCategory($category);
}
public function headerPrint($columns, $widthProp, $headerHeight, $textColor, $headerColor, $lineColor, $headerFontSize, $fontFamily, $without_header = false) {
$this->textColor = $textColor;
$this->columns = $columns;
$this->types = Array();
for ($i = 0; $i < count($columns); $i++) {
if ($without_header == false)
$this->excel->getActiveSheet()->getRowDimension($this->currentRow)->setRowHeight($headerHeight);
for ($j = 0; $j < count($columns[$i]); $j++) {
if ($without_header == false) {
$this->excel->setActiveSheetIndex(0);
$this->excel->getActiveSheet()->setCellValueByColumnAndRow($j, $this->currentRow, $columns[$i][$j]['text']);
$this->excel->getActiveSheet()->getColumnDimension($this->getColName($j))->setWidth(($columns[0][$j]['width'])/$widthProp);
$this->excel->getActiveSheet()->getStyle($this->getColName($j).$this->currentRow)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
$this->excel->getActiveSheet()->getStyle($this->getColName($j).$this->currentRow)->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
$this->excel->getActiveSheet()->getStyle($this->getColName($j).$this->currentRow)->getFont()->getColor()->setRGB($textColor);
$this->excel->getActiveSheet()->getStyle($this->getColName($j).$this->currentRow)->getAlignment()->setWrapText(true);
}
if (($i == 0)&&(isset($columns[0][$j]))) {
if ($columns[0][$j]['excel_type'] != "")
$this->types[$j] = $columns[0][$j]['excel_type'];
else
$this->types[$j] = $columns[0][$j]['type'];
}
}
if ($without_header == false)
$this->currentRow++;
}
if ($without_header == false) {
for ($i = 0; $i < count($columns); $i++) {
for ($j = 0; $j < count($columns[$i]); $j++) {
if (isset($columns[$i][$j]['colspan'])) {
$this->excel->getActiveSheet()->mergeCells($this->getColName($j).($this->headerLinesNum + $i + 1).':'.$this->getColName($j + $this->columns[$i][$j]['colspan'] - 1).($this->headerLinesNum + $i + 1));
}
if (isset($columns[$i][$j]['rowspan'])) {
$this->excel->getActiveSheet()->mergeCells($this->getColName($j).($this->headerLinesNum + $i + 1).':'.$this->getColName($j).($this->headerLinesNum + $i + min($this->columns[$i][$j]['rowspan'], count($this->columns))));
}
}
}
$styleArray = array(
'borders' => array(
'allborders' => array(
'style' => PHPExcel_Style_Border::BORDER_THIN,
'color' => array('argb' => $this->processColor($lineColor)),
),
),
'fill' => array(
'type' => PHPExcel_Style_Fill::FILL_SOLID,
'rotation' => 90,
'startcolor' => array(
'argb' => $this->processColor($headerColor)
)
),
'font' => array(
'bold' => true,
'name' => $fontFamily,
'size' => $headerFontSize
)
);
$this->excel->getActiveSheet()->getStyle(($this->getColName(0).($this->headerLinesNum + 1).':'.$this->getColName(count($columns[0]) - 1).($this->headerLinesNum + $this->currentRow - 1)))->applyFromArray($styleArray);
$this->excel->getActiveSheet()->freezePane("A".($this->headerLinesNum + count($columns) + 1));
}
}
public function rowPrint($row, $rowHeight, $lineColor, $gridFontSize, $fontFamily) {
$this->excel->getActiveSheet()->getRowDimension($this->currentRow)->setRowHeight($rowHeight);
$styleArray = array(
'borders' => array(
'allborders' => array(
'style' => PHPExcel_Style_Border::BORDER_THIN,
'color' => array('argb' => $this->processColor($lineColor)),
),
),
'fill' => array(
'type' => PHPExcel_Style_Fill::FILL_SOLID,
'rotation' => 90
),
'font' => array(
'bold' => false,
'name' => $fontFamily,
'size' => $gridFontSize,
'color'=> Array('rgb'=> $this->processColor($this->textColor))
)
);
$this->excel->getActiveSheet()->getStyle(($this->getColName(0).$this->currentRow.':'.$this->getColName(count($row) - 1).$this->currentRow))->applyFromArray($styleArray);
for ($i = 0; $i < count($row); $i++) {
if ($i >= count($this->types)) continue;
$this->excel->getActiveSheet()->getStyle(($this->getColName($i).$this->currentRow.':'.$this->getColName($i).$this->currentRow))->applyFromArray($styleArray);
$styleArray['font']['bold'] = $row[$i]['bold'];
$styleArray['font']['italic'] = $row[$i]['italic'];
$this->excel->setActiveSheetIndex(0);
$text = $row[$i]['text'];
if ((isset($this->columns[0][$i]['type']))&&(($this->columns[0][$i]['type'] == 'ch')||($this->columns[0][$i]['type'] == 'ra'))) {
if ($text == '1') {
$text = 'Yes';
} else {
$text = 'No';
}
}
switch (strtolower($this->types[$i])) {
case 'string':
case 'str':
case 'txt':
case 'edtxt':
case 'rotxt':
case 'ro':
case 'co':
case 'coro':
$this->excel->getActiveSheet()->getCell($this->getColName($i).$this->currentRow)->setValueExplicit($text, PHPExcel_Cell_DataType::TYPE_STRING);
break;
case 'number':
case 'num':
case 'edn':
case 'ron':
$text = str_replace(",", ".", $text);
$this->excel->getActiveSheet()->getCell($this->getColName($i).$this->currentRow)->setValueExplicit($text, PHPExcel_Cell_DataType::TYPE_NUMERIC);
break;
case 'boolean':
case 'bool':
$this->excel->getActiveSheet()->getCell($this->getColName($i).$this->currentRow)->setValueExplicit($text, PHPExcel_Cell_DataType::TYPE_BOOL);
break;
case 'formula':
$this->excel->getActiveSheet()->getCell($this->getColName($i).$this->currentRow)->setValueExplicit($text, PHPExcel_Cell_DataType::TYPE_FORMULA);
break;
case 'date':
$this->excel->getActiveSheet()->setCellValueByColumnAndRow($i, $this->currentRow, $text);
$this->excel->getActiveSheet()->getStyle($this->getColName($i).$this->currentRow)->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDD2);
break;
default:
$this->excel->getActiveSheet()->setCellValueByColumnAndRow($i, $this->currentRow, $text);
break;
}
$this->excel->getActiveSheet()->getStyle($this->getColName($i).$this->currentRow)->getFill()->getStartColor()->setRGB($this->getRGB($row[$i]['bg']));
$this->excel->getActiveSheet()->getStyle($this->getColName($i).$this->currentRow)->getFont()->getColor()->setRGB($this->getRGB($row[$i]['textColor']));
$this->excel->getActiveSheet()->getStyle($this->getColName($i).$this->currentRow)->getFont()->getColor()->setRGB($this->getRGB($row[$i]['textColor']));
$align = $row[$i]['align'];
if ($align == false) $align = $this->columns[0][$i]['align'];
$this->excel->getActiveSheet()->getStyle($this->getColName($i).$this->currentRow)->getAlignment()->setHorizontal($align);
$this->excel->getActiveSheet()->getStyle($this->getColName($i).$this->currentRow)->getAlignment()->setWrapText(true);
}
$this->currentRow++;
}
public function footerPrint($columns, $headerHeight, $textColor, $headerColor, $lineColor, $headerFontSize, $fontFamily) {
$this->footerColumns = $columns;
if (count($columns) == 0)
return false;
for ($i = 0; $i < count($columns); $i++) {
$this->excel->getActiveSheet()->getRowDimension($this->currentRow)->setRowHeight($headerHeight);
for ($j = 0; $j < count($columns[$i]); $j++) {
$this->excel->setActiveSheetIndex(0);
$this->excel->getActiveSheet()->setCellValueByColumnAndRow($j, $this->currentRow, $columns[$i][$j]['text']);
$this->excel->getActiveSheet()->getStyle($this->getColName($j).$this->currentRow)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
$this->excel->getActiveSheet()->getStyle($this->getColName($j).$this->currentRow)->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
$this->excel->getActiveSheet()->getStyle($this->getColName($j).$this->currentRow)->getFont()->getColor()->setRGB($textColor);
}
$this->currentRow++;
}
$cr = $this->currentRow - count($columns);
for ($i = 0; $i < count($columns); $i++) {
for ($j = 0; $j < count($columns[$i]); $j++) {
if (isset($columns[$i][$j]['colspan'])) {
$this->excel->getActiveSheet()->mergeCells($this->getColName($j).($cr + $i).':'.$this->getColName($j + $columns[$i][$j]['colspan'] - 1).($cr + $i));
}
if (isset($columns[$i][$j]['rowspan'])) {
$this->excel->getActiveSheet()->mergeCells($this->getColName($j).($cr + $i).':'.$this->getColName($j).($cr + $i - 1 + $columns[$i][$j]['rowspan']));
}
}
}
$styleArray = array(
'borders' => array(
'allborders' => array(
'style' => PHPExcel_Style_Border::BORDER_THIN,
'color' => array('argb' => $this->processColor($lineColor)),
),
),
'fill' => array(
'type' => PHPExcel_Style_Fill::FILL_SOLID,
'rotation' => 90,
'startcolor' => array(
'argb' => $this->processColor($headerColor)
)
),
'font' => array(
'bold' => true,
'name' => $fontFamily,
'size' => $headerFontSize
)
);
$this->excel->getActiveSheet()->getStyle(($this->getColName(0).($this->currentRow - count($columns)).':'.$this->getColName(count($columns[0]) - 1).($this->currentRow - 1)))->applyFromArray($styleArray);
}
public function outXLS($title, $type = 'Excel2007') {
$this->excel->getActiveSheet()->setTitle($title);
$this->excel->setActiveSheetIndex(0);
switch (strtolower($type)) {
case 'excel2003':
$objWriter = PHPExcel_IOFactory::createWriter($this->excel, 'Excel5');
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="grid.xls"');
header('Cache-Control: max-age=0');
break;
case 'csv':
$objWriter = PHPExcel_IOFactory::createWriter($this->excel, 'CSV');
$objWriter->setDelimiter(';');
header("Content-type: application/csv");
header("Content-Disposition: attachment; filename=grid.csv");
header("Pragma: no-cache");
header("Expires: 0");
break;
case 'excel2007':
default:
$objWriter = PHPExcel_IOFactory::createWriter($this->excel, 'Excel2007');
header('Content-Type: application/xlsx');
header('Content-Disposition: attachment;filename="grid.xlsx"');
header('Cache-Control: max-age=0');
break;
}
$objWriter->save('php://output');
}
public function headerDraw($img) {
}
public function footerDraw($img) {
}
private function getColName($index) {
$index++;
$letters = Array("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z");
$name = '';
$ind = $index;
$ready = false;
$ch = "";
$length = count($letters);
while (!$ready) {
$rest = floor($index/$length);
$c = $index - $rest*$length;
$index = floor($index/$length);
$c--;
if ($c == -1) {
$c = $length - 1;
$index--;
}
$ch = $c + $ch;
$name = $letters[$c].$name;
if ($index <= 0)
$ready = true;
}
return $name;
}
private function processColor($color) {
$color = $this->processColorForm($color);
// if (!preg_match('/[0-9A-F]{6}/i', $color)) {
// return false;
// } else {
if ($color != 'transparent') {
return "FF".strToUpper($color);
} else {
return false;
}
// }
}
private function processColorForm($color) {
if ($color == 'transparent') {
return $color;
}
if (preg_match("/#[0-9A-Fa-f]{6}/", $color)) {
return substr($color, 1);
}
if (preg_match("/[0-9A-Fa-f]{6}/", $color)) {
return $color;
}
$color = trim($color);
$result = preg_match_all("/rgb\s?\(\s?(\d{1,3})\s?,\s?(\d{1,3})\s?,\s?(\d{1,3})\s?\)/", $color, $rgb);
if ($result) {
$color = '';
for ($i = 1; $i <= 3; $i++) {
$comp = dechex($rgb[$i][0]);
if (strlen($comp) == 1) {
$comp = '0'.$comp;
}
$color .= $comp;
}
return $color;
} else {
return 'transparent';
}
}
private function getRGB($color) {
$color = $this->processColorForm($color);
if ($color == 'transparent') {
return false;
} else {
return $color;
}
}
}
?>