350 lines
13 KiB
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;
|
|
}
|
|
}
|
|
}
|
|
|
|
?>
|