Создание Excel при помощи PHP

Deserved

Новичок
Создание Excel при помощи PHP

Вообщем хочу создать класс который будет создавать Файл Экселя и в нём 3 sheet с разными именами. Зашёл в тупик не знаю как это сделать перечитал много материалов с BIFF хотя их не так много.

Судя из материала расположенного сдесь:
http://genrep.nm.ru/xls/biff.htm

чтоб создать Workbook или начать новый файл надо написать следующие:

xls_data = pack( "vvvvvv", 0x809, 0x0008, 0x0,0x0005, 0x0, 0x0 );

Где
0x809 - ИД
0x0008 - Размер
0x0 - Версия
0x0005 - Тип ( В данном случае Workbook)
0x0 - ИД создания
0x0 - Год создания


Если тип изменить на 0х0010 то выйдет что создаём Worksheet.

Судя схеме расположенной по линку выше структура должна быть такой:

BOF Type = workbook globals // Создаём файл
Workbook globals // Переменные файла
...
EOF // Конец файла
BOF Type = worksheet // Открываем Worksheet
Sheet records поток // Даннык
EOF // Закрываем
BOF Type = worksheet
Sheet records поток
EOF

Но всеравно как не пытался не выходит мне сконструровать фаил с двумя Worksheet. Помогите пожалуйста сделать это
 

Deserved

Новичок
да я знаком и он позволяет делать много слоёв, но суть не в этом, суть в том чтоб самому написать используя BIFF. Я смотрел ПИР и в данный момент раскладываю по полочкам но там слишком всё запутанно.

Вообщем наверно вопрос должен звучать так: Как правильно создать многослойную структуру Эксэль файла используя хэши по средствам PHP?
 

Фанат

oncle terrible
Команда форума
Люди, что вы несёте? Раз в год на форуме появляется человек, который хочет что-то НАПИСАТЬ! Сам!
А вы ему - "бери готовое".

Deserved
не очень понятен, если честно, вопрос.
вроде бы, посредством PHP можно записать любую структуру в файл.
Другое дело - надо знать, что писать. А здесь PHP тбе не поможет. Надо разбираться со структурой файла.
 

Deserved

Новичок
Структуры файла XLS:
http://genrep.nm.ru/xls/biff.htm --- Сдесь на русском
http://www.scribd.com/doc/1356/jasper --- Сдесь на англиском

Я не гений и не професионал для меня много нового и сложного поэтому всё сразу не доходит. Счас разбераю пир чтоб понять как они эта делают, а патом попробую сам написать используя ваше перечисленные линки.

Помощи не дождался но хоть подержку.
 

kode

never knows best
Автор оригинала: Deserved
Структуры файла XLS:
http://genrep.nm.ru/xls/biff.htm --- Сдесь на русском
http://www.scribd.com/doc/1356/jasper --- Сдесь на англиском

Я не гений и не професионал для меня много нового и сложного поэтому всё сразу не доходит. Счас разбераю пир чтоб понять как они эта делают, а патом попробую сам написать используя ваше перечисленные линки.

Помощи не дождался но хоть подержку.
http://pear.php.net/package/Spreadsheet_Excel_Writer
Там уже готовое, но это не значит что нужно это использовать, но некоторые моменты можно подсмотреть.
 

Фанат

oncle terrible
Команда форума
Deserved
Гм. А какой помощи ты ждал? Нет, ну правда, я без подначки, правда интересно.
Ты ждал кого? Того, кто знает этот бифф на зубок? Или того, кто пойдёт, всё изучит, и потом тебе расскажет?
Если первое, то тебе уже намекнули, что форум по пхп - не самое лучшее место по поиску специалистов по форматам файлов микрософт. Ты согласен с этим?

Если второго - то это, согласись, очень наивно?
 

Deserved

Новичок
BIFF знать не надо там всё предельно ясно написанно что за что отвечает. И писать ничего не надо я сам напишу.

Моя проблема в том что я не могу сгенерировать файл с несколькими слоями. И если кто знающий или тот кто сталкивался подскажет структуру или в двух словах объяснит, то эта будет то зачем я сюда и пришёл.

И фанат там я писал не видя что мою тему ты вернул так что не обижайся если задел.

-~{}~ 28.12.07 20:33:

Ну вот сегодня пол дня провазился и напрограмировал вот что:

PHP:
$this->xls_data = pack( "vvvvvv", 0x0809, 0x0010, 0x0600,0x0005, 0x0DBB, 0x07CC ); // Begin of File in BIFF (1) (workbook)
$this->xls_data .= pack( "VV", 0x00000041, 0x00000006); 
$this->xls_data .= pack( "vvv",0x0042,0x0002,0x04E4); // Write Codepage in BIFF (2)
$this->xls_data .= pack( "vvvvvvvvvvv",0x003D,0x0012,0x0,0x0,0x25BC,0x1572,0x0038,0,0,0,0x0258); // Create window1 in BIFF (3)
$this->xls_data .= pack( "vvv",0x0022,0x0002,0);  // Create BIFF datemode. (4)
$this->xls_data .= pack( "vvvvvvvCCCCCC",0x31, $length,200,0x00,0x7FFF,0x0190,0,0,0,0,0x00,$F_len,0);  // Create BIFF Font (5)
$this->xls_data .= $this->font_name;
$this->xls_data .= pack( "vvvvvCCCCVVv", 0x00E0, 0x0014, 0, 0, 0xFFF5, 32, 0x00, 0x00,0,0x20400000, 0x102040, 0x20C0); // Create XF in BIFF (7)
$this->xls_data .= pack( "vvvvvCCCCVVv", 0x00E0, 0x0014, 0, 0, 0, 32, 0x00, 0x00,0,0x20400000, 0x102040, 0x20C0);     
$this->xls_data .= pack( "vvvCC",0x0293,0x0004,0x8000,0x00,0xFF);  // Create BIFF Style (8)
$this->xls_data .= pack( "vvv",0x0092,226,56);        //Create BIFF Pallete (9)
       
       $data = '';
       $aref  = $this->_palette;
       foreach ($aref as $color) {
            foreach ($color as $byte) {
                $data .= pack("C",$byte);
            }
        }
$this->xls_data .= $data;
$this->xls_data .= pack ("vvVvv",0x0085,0x08+strlen("Hn"),0,0x0000,strlen("Hn"));   //Create BOUNDSHEET in BIFF (10)
$this->xls_data .= "Hi"; 
$this->xls_data .= pack ("vvVvv",0x0085,0x08+strlen("Hi"),0,0x0000,strlen("Hn"));   //Create BOUNDSHEET in BIFF (10)
$this->xls_data .= "Hn"; 
$this->xls_data .= pack( "vvvv",0x008C,4,370,370);  //Create Country in BIFF  (11) 
$this->xls_data .= pack( "vv", 0x000A, 0x0000 );
$this->xls_data .= pack( "vvvvvv", 0x0809, 0x0010, 0x0600,0x0010, 0x0DBB, 0x07CC ); // Begin of File in BIFF 1 (13)
$this->xls_data .= pack( "VV", 0x00000041, 0x00000006);
$this->xls_data .= pack( "vvvvvvvvvV", 0x023E, 0x0012, 0x04B6, 0x0000, 0x0000,0x0040,0x0000,0x0000,0x0000,0x00000000); // Create window2 in Biff
$this->xls_data .= pack( "vv", 0x000A, 0x0000 );
$this->xls_data .= pack( "vvvvvv", 0x0809, 0x0010, 0x0600,0x0010, 0x0DBB, 0x07CC ); // Begin of File in BIFF 1 (worksheet)
$this->xls_data .= pack( "VV", 0x00000041, 0x00000006);
$this->xls_data .= pack( "vvvvvvvvvV", 0x023E, 0x0012, 0x04B6, 0x0000, 0x0000,0x0040,0x0000,0x0000,0x0000,0x00000000); // Create window2 in Biff
пояснения:

Для того чтобы создать полноценный Эксель файл с несколькими слоями надо знать структуру (Поочерёдность действий при создании). Я использоал BIFF8 при написании своего неудачного на данный момент кода. Структура моя такова:


BOF ----> Начала файла тип = Workbook (1)
Codepage -----> text encoding (2)
Window1 ------> Запись WINDOW1 содержит описание атрибутов окна workbook (3)
Datemode ------> This record specifies the base date for displaying date values. (4)
Font -------> Таблица шрифтов книги содержит как минимум 5 записей FONT (5)
Format -------> Записи FORMAT описывают форматы данных в книге. (6)
XF -------> Записи XF хранят описание форматирования для стилей и ячеек. (7)
Style -------> Любой стиль в книге, неважно, встроенный он или определенный пользователем, требует отдельной записи STYLE в BIFF файле (8)
Pallete ------> описание цветовой палитры (9)
Boundsheet --------> Запись хранит имя листа, тип листа, и позицию в потоке (10)
Country ------> This record stores two Windows country identifiers. (11)
Share String Table ------- > This record contains a list of all strings used anywhere in the workbook.(12)
EOF ----> Конец файла (13)

BOF ----> Начала файла тип = Worksheet (13)
window2 ------> Запись WINDOW1 содержит описание атрибутов окна worksheet (3)
BOF


Полное описание структуры вы найдёте сдесь http://static.scribd.com/docs/ewx8li6a2ho44.pdf
Что касается моего кода то:
1. То ошибка в Стиле или со всем что с ним связанно т.е. и с XF, Workbook запускается но криво. (8)
2. Невычеслена позиция в потоке, отсчитываемая от начала записи BOF для листа. Поставил 0 вместа значения (3 переменная).
PHP:
$this->xls_data .= pack ("vvVvv",0x0085,0x08+strlen("Hn"),0,0x0000,strlen("Hn"));
3. Невписал Format и Share String Table

всё побитово и как что к чему распишу попоже. устал :)
Продолжение следует.

-~{}~ 04.01.08 16:01:

Добрый день пытался создать полноценный Excel файл а вышло только создать Слой и слегка его редактировать
PHP:
function  GenerateXLS()
     {
       $os = getenv( "OS" );
       $temp = "C:";
       // check OS and set proper values for some vars.
       if ( stristr( $os, "Windows" ) ) {
          $this->default_dir = $temp;
          $this->dirsep = "/";
       } else {
         // assume that is Unix/Linux
         $this->default_dir = "/3V/sbin/";
         $this->dirsep =  "/";
       }
       // begin of the excel file header
       $this->xls_data = pack( "vvvvvv", 0x0809, 0x0008, 0x0005,0x0010, 0x0, 0x0 ); // Begin of File in BIFF 1 (worksheet)

     }

     // write a Number (double) into row, col
     function Num( $row, $col, $value )
     {
        $this->xls_data .= pack( "sssss", 0x0203, 14, $row, $col,0x00);
        $this->xls_data .= pack( "d", $value );
        return;
     }
     
     // write a label (text) into Row, Col
     function Text( $row, $col, $value )
     {
        $len = strlen( $value );
        $this->xls_data .= pack( "s*", 0x0204, 8 + $len, $row, $col, 0x00, $len);
        $this->xls_data .= $value;        
        return;
     }
    
     function storeDefcol($colwidth)
     {   
        if(!isset($colwidth))
        {
          $colwidth = 8;
        }    
        $this -> xls_data .= pack("vvv", 0x0055, 0x0002, $colwidth);
     }
      
     function colInfo($fCol,$lCol,$width)
     {
        $width=($width+0.72)*256;
        $this-> xls_data .=pack("vvvvvvvC",0x007D,0x000B,$fCol,$lCol,$width,0x0,0,0x00);
     }
     
     
     function setRow($size)
     {
        $this-> xls_data .=pack("vvvvvvvvvv",0x0208,0x0010,0,0x0000,0x0000,$size*20,0x0000,0x0000,0x0100,0);
     }
     
     
     function topMar($num)
     {
         $this-> xls_data .=pack("vvd",0x0028,0x0008,$num);
     }
     
     function botMar($num)
     {
         $this-> xls_data .=pack("vvd",0x0029,0x0008,$num);
     }
     
     function leftMar($num)
     {
        $this-> xls_data .=pack("vvd",0x0026,0x0008,$num);
     }
     
     function rightMar($num)
     {
        $this-> xls_data .=pack("vvd",0x0027,0x0008,$num);
     }
     
     function verPB($pos)
     {
        $this-> xls_data .=pack("vvvvvv",0x001a,8,1,$pos,0x0000, 0xffff);
     }
     
     function horPB($pos)
     {
        $this-> xls_data .=pack("vvvvvv",0x001b,8,1,$pos,0x0000, 0xffff);
     }
     
     function setFooter($name)
     {
        $length = 1+strlen($name);
        echo $length;
        $this-> xls_data .=pack("vvC",0x0015,$length,strlen($name));
        $this-> xls_data .=$name;
     }
     
     function setHeader($name)
     {
        $length = 1+strlen($name);
        echo $length;
        $this-> xls_data .=pack("vvC",0x0014,$length,strlen($name));
        $this-> xls_data .=$name;
     }
     
     
     function End()
     {
       $this->xls_data .= pack( "vv", 0x000A, 0x0000 );
       return;
     }
      // Save generated xls file
     function SaveFile($filename)
     {
        $this->End();
        $this->fname = $this->default_dir."$this->dirsep".$filename;
        if ( !stristr( $this->fname, ".xls" ) ) {
          $this->fname .= ".xls";
        }
        $fp = fopen( $this->fname, "wb" );
        fwrite( $fp, $this->xls_data );
        fclose( $fp );
        return;
     }
     
     function SendFile($filename)
     {
        $this->End();
        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=$filename.xls" );
        header ( "Content-Description: PHP Generated XLS Data" );
        print $this->xls_data;
     }

Ниже опишу данные функции и байты:

Функция GenerateXLS() Генерирует начало файлай:
PHP:
$this->xls_data = pack( "vvvvvv", 
0x0809, ----> ID
0x0008, ----> Размер
0x0005, ----> Версия
0x0010, ----> Тип (в данном случае WorkSheet)
0x0,    ----> ID создания
0x0     ----> год создания
);
Функция Num( $row, $col, $value ) где $row -> Номер строки $col -> Номер столбца $value -> Значения (число):
PHP:
$this->xls_data .= pack( "sssss",
0x0203,  ----> ID
14,      ----> Размер
$row,    ----> нр. строки отсчитываемый с 0 (если значения 1 то в Эксель 2)
$col,    ----> но. колонки отсчитываемый с 0 (если значения 1 то в Эксель В)
0x00     ---->  Индекс записи XF (Записи XF хранят описание форматирования для стилей и ячеек.)
);
$this->xls_data .= pack( "d", $value );  ----> значение.
Функция Text( $row, $col, $value ):
Функция вставляет текст в ячейку и имеет дополнительный параметр $len ---> длина строки

Функция storeDefcol($colwidth) где $colwidth ---> Ширина столбцов, Функция присваивает всем столбцам один размер, по умолчанию 8:
PHP:
$this -> xls_data .= pack("vvv", 
0x0055,  ----> ID
0x0002,  ----> Размер
$colwidth);
Функция colInfo($fCol,$lCol,$width) где $fCol -> Первая колонка $lCol -> Последняя колонка $width -> ширина заданных колонок:
Функция задаёт ширину диапазону колонок т.е. если:
$fCol = 0
$lCol = 0
$width = 20
То ширина столбца А будет равна 20 если:
$fCol = 0
$lCol = 4
$width = 20
То ширина столбцов А,B,C,D,E будет равна 20 если:

PHP:
$width=($width+0.72)*256;  ----> Формула преоброзования :)
PHP:
$this-> xls_data .=pack("vvvvvvvC",
0x007D, ----> ID
0x000B, ----> Размер
$fCol,  ----> Первая калонка
$lCol,  ----> Последняя колонка
$width, ----> ширина
0x0,    ----> Индекс на запись ИксФ
0,      ----> Флаги выбора см. ниже:
(
Bits        Mask       Contents
0           0001        1 = Columns are hidden
10-8        0700        Outline level of the columns (0 = no outline)
12          1000        1 = Columns are collapsed
)
0x00   ----> Не используется
);
Функция setRow($size) где $size -> Высотя строки. Функция задаёт высоту строки.

PHP:
$this-> xls_data .=pack("vvvvvvvvvv",
0x0208, ----> ID
0x0010, ----> Размер
0,    ----> Нр. строки
0x0000, ----> Индекс к первой колонки
0x0000, ----> Индекс к последней колонки
$size*20, ----> Высота строки
0x0000, ----> Не используется
0x0000, ----> Не используется
0x0100,
0 ----> Индекс на запись ИксФ

);
Функции topMar($num), botMar($num), leftMar($num) и rightMar($num) Добавляют отступы где $num -> размер.
Функции verPB($pos) и horPB($pos) добавляю Vertical Page Break и Horizontal Page Break где $pos -> номер строки/колонки откуда будет начинаться Page Break
Функции setFooter($name) и setHeader($name) добавляют Header и Footer где $name -> Название
Функция SaveFile($filename) Сохраняет файл
 

kombo

Новичок
а что мешает xml сгеренировать с хедером эксельным header("Content-Type: application/vnd.ms-excel"); ?

сохранить файл экселя в виде xml , посмотреть структуру и сделать по образу и подобию

-~{}~ 04.01.08 21:46:

... ну и указать соответственно в .htaccess чтобы при запросе файла xls срабатывал php файл
 
Сверху