Создаем отчеты в excel на php

Импорт данных из PHP в Excel

Рассмотрим пример по формированию таблицы умножения.


// Подключаем класс для работы с excel
require_once('PHPExcel.php');
// Подключаем класс для вывода данных в формате excel
require_once('PHPExcel/Writer/Excel5.php');

// Создаем объект класса PHPExcel
$xls = new PHPExcel();
// Устанавливаем индекс активного листа
$xls->setActiveSheetIndex(0);
// Получаем активный лист
$sheet = $xls->getActiveSheet();
// Подписываем лист
$sheet->setTitle('Таблица умножения');

// Вставляем текст в ячейку A1
$sheet->setCellValue("A1", 'Таблица умножения');
$sheet->getStyle('A1')->getFill()->setFillType(
    PHPExcel_Style_Fill::FILL_SOLID);
$sheet->getStyle('A1')->getFill()->getStartColor()->setRGB('EEEEEE');

// Объединяем ячейки
$sheet->mergeCells('A1:H1');

// Выравнивание текста
$sheet->getStyle('A1')->getAlignment()->setHorizontal(
    PHPExcel_Style_Alignment::HORIZONTAL_CENTER);

for ($i = 2; $i < 10; $i++) {
	for ($j = 2; $j < 10; $j++) {
        // Выводим таблицу умножения
        $sheet->setCellValueByColumnAndRow(
                                          $i - 2,
                                          $j,
                                          $i . "x" .$j . "=" . ($i*$j));
	    // Применяем выравнивание
	    $sheet->getStyleByColumnAndRow($i - 2, $j)->getAlignment()->
                setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
	}
}

Далее нам необходимо получить наш *.xls файл. Здесь можно пойти двумя путями. Если предположим у вас интернет магазин, и клиент хочет скачать прайс лист, то будет лучше прибегнуть к такому выводу:

// Выводим HTTP-заголовки
 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/vnd.ms-excel" );
 header ( "Content-Disposition: attachment; filename=matrix.xls" );

// Выводим содержимое файла
 $objWriter = new PHPExcel_Writer_Excel5($xls);
 $objWriter->save('php://output');

Здесь сформированные данные сразу “выплюнутся” в браузер. Однако, если вам нужно файл сохранить, а не “выбросить” его сразу, то не нужно выводить HTTP-заголовки и вместо “php://output” следует указать путь к вашему файлу. Помните что каталог, в котором предполагается создание файла, должен иметь права на запись. Это касается UNIX-подобных систем.

Рассмотрим еще на примере три полезные инструкции:

  • $sheet->getColumnDimension(‘A’)->setWidth(40) – устанавливает столбцу “A” ширину в 40 единиц;
  • $sheet->getColumnDimension(‘B’)->setAutoSize(true) – здесь у столбца “B” будет установлена автоматическая ширина;
  • $sheet->getRowDimension(4)->setRowHeight(20) – устанавливает четвертой строке высоту равную 20 единицам.

Также обратите внимание на следующие необходимые для работы с отчетом методы:

  • Методы для вставки данных в ячейку:
    • setCellValue(]]) — принимает три параметра: координату ячейки, данные для вывода в ячейку и третий параметр эта одна из констант типа boolean: true или false (если передать значение true, то метод вернет объект ячейки, иначе объект рабочего листа);
    • setCellValueByColumnAndRow(]]]) — принимает четыре параметра: номер столбца ячейки, номер строки ячейки, данные для вывода в ячейку и четвертый параметр действует по аналогии с третьим параметром метода setCellValue().
  • Методы для получения ячейки:
    • getCell() — принимает в качестве параметра координату ячейки;
    • getCellByColumnAndRow(]) — принимает два параметра в виде номеров столбца и строки ячейки.

Как мы видим, вышеприведенные методы являются парными. Поэтому мы можем работать с ячейками используя строковое или числовое представление координат. Что конечно же является дополнительным преимуществом в работе.

Examples

XLSX to html table

if ( $xlsx = SimpleXLSX::parse('book.xlsx') ) {
	echo '<table border="1" cellpadding="3" style="border-collapse: collapse">';
	foreach( $xlsx->rows() as $r ) {
		echo '<tr><td>'.implode('</td><td>', $r ).'</td></tr>';
	}
	echo '</table>';
	// or $xlsx->toHTML();	
} else {
	echo SimpleXLSX::parseError();
}

XLSX read cells, out commas and bold headers

echo '<pre>';
if ( $xlsx = SimpleXLSX::parse( 'xlsx/books.xlsx' ) ) {
	foreach ( $xlsx->rows() as $r => $row ) {
		foreach ( $row as $c => $cell ) {
			echo ($c > ) ? ', ' : '';
			echo ( $r ===  ) ? '<b>'.$cell.'</b>' : $cell;
		}
		echo '<br/>';
	}
} else {
	echo SimpleXLSX::parseError();
}
echo '</pre>';

XLSX get sheet names and sheet indexes

if ( $xlsx = SimpleXLSX::parse( 'xlsx/books.xlsx' ) ) {
	print_r( $xlsx->sheetNames() );
}
// Sheet numeration started 0

Select Sheet

$xlsx = SimpleXLSX::parse('book.xlsx');
print_r( $xlsx->rows(1) ); // Sheet numeration started 0, we select second worksheet

XLSX::parse remote data

if ( $xlsx = SimpleXLSX::parse('http://www.example.com/example.xlsx' ) ) {
	$dim = $xlsx->dimension(1); // don't trust dimension extracted from xml
	$num_cols = $dim[];
	$num_rows = $dim;
	echo $xlsx->sheetName(1).':'.$num_cols.'x'.$num_rows;
} else {
	echo SimpleXLSX::parseError();
}

XLSX::parse memory data

// For instance $data is a data from database or cache    
if ( $xlsx = SimpleXLSX::parseData( $data ) ) {
	print_r( $xlsx->rows() );
} else {
	echo SimpleXLSX::parseError();
}

DateTime helpers

// default SimpleXLSX datetime format YYYY-MM-DD HH:MM:SS (MySQL)
echo $xlsx->getCell(,'C2'); // 2016-04-12 13:41:00

// custom datetime format
$xlsx->setDateTimeFormat('d.m.Y H:i');
echo $xlsx->getCell(,'C2'); // 12.04.2016 13:41

// unixstamp
$xlsx->setDateTimeFormat('U');
$ts = $xlsx->getCell(,'C2'); // 1460468460
echo gmdate('Y-m-d', $ts); // 2016-04-12
echo gmdate('H:i:s', $ts); // 13:41:00

// raw excel value
$xlsx->setDateTimeFormat( NULL ); // returns as excel datetime
$xd = $xlsx->getCell(,'C2'); // 42472.570138889
echo gmdate('m/d/Y', $xlsx->unixstamp( $xd )); // 04/12/2016
echo gmdate('H:i:s', $xlsx->unixstamp( $xd )); // 13:41:00 

Rows with header values as keys

if ( $xlsx = SimpleXLSX::parse('books.xlsx')) {
	// Produce array keys from the array values of 1st array element
	$header_values = $rows = [];
	foreach ( $xlsx->rows() as $k => $r ) {
		if ( $k ===  ) {
			$header_values = $r;
			continue;
		}
		$rows[] = array_combine( $header_values, $r );
	}
	print_r( $rows );
}

Debug

ini_set('error_reporting', E_ALL );
ini_set('display_errors', 1 );

if ( $xlsx = SimpleXLSX::parseFile('books.xlsx', true ) ) {
	echo $xlsx->toHTML();
} else {
	echo SimpleXLSX::parseError();
}

Classic OOP style

$xlsx = new SimpleXLSX('books.xlsx'); // try...catch
if ( $xlsx->success() ) {
	print_r( $xlsx->rows() );
} else {
	echo 'xlsx error: '.$xlsx->error();
}

More examples here

Error Codes

SimpleXLSX::ParseErrno(), $xlsx->errno()

code message comment
1 File not found Where file? UFO?
2 Unknown archive format ZIP?
3 XML-entry parser error bad XML
4 XML-entry not found bad ZIP archive
5 Entry not found File not found in ZIP archive
6 Worksheet not found Not exists

Installation

Linux

# change into php source files directory
cd php-5.x.x

# clone repository into php extension dir
git clone https://github.com/iliaal/php_excel.git ext/excel

# to build php7 module, you should use php7 git branch
cd ext/excel && git checkout php7 && cd ../..

# rebuild configure
./buildconf --force

# replace <PATH> with the file path to the extracted libxl files
# on a 32-bit platform use
./configure --with-excel --with-libxl-incdir=<PATH>/libxl-3.6.0.1/include_c --with-libxl-libdir=<PATH>/libxl-3.6.0.1/lib

# on a 64-bit platform use
./configure --with-excel --with-libxl-incdir=<PATH>/libxl-3.6.0.1/include_c --with-libxl-libdir=<PATH>/libxl-3.6.0.1/lib64

History

v0.8.18 (2020-07-21) fixed hyperlinks v0.8.17 (2020-06-15) fixed version number, added relative pathes a/../b support in relations v0.8.16 (2020-06-14) fixed abs pathes in relations v0.8.15 (2020-04-28) fixed LibreOffice xml specificity, thx stephengmatthews v0.8.14 (2020-04-03) fixed Office for Mac relations v0.8.13 (2020-02-19) removed skipEmptyRows property (xml optimization always), added static parseFile & parseData v0.8.12 (2020-01-22) remove empty rows (opencalc) v0.8.11 (2020-01-20) changed formats source priority v0.8.10 (2019-11-07) skipEmptyRows improved v0.8.9 (2019-08-15) fixed release version v0.8.8 (2019-06-19) removed list( $x, $y ), added bool $xlsx->skipEmptyRows, $xlsx->parseFile( $filename ), $xlsx->parseData( $data ), release 0.8.8 v0.8.7 (2019-04-18) empty rows fixed, release 0.8.7 v0.8.6 (2019-04-16) 1900/1904 bug fixed v0.8.5 (2019-03-07) SimpleXLSX::ParseErrno(), $xlsx->errno() returns error code v0.8.4 (2019-02-14) detect datetime values, mb_string.func_overload=2 support .!. Bitrix v0.8.3 (2018-11-14) getCell — fixed empty cells and rows, safe now, but very slow v0.8.2 (2018-11-09) fix empty cells and rows in rows() and rowsEx(), added setDateTimeFormat( $see_php_date_func ) v0.8.1 rename simplexlsx.php to SimpleXLSX.php, rename parse_error to parseError fix _columnIndex, add ->toHTML(), GNU to MIT license v0.7.13 (2018-06-18) get sheet indexes bug fix v0.7.12 (2018-06-17) $worksheet_id to $worksheet_index, sheet numeration started 0 v0.7.11 (2018-04-25) rowsEx(), added row index «r» to cell info v0.7.10 (2018-04-21) fixed getCell, returns NULL if not exits v0.7.9 (2018-03-17) fixed sheetNames() (namespaced or not namespaced attr) v0.7.8 (2018-01-15) remove namespace prefixes (hardcoded) v0.7.7 (2017-10-02) XML External Entity (XXE) Prevention (]>) v0.7.6 (2017-09-26) if worksheet_id === 0 (default) then detect first sheet (for LibreOffice capabilities) v0.7.5 (2017-09-10) ->getCell() — fixed v0.7.4 (2017-08-22) ::parse_error() — to get last error in «static style» v0.7.3 (2017-08-14) ->_parse fixed relations reader, added ->getCell( sheet_id, address, format ) for direct cell reading v0.7.2 (2017-05-13) ::parse( $filename ) helper method v0.7.1 (2017-03-29) License added v0.6.11 (2016-07-27) fixed timestamp() v0.6.10 (2016-06-10) fixed search entries (UPPERCASE) v0.6.9 (2015-04-12) $xlsx->datetime_format to force dates out v0.6.8 (2013-10-13) fixed dimension() where 1 row only, fixed rowsEx() empty cells indexes (Daniel Stastka) v0.6.7 (2013-08-10) fixed unzip (mac), added $debug param to _constructor to display errors v0.6.6 (2013-06-03) +entryExists() v0.6.5 (2013-03-18) fixed sheetName() v0.6.4 (2013-03-13) rowsEx(), _parse(): fixed date column type & format detection v0.6.3 (2013-03-13) rowsEx(): fixed formulas, added date type ‘d’, added format ‘format’ dimension(): fixed empty sheet dimension + sheetNames() — returns array( sheet_id => sheet_name, sheet_id2 => sheet_name2 …) v0.6.2 (2012-10-04) fixed empty cells, rowsEx() returns type and formulas now v0.6.1 (2012-09-14) removed «raise exception» and fixed _unzip v0.6 (2012-09-13) success(), error(), __constructor( $filename, $is_data = false ) v0.5.1 (2012-09-13) sheetName() fixed v0.5 (2012-09-12) sheetName() v0.4 sheets(), sheetsCount(), unixstamp( $excelDateTime ) v0.3 — fixed empty cells (Gonzo patch)

TL;DR

$phpExcelObject = $this->get('phpexcel')->createPHPExcelObject();

Create an object from a file:

$phpExcelObject = $this->get('phpexcel')->createPHPExcelObject('file.xls');

Create a Excel5 and write to a file given the object:

$writer = $this->get('phpexcel')->createWriter($phpExcelObject, 'Excel5');
$writer->save('file.xls');

Create a Excel5 and create a StreamedResponse:

$writer = $this->get('phpexcel')->createWriter($phpExcelObject, 'Excel5');
$response = $this->get('phpexcel')->createStreamedResponse($writer);

Create a Excel file with an image:

$writer = $this->get('phpexcel')->createPHPExcelObject();
$writer->setActiveSheetIndex();
$activesheet = $writer->getActiveSheet();

$drawingobject = $this->get('phpexcel')->createPHPExcelWorksheetDrawing();
$drawingobject->setName('Image name');
$drawingobject->setDescription('Image description');
$drawingobject->setPath('/path/to/image');
$drawingobject->setHeight(60);
$drawingobject->setOffsetY(20);
$drawingobject->setCoordinates('A1');
$drawingobject->setWorksheet($activesheet)

Advanced usage

Export multiple sheets

Export multiple sheets by creating a :

$sheets = new SheetCollection();
(new FastExcel($sheets))->export('file.xlsx');

Use index to specify sheet name:

$sheets = new SheetCollection();

Import multiple sheets


Import multiple sheets by using :

$sheets = (new FastExcel)->importSheets('file.xlsx');

You can also import a specific sheet by its number:

$users = (new FastExcel)->sheet(3)->import('file.xlsx');

Export large collections with chunk

function usersGenerator() {
    foreach (User::cursor() as $user) {
        yield $user;
    }
}

// Export consumes only a few MB, even with 10M+ rows.
(new FastExcel(usersGenerator()))->export('test.xlsx');

Using setters

In the example above, the minimum code without setters was used. The data types (for example: a string, a one-dimensional array, or a two-dimensional array) in this code is automatically recognized and the necessary setter is chose. But if we want to use a specific setter, the same code will look like this:

At the moment the extension has 3 kinds of setters:

  • CellSetterStringValue (for string values)
  • CellSetterArrayValue (for one-dimensional arrays)
  • CellSetterArray2DValue (for two-dimensional arrays)

You ask, what for specify setters explicitly?

  • First, because it’s flexible: let’s say you want to create your own setter with your own algorithms that eliminate the side effects, which I mentioned above.
  • Secondly, in each setter, you can pass a callback function in which we can change the styles of the inserted cells. For example, you need to highlight with bold font the employees who made the best sales in this month.

Examples of code that uses all kinds of setters are listed in the folder «samples».

Usage

Exporting Data

Exporting data into an excel file.

<?php

// export data only one worksheet.

\moonland\phpexcel\Excel::widget([
	'models' => $allModels,
	'mode' => 'export', //default value as 'export'
	'columns' => , //without header working, because the header will be get label from attribute label. 
	'headers' => , 
]);

\moonland\phpexcel\Excel::export(, //without header working, because the header will be get label from attribute label. 
	'headers' => ,
]);

// export data with multiple worksheet.

\moonland\phpexcel\Excel::widget(, 
	'mode' => 'export', //default value as 'export' 
	'columns' => , 
		'sheet2' => , 
		'sheet3' => 
	],
	//without header working, because the header will be get label from attribute label. 
	'headers' => , 
		'sheet2' => , 
		'sheet3' => 
	],
]);

\moonland\phpexcel\Excel::export(, 'columns' => , 
		'sheet2' => , 
		'sheet3' => 
	], 
	//without header working, because the header will be get label from attribute label. 
	'headers' => ,
		'sheet2' => ,
		'sheet3' => 
	],
]);

New Feature for exporting data, you can use this if you familiar yii gridview. That is same with gridview data column. Columns in array mode valid params are ‘attribute’, ‘header’, ‘format’, ‘value’, and footer (TODO). Columns in string mode valid layout are ‘attribute:format:header:footer(TODO)’.

<?php
  
\moonland\phpexcel\Excel::export(,
      		'like_it:text:Reader like this content',
      		'created_at:datetime',
      		,
      	],
      	'headers' => ,
]);
	  

Importing Data

Import file excel and return into an array.

<?php

$data = \moonland\phpexcel\Excel::import($fileName, $config); // $config is an optional

$data = \moonland\phpexcel\Excel::widget([
		'mode' => 'import', 
		'fileName' => $fileName, 
		'setFirstRecordAsKeys' => true, // if you want to set the keys of record column with first record, if it not set, the header with use the alphabet column on excel. 
		'setIndexSheetByName' => true, // set this if your excel data with multiple worksheet, the index of array will be set with the sheet name. If this not set, the index will use numeric. 
		'getOnlySheet' => 'sheet1', // you can set this property if you want to get the specified sheet from the excel data with multiple worksheet.
	]);

$data = \moonland\phpexcel\Excel::import($fileName, [
		'setFirstRecordAsKeys' => true, // if you want to set the keys of record column with first record, if it not set, the header with use the alphabet column on excel. 
		'setIndexSheetByName' => true, // set this if your excel data with multiple worksheet, the index of array will be set with the sheet name. If this not set, the index will use numeric. 
		'getOnlySheet' => 'sheet1', // you can set this property if you want to get the specified sheet from the excel data with multiple worksheet.
	]);

// import data with multiple file.

$data = \moonland\phpexcel\Excel::widget(, 
		'setFirstRecordAsKeys' => true, // if you want to set the keys of record column with first record, if it not set, the header with use the alphabet column on excel. 
		'setIndexSheetByName' => true, // set this if your excel data with multiple worksheet, the index of array will be set with the sheet name. If this not set, the index will use numeric. 
		'getOnlySheet' => 'sheet1', // you can set this property if you want to get the specified sheet from the excel data with multiple worksheet.
	]);

$data = \moonland\phpexcel\Excel::import(, [
		'setFirstRecordAsKeys' => true, // if you want to set the keys of record column with first record, if it not set, the header with use the alphabet column on excel. 
		'setIndexSheetByName' => true, // set this if your excel data with multiple worksheet, the index of array will be set with the sheet name. If this not set, the index will use numeric. 
		'getOnlySheet' => 'sheet1', // you can set this property if you want to get the specified sheet from the excel data with multiple worksheet.
	]);

Result example from the code on the top :

Getting started

<?php
    
// init excel work book as xlsx
$useXlsxFormat = true;
$xlBook = new \ExcelBook('<YOUR_LICENSE_NAME>', '<YOUR_LICENSE_KEY>', $useXlsxFormat);
$xlBook->setLocale('UTF-8');

// add sheet to work book
$xlSheet1 = $xlBook->addSheet('Sheet1');

// create a small sample data set
$dataset = ,
    
];

// write data set to sheet
$row = 1;
foreach($dataset as $item){
    $xlSheet1->writeRow($row, $item);
    $row++;
}

// write sum formula under data set
$col = 1;
$xlSheet1->write($row, $col, '=SUM(B1:B3)');

// add second sheet to work book
$xlSheet2 = $xlBook->addSheet('Sheet2');

// add a date with specific date format to second sheet
$row = 1; $col = ;
$date = new \DateTime('2014-08-02');
$dateFormat = new \ExcelFormat($xlBook);
$dateFormat->numberFormat(\ExcelFormat::NUMFORMAT_DATE);
$xlSheet2->write($row, $col, $date->getTimestamp(), $dateFormat, \ExcelFormat::AS_DATE);

// save workbook
$xlBook->save('test.xlsx');

10 ответов

50 Лучший ответ

Просто попробуйте следующее:

Часть PHP:

Я думаю, это поможет вам решить вашу проблему.

29 март 2013, в 11:04 Поделиться 13

Попробуйте этот код. Он определенно работает.

18 нояб. 2014, в 07:25 Поделиться 8


PHPExcel — ваш друг. Очень прост в использовании и работает как шарм.

31 окт. 2013, в 23:21 Поделиться 3

Я думаю, вы должны попробовать с этим API

С помощью этого

29 март 2013, в 09:18 Поделиться 2

Если вы просто хотите, чтобы ваши данные запроса сбрасывались в excel, я должен делать это часто, а использование html-таблицы — очень простой метод. Я использую mysqli для запросов db и следующий код для экспорта в excel:

27 янв. 2017, в 17:59 Поделиться 2

Попробуйте этот код:

31 окт. 2013, в 22:09 Поделиться 1

Попробуйте следующий код. просто обновите два значения. 1.your_database_name 2.table_name

17 дек. 2016, в 19:56 Поделиться 1

Посты John Peter и Dileep kurahe помогли мне разработать то, что я считаю более простым и чистым решением, на всякий случай, когда кто-то еще смотрит. (Я не показываю код базы данных, потому что на самом деле я использовал переменную $_SESSION.)

Вышеупомянутые решения неизменно вызывали ошибку при загрузке в Excel, а расширение не соответствовало типу форматирования. Некоторые из этих решений создают электронную таблицу с данными на странице в столбцах, где было бы более традиционным иметь заголовки столбцов и перечислять данные по строкам. Итак, вот мое простое решение:

  • Изменить на .csv(какой Excel мгновенно обновляется до .xls и при загрузке нет ошибки.)
  • Используйте запятую как разделитель.
  • Двойная цитата Ключ и значение, чтобы избежать каких-либо запятых в данных.
  • Я также добавил заголовки столбцов к , чтобы таблица выглядела еще лучше.

29 фев. 2016, в 23:48 Поделиться

Это новая версия php-кода

11 апр. 2017, в 06:36 Поделиться

попробуйте этот код


data.php

код для файла excel

export.php

если версия mysqli

​​

22 нояб. 2015, в 17:16 Поделиться

Ещё вопросы

  • 512Когда использовать одинарные, двойные и обратные тики в MySQL
  • 378Конвертировать из даты и времени MySQL в другой формат с помощью PHP
  • 325MySQL или PDO — каковы плюсы и минусы?
  • 197MySQL запрос, чтобы получить имена столбцов?
  • 190PDOException «не удалось найти драйвер»
  • 180PHP / MySQL вставьте строку, затем получите ‘id’
  • 60Как использовать несколько баз данных в Laravel
  • 35Laravel $ q-> где () между датами
  • 21Возвращенный набор записей закрыт (доступ к базе данных mysql через ODBC в VBA)
  • 144PHP MySQL Google Chart JSON — полный пример

Экспорт данных из MySQL в Excel на PHP

А еще чтобы Вы понимали, какие данные я выгружаю, приведу пример простой таблицы в БД (у меня ее название test):

Тестовая таблица:

id firstname name
1 Иванов Иван
2 Петров Петр
2 Петров2 Петр2

Код:

   
   <?php
        mysql_connect ("localhost", "root","");//подключение к серверу
        mysql_select_db("test") or die (mysql_error());//выбор базы данных
        mysql_query('SET character_set_database = utf8'); 
        mysql_query ("SET NAMES 'utf8'");
        error_reporting(E_ALL); 
        ini_set("display_errors", 1);
        
   if( !defined( "ExcelExport" ) ) {
    define( "ExcelExport", 1 );
      class ExportToExcel {
        var $xlsData = ""; 
        var $fileName = ""; 
        var $countRow = 0; 
        var $countCol = 0; 
        var $totalCol = 3;//общее число  колонок в Excel
                //конструктор класса
        function __construct (){
                $this->xlsData = pack( "ssssss", 0x809, 0x08, 0x00,0x10, 0x0, 0x0 );
        }
                // Если число
        function RecNumber( $row, $col, $value ){
                $this->xlsData .= pack( "sssss", 0x0203, 14, $row, $col, 0x00 );
                $this->xlsData .= pack( "d", $value );
                return;
        }
                //Если текст
        function RecText( $row, $col, $value ){
                $len = strlen( $value );
                $this->xlsData .= pack( "s*", 0x0204, 8 + $len, $row, $col, 0x00, $len);
                $this->xlsData .= $value;
                return;
        }
                // Вставляем число
        function InsertNumber( $value ){
                if ( $this->countCol == $this->totalCol ) {
                        $this->countCol = 0;
                        $this->countRow++;
                }
                $this->RecNumber( $this->countRow, $this->countCol, $value );
                $this->countCol++;
                return;
        }
                // Вставляем текст
        function InsertText( $value ){
                if ( $this->countCol == $this->totalCol ) {
                        $this->countCol = 0;
                        $this->countRow++;
        }
                $this->RecText( $this->countRow, $this->countCol, $value );
                $this->countCol++;
                return;
        }
                // Переход на новую строку
        function GoNewLine(){
                $this->countCol = 0;
                $this->countRow++;
                return;
                }
                //Конец данных
        function EndData(){
                $this->xlsData .= pack( "ss", 0x0A, 0x00 );
                return;
        }
                // Сохраняем файл
        function SaveFile( $fileName ){
                $this->fileName = $fileName;
                $this->SendFile();
        }
                // Отправляем файл
        function SendFile(){
                $this->EndData();
                header ( "Last-Modified: " . gmdate("D,d M YH:i:s") . " GMT" );
                header ( "Cache-Control: no-store, no-cache, must-revalidate" );
                header ( "Pragma: no-cache" );
                header ( "Content-type: application/x-msexcel" );
                header ( "Content-Disposition: attachment; fileName=$this->fileName.xls" );
                print $this->xlsData;
         }
        } 
   }
        if(isset($_GET)) {
                //фильтруем данные
   $id = mysql_real_escape_string(stripslashes(trim(htmlspecialchars($_GET,ENT_QUOTES))));
                $filename = 'Файл_с_id_'.$id; // задаем имя файла
                $excel = new ExportToExcel(); // создаем экземпляр класса
                $sql="SELECT * FROM  test.test where id = $id";//запрос к базе
                $rez=mysql_query($sql);
                $excel->InsertText('Идентификатор');
                $excel->InsertText('Фамилия');
                $excel->InsertText('Имя');
                $excel->GoNewLine();
        While($row=mysql_fetch_assoc($rez)){
                $excel->InsertNumber($row);
                $excel->InsertText($row);
                $excel->InsertText($row);
                $excel->GoNewLine();
        }
        $excel->SaveFile($filename);
   } 
   ?>

Вся идея здесь заключается в функции pack(), которая упаковывает данные в бинарную строку, а мы в свою очередь последовательно заполняем эту строку данными, которые мы выгрузили из базы данных MySql с помощью обычной функции mysql_query().

Для того чтобы проверить работоспособность данного кода, с учетом того, что Вы настроили подключение к базе данных и создали аналогичную таблицу, можете послать такой запрос:

   
   http://ваш_сайт/название _файла. php?id=2

И у Вас должно выгрузиться две строки с id равным 2.

И теперь каждый, которому Вы разрешите выгружать данные может легко экспортировать их на свой локальный компьютер через web интерфейс. Данный способ удобен как для корпоративных пользователей, если Вы разрабатываете приложение для своей организации, так и для пользователей Вашего web сайта в Интернете. Надеюсь, данный способ Вам помог. Удачи!

НравитсяНе нравится


С этим читают