Страница 1 из 2

Экспорт в Excel

Добавлено: 04 июл 2006, 16:31
Виталик
Кто-нибудь, подскажите, плиз, какой-то проверенный способ экспорта данных в Excel на PHP.

Добавлено: 04 июл 2006, 17:03
Oscar
То что я использую:

1. csv
рядки - строки
колонки разделены ;
если нужно перенос строки внутри колонки - строка берётся в скобки
echo "\"first \n second\"";

2. html
более извращённый вариант
на PHP рисую HTML таблицу с CSS стилями, выглядит получше

Ну и всё это выдаётся:

Код: Выделить всё

header("Content-type: application/vnd.ms-excel");
header('Content-disposition: attachment; filename="report_' . date("Y-m-d") . '.xls"');

print $output;

exit;
браузер предлагает открыть Excel автоматически,
откуда можно уже сохранить в нормальном xls формате ..

Добавлено: 05 июл 2006, 12:49
Виталик
Oscar

надо ли для каждого из двух вариантов устанавливать дополнительные библиотеки?

если не трудно, дай простой полный пример.

Добавлено: 05 июл 2006, 14:59
Oscar
Виталик, в том-то и дело, что для этих вариантов дополнительные библиотеки не нужны.

Только я немного перепутал, в первом варианте колонки разделяются не точкой с зяпятой, а символом табуляции (хотя, csv формат я тоже когда-то писал, кажется)

Итак, первый пример:

Код: Выделить всё

<?php

$output = "Nr\tName\n"; 

$names = array();
$names[count($names)] = "Name1";
$names[count($names)] = "Name2";
$names[count($names)] = "Name3";
$names[count($names)] = "Name4";
$names[count($names)] = "Name5";

foreach($names as $k=>$v) {

	$output .= "$k\t\"$v\n\"line break\"\n";

}

header("Content-type: application/vnd.ms-excel");
header('Content-disposition: attachment; filename="report_' . date("Y-m-d") . '.xls"');
print $output;
exit;

?>
и второй пример

Код: Выделить всё

<?php
header("Content-type: application/vnd.ms-excel");
header('Content-disposition: attachment; filename="report_' . date("Y-m-d") . '.xls"');
?>

<table>
<tr>
<td style="background-color: #FFFF00; text-align: center; font-weight: bold; border-right: .5pt solid black; border-bottom: 1pt solid black;">Column1</td>
<td style="background-color: #FFFF00; text-align: left; font-weight: bold; border-right: .5pt solid black; border-bottom: 1pt solid black;">Column2</td>
<td style="background-color: #FFFF00; text-align: left; font-weight: bold; border-right: .5pt solid black; border-bottom: 1pt solid black;">Column3</td>
</tr>

<tr>
<td style="background-color: #99CCFF; text-align: center; border-right: .5pt solid black; border-bottom: 1pt solid black;">1</td>
<td style="border-right: .5pt solid black; border-bottom: 1pt solid black;">field 2</td>
<td style="border-right: .5pt solid black; border-bottom: 1pt solid black;">field 3</td>
</tr>

<tr>
<td style="border-right: .5pt solid black; border-bottom: 1pt solid black; border-top: 1pt solid black;"></td>
<td style="background-color: #FFFF00; font-weight: bold; text-align: right; border-right: .5pt solid black; border-bottom: 1pt solid black; border-top: 1pt solid black;">something</td>
<td style="background-color: #FF9900; font-weight: bold; text-align: center; border: 1pt solid black; border-top: 1pt solid black;">test 
 line break</td>
</tr>
</table>

Добавлено: 06 июл 2006, 16:18
Виталик
Oscar,

спасибо, взял предложенный способ на вооружение.

по ходу возник такой вопрос: есть страничка на которой есть иконка "Экспорт в Excel", по клику на иконке открывается новое
окошко (php-файл) которое создаёт Excel-файл. как сделать чтобы после создания Excel-файл новое закрывалось? (в BODY
window.close() нельзя вставлять, надо вставить в конце скрипта, но то что пишу в конце автоматом добавляется в Excel-файл)

Добавлено: 06 июл 2006, 16:43
Виталик
Виталик,

всплыл один интересный момент: если рисовать таблицу в которой количество строк больше 6, то русский шрифт отображается аброкадаброй, есле же урезать количество до меньше равно 6, то русский отображается нормально.

Добавлено: 06 июл 2006, 17:15
Виталик
Oscar,

с кодировкой разобрался, осталоётся вопрос как закрыть новое окно после создания Excel-файла.

Добавлено: 06 июл 2006, 17:51
Oscar
Виталик, никак не получится,
это зависит от настроек браузера пользователя.

у меня, например, оно открывается не в новом окне, а сразу выскакивает окошко с вопросом "открыть/сохранить" (Фаерфокс)

Добавлено: 10 июл 2006, 16:34
Виталик
Oscar,

Можно ли чтобы отработал php-файл, который создаёт xls-файл, и при этом он не открывался в отдельной страничке, что-то наподобии:

<script type='text/javascript' language='javascript' id='run_php'></script>

<script type='text/javascript' language='javascript'>document.all.run_php.src='../php/my_php_file.php';</script>

Добавлено: 11 июл 2006, 01:15
Oscar
Виталик, нельзя, в стандартный аутпут PHP не может уже писать (нельзя отослать хэдэр, т.к. body уже отослан),
PHP может лишь рисовать JavaScript, но что это даст?..

Максимум, чего там можно добиться, это чтобы my_php_file.php писал в другой файл на сервере (больше некуда), с именем XXX.xls,
после чего на странице рисовать при помощи JS ссылку на этот самый файл (XXX),
кроме того, в my_php_file.php нужно удалять старый файл и писать новый поверх.
НО! Старый файл всегда будет оставаться на сервере,
так что защитить его будет не просто.

другой вариант: сделать невидимый фрейм, и PHP пихать в него по src,
быть может тогда не будет появляться новое окно,
не пробовал, не знаю.

я бы сказал, что это всё извращения,
но выбирать тебе.