Описание

Для экспорта информации в Excell средствами php разработчики довольно часто генерируют простую HTML таблицу. Затем они объявляют тип документа application/x-msexcel и расширение XLS. HTML таблица с легкостью откроется в Excell.

Но это не совсем правильно. Excell автоматически распознает тип файла по его содержимому. Такой файл Excell распознает как веб-страницу и будет работать с ним соответственно. Та же ситуация с форматом CSV.

Этот класс поможет Вам сгенерировать документ именно в формате Excell.

Пример использования

$xls = new PhpToExcell(); // создание объекта

$xls->ExBOF(); // маркер начала структуры
$xls->Rus(); // установка русского языка
$xls->RefMode(0);

$xls->ColWidth(3,3,15000); // установка ширины колонки

$xls->WriteLabel(0,3,0,0,0,'Тестовая строка'); // запись строки
$xls->WriteInteger(1,3,0,0,0,1223); // запись целого числа
$xls->WriteNumber(0,0,0,0,0,0.20); // запись дробного числа
$xls->WriteBlank(1,5,0,0,0); // запись пустой ячейки

$xls->ExEOF(); // маркер конца структуры

$xls->SaveToFileXls('data_table.xls'); // сохранить файл
$xls->SendFileToHTTP('data_table.xls'); // вывести клиенту  

Листинг

/****************************************************************
* Script         : PHP скрипт формирования отчетов в Excell файл
* Author         : LiO (lio@lio.kz)
* Version        : 0.1
* Copyright      : GNU LGPL
* URL            : http://lio.kz
* Last modified  : 08.07.2004
* Description    : Объект формирования xls файла. Файл может быть
* сохранен физически на диск для дальнейшей работы (передача,
* отправка на e-mail и т.д.). Так же можно сразу "показать" структуру
* Данный скрипт поддерживает формат Excell 5, с ограничениями -
* не более 255 столбцов, и 65535 строк.
*
* Отлечистельные особенности от других скриптов
*  1. Формирования атрибутов ячеек (обрамление)
*  2. Отдельная запись целых чисел и вещественных
*  3. Корректировка стилей шрифтов и размера
******************************************************************/

class PhpToExcell {
	var $data = "";          // данные структуры
	
	// формирования заголовка открытия
	function ExBOF() {
		// begin of the excel file header
		$this->data = pack("c*", 0x09, 0x00, 0x04, 0x00, 0x02, 0x00, 0x10, 0x0);
	}
	
	// формирования заголовка закрытия
	function ExEOF() {
		$this->data .= pack("cc", 0x0A, 0x00);
	}
	
	// Переводит в строку attr1..3
	function RowAttr($attr1,$attr2,$attr3) {
		return chr($attr1).chr($attr2).chr($attr3);
	}
	
	// устанавливает русский язык в структура xls
	function Rus() {
		$this->data .= (chr(0x42).chr(0x00).chr(0x02).chr(0x00).chr(0x01).chr(0x80));
	}
	
	// запись строки
	// Col,Row - колонка и строка
	// attr1 - атрибут показа ячейки и защита от записи
	// attr2 - размер шрифта
	// attr3 - обрамление ячейки
	// для формирования атрибутов используйте соотвествующие функции
	function WriteLabel($Col,$Row,$attr1=0,$attr2=0,$attr3=0,$value) // { Запись String }{
		$i=strlen($value);
		$this->data .= pack("v*",0x04,8+$i,$Col,$Row);
		$this->data .= $this->RowAttr($attr1,$attr2,$attr3);
		$this->data .= pack("c",$i);
		$this->data .= $value;
	}
	
	// установка ширины колонки  Width*1/256
	//                           3000 - 100% }
	function ColWidth($ColFirst,$ColLast,$Width) {
		$this->data .= (CHR(0x24).CHR(00).Chr(04).CHR(00).chr($ColFirst).chr($ColLast).pack('s',$Width));
	}
	
	// Управляет видом колонок и строк при
	// ReferenceMode=1 Стиль ссылок = R1C1
	// ReferenceMode=0 Стиль ссылок стандартный A1...
	function RefMode($ReferenceMode=1) {
		if ($ReferenceMode==1) {
			$this->data .= (CHR(0x0f).chr(0x00).chr(2).chr(0x00).chr(0x00).chr(0x00));
		} else {
			$this->data .= (CHR(0x0f).chr(0x00).chr(2).chr(0x00).chr(0x00).chr(0x01));
		}
	}
	
	// запись целого числа
	function WriteInteger($Col,$Row,$attr1,$attr2,$attr3,$value=0) {
		$this->data.=pack("v*",0x02,0x09,$Col,$Row);
		$this->data.=$this->RowAttr($attr1,$attr2,$attr3);
		$this->data.=pack("v",$value);
	}
	
	// запись дробного числа
	function WriteNumber($Col,$Row,$attr1,$attr2,$attr3,$value=0.00) {
		$this->data.=pack("v*",0x03,0x0F,$Col,$Row);
		$this->data.=$this->RowAttr($attr1,$attr2,$attr3);
		$this->data.=pack("d",$value);
	}
	
	// запись пустой ячейки
	function WriteBlank($Col,$Row,$attr1,$attr2,$attr3)	{
		$this->data.=pack("v*",0x01,0x07,$Col,$Row);
		$this->data.=$this->RowAttr($attr1,$attr2,$attr3);
	}
	
	// Установка шрифта. Height*1/20
	//      Для 10 пунктов Height = 200   }
	function Font($Height,$Bold=0,$Italic=0,$Underline=0,$StrikeOut=0,$FontName) {
		$i=strlen($FontName);
		$this->data.=CHR(0x31).chr(0x00).Chr($i+5).chr(0x00);
		$this->data.=pack("v",$Height);
		$k=0;
		if ($Bold==1) $k=$k|1;
		if ($Italic==1) $k=$k|2;
		if ($Underline==1) $k=$k|4;
		if ($StrikeOut==1) $k=$k|8;
		$this->data.=pack("v",$k);
		$this->data.=chr($i);
		$this->data.=$FontName;
	}
	
	// Формируем аттрибут №1 ($Attr1)
	// $CellHidden - скрыть формулы
	// $CellLocked - защищенная ячейка
	function Attr1($CellHidden=0,$CellLocked=0) {
		$r=0x0;
		if ($CellHidden==1)$r=$r|128;
		if ($CellLocked==1)$r=$r|64;
		return $r;
	}
	
	// Формируем аттрибут №2 ($Attr2)
	// $FontNumber 0..3
	function Attr2($FontNumber=0) {
		$r=0;
		switch ($FontNumber) {
			case 1:
				$r=64;
				break;
			case 2:
				$r=128;
				break;
			case 3:
				$r=129;
				break;
		}
		return $r;
	}
	
	// Формируем аттрибут №3 ($Attr3)
	// Alignment  0 - General
	//            1 - left
	//            2 - center
	//            3 - Right
	//            4 - Fill
	function Attr3($Shaded=0,$BottomBorder=0,$TopBorder=0,$RightBorder=0,$LeftBorder=0,$Alignment=0) {
		$r=0;
		if ($Shaded==1) $r=$r|128;
		if ($BottomBorder==1) $r=$r|64;
		if ($TopBorder==1) $r=$r|32;
		if ($RightBorder==1) $r=$r|16;
		if ($LeftBorder==1) $r= $r|8;
		if ($Alignment<8) $r=$r|$Alignment;
		return $r;
	}
	
	// сохранение данных в xls файл
	function SaveToFileXls($FName='file.xls') {
		$fp = fopen( $FName, "wb" );
		fwrite( $fp,$this->data);
		fclose( $fp );
	}
	
	// показать структуру в web
	function SendFileToHTTP($FName='file.xls') {
		header ( "Expires: Mon, 1 Apr 1974 05:00:00 GMT" );
		header ( "Last-Modified: " . gmdate("D,d M YH:i:s") . " GMT" );
		header ( "Cache-Control: no-cache, must-revalidate" );
		header ( "Pragma: no-cache" );
		header ( "Content-type: application/x-msexcel" );
		header ( "Content-Disposition: attachment; filename=".$FName );
		print $this->data;
	}
}