[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как отправить таблицу на печать?
zvezda_t
Здравствуйте, уважаемые программисты! smile.gif

Подскажите мне пожалуйста, как решить такую задачу:

На php формирую таблицу и вывожу в браузер.
Теперь хочу распечатать данную таблицу в формате Excel.
Скачала класс для формирования Excel документов (PHPExcel),
вывод документа осуществляется так:
Цитата
// Redirect output to a client’s web browser (Excel5)
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="01simple.xls"');
header('Cache-Control: max-age=0');

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('php://output');


Вставить этот код в свой файл я не могу, ведь тогда весь мой код будет отправлен на печать.
Я сохранила все поля таблицы в двумерный массив $tab[][], как мне его передать в класс PHPExcel для формирования документа Excel?
Если делаю кнопку 'Печать' как ссылку и по ней переходя открываю файл где формируется excel документ, то я теряю свой массив $tab[][].

У меня такие мысли - или попробовать передать массив через сессию или в том файле рассчитывать таблицу заново.
Второе мне не очень нравится, зачем дважды таблицу рассчитывать, она же уже у меня сформирована.
Научите пожалуйста, как быть...



Спустя 5 часов, 53 минуты, 25 секунд (26.04.2011 - 14:47) zvezda_t написал(а):
ответьте мне пожалуйста, в сессию можно передавать большие массивы или это в корне не правильно???

Спустя 3 минуты, 25 секунд (26.04.2011 - 14:50) Игорь_Vasinsky написал(а):
вообще то вроде не принято.... можно обойтись одной сессионной переменно - а счита её - вытащить всё остальное.

Спустя 6 минут, 20 секунд (26.04.2011 - 14:57) Invis1ble написал(а):
zvezda_t
Цитата
ответьте мне пожалуйста, в сессию можно передавать большие массивы или это в корне не правильно???

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

Спустя 3 минуты, 49 секунд (26.04.2011 - 15:00) zvezda_t написал(а):
и как мне быть?
как мне передать мой массив на печать?

заново что ли его формировать?
что - делать то? подскажите пожалуйста...

Спустя 6 минут, 38 секунд (26.04.2011 - 15:07) Trianon написал(а):
от скрипта что нужно-то?
документ xls выдать пользователю для сохранения?
или документ для печати?

Спустя 44 минуты, 32 секунды (26.04.2011 - 15:52) Snus написал(а):
zvezda_t
Если у тебя на странице только таблица, то ты можешь послать ее заголовком в excel.

header ("Content-type:application/vnd.ms-excel");
echo '
<table>
<tr>
<td>1</td>
<td>2</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
</tr>
</table>'
;

Спустя 4 часа, 19 минут, 24 секунды (26.04.2011 - 20:11) zvezda_t написал(а):
Trianon
для сохранения) а для печати чем отличается?
Snus
в том то и дело, что там не одна таблица

Спустя 15 минут, 49 секунд (26.04.2011 - 20:27) zvezda_t написал(а):
а если не через заголовки, как еще можно документ в браузер отдать?
(я использую класс PHPExcel)

Спустя 10 часов, 16 минут, 5 секунд (27.04.2011 - 06:43) zvezda_t написал(а):
Вот иcпользуя Com объекты, можно же только сам объект в браузер отправить?
вот так: (но у меня не работает)
Сделала кнопку

print "<input type='button' name='pechat1' onClick=\"location.href='excel_file/dct_excel_1.php'\" value='Печать-Com'>";


dct_excel_1.php:
 $xls = new COM("Excel.Application"); // Создаем новый COM-объект
$xls->Application->Visible = 1; // Заставляем его отобразиться
$xls->Workbooks->Add(); // Добавляем новый документ

$rangeValue = $xls->Range("A1");
$rangeValue->Value = "В выделенном блоке текст будет жирный, подчеркнутый, наклонный";
$rangeValue = $xls->Range("A2");
$rangeValue->Value = "Шрифт будет иметь высоту 12";
$rangeValue = $xls->Range("A3");
$rangeValue->Value = "Имя шрифта - Times New Roman";


При нажатии на кнопку в браузере (IE6) открывает пустое окно и никакой реакции.

А если я класс PHPExcel использую, объект этого класса как мне в браузер отправить?

У меня получилось создать документ Excel используя класс PHPExcel, но в примере нашла только как отправить его в браузер через заголовки или как его сохранить на сервере.

//1)отправляем в браузер через заголовки
// Redirect output to a client’s web browser (Excel5)

header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="01simple.xls"');
header('Cache-Control: max-age=0');

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('php://output');

//2)сохраняем
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save(str_replace('.php', '.xlsx', __FILE__));


Через заголовки не могу, у меня на этой страничке еще много чего не нужного выводиться...
Как же мне его открыть?

Спустя 58 минут, 3 секунды (27.04.2011 - 07:41) Basili4 написал(а):
сохраняй на сервере. и покажи пользователю ссылку на этот документ пользователь щелакет и получает свой файл.

Спустя 3 минуты, 18 секунд (27.04.2011 - 07:44) zvezda_t написал(а):
А потом с сервера как удалить?
у меня же там места не много(

Спустя 3 минуты, 15 секунд (27.04.2011 - 07:47) Basili4 написал(а):
Проверяй дату создания файла если старый файл вали его.

Спустя 6 минут, 54 секунды (27.04.2011 - 07:54) zvezda_t написал(а):
Basili4 а пользователю предложить к себе сохранить файл точно никак нельзя?
не хочется мне на сервере хранить эти документы.

Спустя 4 минуты, 46 секунд (27.04.2011 - 07:59) UnWind написал(а):
Как то мучался с классом PHPExcel, но хотел при помощи него сделать так, что бы запись в блог добавлялась из файла Excel.
Т.е. пользователь создает некий файлик - это и есть запись в блоге, позиционирует в нем все изображения, форматирует текст и загружает его, после чего все формируется в BB коды и импортится в базу и появляется запись...
Но так и не сделал, но может тут чем нибудь помогу...
В чем суть то ? Я прочитал всю тему, но так и не понял, что нужно сделать.

То, что я понял:
Цитата

Берем информацию скажем из базы, формируем файлик Excel, предлогаем пользователю распечатать/сохранить, но при этом файлик не регистрируется на жестаке сервера

Верно ?

Спустя 1 минута, 50 секунд (27.04.2011 - 08:01) Basili4 написал(а):
UnWind
сгенерить файл и отдать пользователю

Спустя 1 минута, 58 секунд (27.04.2011 - 08:03) zvezda_t написал(а):
UnWind
всё верно!

Спустя 3 минуты, 39 секунд (27.04.2011 - 08:07) UnWind написал(а):
zvezda_t
Хм. Хорошо, попробую, что нибудь придумать.
Но не обещаю, первый опыт с PHPExcel был не успешным, как уже описал выше... sad.gif
Так, что не обещаю. smile.gif

З.Ы.:> Хотя сделать временный файл, было бы гораздо проще, а именно после отклонения пользователем например сохранить его - файл удаляется, при согласии - файл сохраняется на сервере скажем на 60 минут.

Спустя 25 минут, 26 секунд (27.04.2011 - 08:32) zvezda_t написал(а):
Выкладываю подробно что у меня сейчас есть:
В своём файле php сформировала таблицу, значения её сохранила в массив $m_tab.
сделала кнопочку 'Печать'.
Вся проблема в строке:

Цитата
//ЗДЕСЬ МНЕ НУЖЕН МОЙ МАССИВ
$m_tab;//как мне его передать в файл dct_excel_v1.php???




1)

//тут сформировался массив $m_tab
print_r( $m_tab);
print "<input type='button' name='pechat4' onClick=\"location.href='excel_file/dct_excel_v1.php'\" value='Печать'>";




2)
dct_excel_v1.php

//класс для работы с Excel
/** PHPExcel */
require_once 'Classes/PHPExcel.php';

//ЗДЕСЬ МНЕ НУЖЕН МОЙ МАССИВ
$m_tab;//как его передать в этот файл я не знаю(

//количество строк в массиве

$kt=count($m_tab);

// Create new PHPExcel object
$objPHPExcel = new PHPExcel();

// Set properties
$objPHPExcel->getProperties()->setCreator("Maarten Balliauw")
->
setLastModifiedBy("Maarten Balliauw")
->
setTitle("Office 2007 XLSX Test Document")
->
setSubject("Office 2007 XLSX Test Document")
->
setDescription("Test document for Office 2007 XLSX, generated using PHP classes.")
->
setKeywords("office 2007 openxml php")
->
setCategory("Test result file");

// Add some data
$objPHPExcel->setActiveSheetIndex(0)
->
setCellValue('A1', "Отчет");

$m_col_excel=array('A','B','C','D','E','F','G','H','I','J');

//активный лист
$aSheet = $objPHPExcel->getActiveSheet();

//устанавливаем ширину
$aSheet->getColumnDimension('A')->setWidth(5);
$aSheet->getColumnDimension('C')->setWidth(20);
$aSheet->getColumnDimension('E')->setWidth(15);
$aSheet->getColumnDimension('H')->setWidth(13);
$aSheet->getColumnDimension('I')->setWidth(15);
$aSheet->getColumnDimension('J')->setWidth(20);

//формат заголовка
$aSheet->getStyle('A1')->getFont()->setSize(12);
$aSheet->getStyle('A1')->getFont()->setBold(true);
$aSheet->getStyle('A1')->getFont()->setUnderline(PHPExcel_Style_Font::UNDERLINE_SINGLE);

//подключаем класс стилей
$sharedStyle1 = new PHPExcel_Style();

//внутренняя рамка таблицы
$sharedStyle1->applyFromArray(
array(
'borders' => array(
'bottom' => array('style' => PHPExcel_Style_Border::BORDER_THIN),
'right' => array('style' => PHPExcel_Style_Border::BORDER_THIN)
)
));


//настройки для шрифтов
$boldFont = array(
'font'=>array(
//'name'=>'Arial Cyr',
'size'=>'10',
'bold'=>true
)
);

//и позиционирование
$center = array(
'alignment'=>array(
'horizontal'=>PHPExcel_Style_Alignment::HORIZONTAL_CENTER,
'vertical'=>PHPExcel_Style_Alignment::VERTICAL_CENTER//VERTICAL_TOP
)
);

$center_v = array(
'alignment'=>array(
'horizontal'=>PHPExcel_Style_Alignment::HORIZONTAL_LEFT,
'vertical'=>PHPExcel_Style_Alignment::VERTICAL_TOP
)
);


//оформляем рамку таблицы
$aSheet->setSharedStyle($sharedStyle1, "A3:J".(3+$kt));

//массив по столбцам таблицы
foreach ($m_col_excel as $key=>$col)
{
//установим жирный шрифт для заголовков и заодно отцентрируем
$aSheet->getStyle($col.'3')->applyFromArray($boldFont)->applyFromArray($center);
//перенос строк
$aSheet->getStyle($col.'3')->getAlignment()->setWrapText(true);

//заполняем таблицу-----------------------
for($j=0; $j<$kt; $j++)
{
//начальная строка таблицы
$r=4+$j;

//отцентрируем
$aSheet->getStyle($col.$r)->applyFromArray($center_v);

//перенос строк
if($col!='B')
$aSheet->getStyle($col.$r)->getAlignment()->setWrapText(true);

if($col=='A') $aSheet->setCellValue('A'.$r, ($j+1) );
else $aSheet->setCellValue($col.$r, $m_tab[$j][$key-1]);
}
}


// Rename sheet
$aSheet->setTitle('Отчет');

// Set active sheet index to the first sheet, so Excel opens this as the first sheet
$objPHPExcel->setActiveSheetIndex(0);

// Redirect output to a client’s web browser (Excel5)
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="doc_excel.xls"');
header('Cache-Control: max-age=0');

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('php://output');
exit;

Спустя 1 час, 2 минуты, 16 секунд (27.04.2011 - 09:34) Игорь_Vasinsky написал(а):
Цитата
//ЗДЕСЬ МНЕ НУЖЕН МОЙ МАССИВ
$m_tab[];


может:
$m_tab;

Спустя 1 минута, 36 секунд (27.04.2011 - 09:36) inpost написал(а):
zvezda_t
я так и не понял последнего вопроса!

Спустя 6 минут, 3 секунды (27.04.2011 - 09:42) Basili4 написал(а):
inpost
офф топ у всех растут + в карме а у inposta уменьшаются минусики прикольно.

Спустя 2 минуты, 34 секунды (27.04.2011 - 09:44) zvezda_t написал(а):
Игорь_Vasinsky, да. $m_tab;

inpost
Не знаю я как отправить на печать свою таблицу(((
массив у меня в одном файле создаётся, а документ Excel в другом файле.

Спустя 7 минут, 21 секунда (27.04.2011 - 09:52) Игорь_Vasinsky написал(а):
Создавай новую страницу, подключай класс, передовай массив, который хочешь распечать - и рисуй кнопку "печать" - и печатай.

Зачем запарки нужны с несколькими таблицами на одной странице, или массив сразу содержит несколько таблиц?

Передать массив (или часть массива) можно через POST

<form method='POST' action='createTable.php'>
<!--
вывод твоей таблицы (массива)-->
<
input type='hidden' name='table' value='<?php массив; ?>'>
<
input type button='submit' value='распечатать?'>
</
form>
а на странице createTable.php подключай класс, формируй таблицу и JS запуск на печать.

Спустя 15 минут (27.04.2011 - 10:07) walerus написал(а):
А если попробовать так:


//тут сформировался массив $m_tab
print_r( $m_tab);
print "<input type='button' name='pechat4' onClick=\"location.href='excel_file/dct_excel_v1.php?m_tab=".$m_tab."'\" value='Печать'>";



а в файле 2) dct_excel_v1.php, прописать что то типа


Цитата
//ЗДЕСЬ МНЕ НУЖЕН МОЙ МАССИВ
$m_tab;//как его передать в этот файл я не знаю(


if (isset($_REQUEST['m_tab']))
$m_tab = $_REQUEST['m_tab']; // Передали сюда массив
else
$m_tab = array();

или я не так все понял ?




Спустя 1 час, 18 минут, 6 секунд (27.04.2011 - 11:25) zvezda_t написал(а):
walerus
$m_tab, это двумерный массив, не думаю что его можно в переменную $_Get[] засунуть.
а что такое $_REQUEST? :rolleyes:


Игорь_Vasinsky
Вот я тормоз! Спасибо большое))))))))

print_r($m_tab);//тут отображается мой двумерный массив
// Преобразовываем полученный массив в строку с помощью функции serialize():

$str_m_tab = serialize($m_tab);
print "
<form method='POST' action='excel_file/dct_excel.php'>
<input type='hidden' name='m_tab' name='m_tab' value='"
.$str_m_tab."'>
<input type='submit' id='pechat' name='pechat' value='Печать-submit'>
</form>"
;


в файле dct_excel.php проверяю:
if(isset($_POST['m_tab']))
{
$m_tabp=$_POST['m_tab'];
// Распаковываем массив из строки, используя функцию unserialize()
$m_tab = unserialize($m_tabp);
print_r($m_tab);
print $m_tab[0][0];
}


Спустя 1 час, 46 секунд (27.04.2011 - 12:26) walerus написал(а):
Цитата (zvezda_t @ 27.04.2011 - 08:25)
а что такое $_REQUEST? :rolleyes:

$_REQUEST - массив, который приходит из формы GET или POST :rolleyes: ? а Вы не знали ?

Цитата

//тут сформировался массив $m_tab


Ни одного упоминания про двумерный массив :blink:


print_r($m_tab);//тут отображается мой двумерный массив
// Преобразовываем полученный массив в строку с помощью функции serialize():

$str_m_tab = serialize($m_tab);
print "
<form method='POST' action='excel_file/dct_excel.php'>
<input type='hidden' name='m_tab' name='m_tab' value='"
.$str_m_tab."'>
<input type='submit' id='pechat' name='pechat' value='Печать-submit'>
</form>"
;




Та же идея что и у меня только сериализованные данные предаются...
Согласен, удобнее, тем более что массив ДВУМЕРНЫЙ, как оказалось ;)


Спустя 18 минут, 43 секунды (27.04.2011 - 12:44) zvezda_t написал(а):
Цитата
Ни одного упоминания про двумерный массив

Извините rolleyes.gif
И спасибо Вам что откликнулись user posted image

Спустя 13 минут, 29 секунд (27.04.2011 - 12:58) walerus написал(а):
Велкам cool.gif

Спустя 2 месяца, 4 дня, 23 часа, 52 минуты, 25 секунд (2.07.2011 - 12:50) zvezda_t написал(а):
Появилась большая проблема!
Когда увеличила объём сериализованных данных предающихся через POST, потом в файле excel_file/dct_excel.php не возможно обратно превратить в массив.
Выходит ошибка.
Причем делаю проверку перед отправкой - всё нормально- туда сюда сериализуются.
Я так подозреваю слишком большой блок данных нельзя передавать через одну переменную POST. Как же быть?

Спустя 14 минут, 37 секунд (2.07.2011 - 13:05) Invis1ble написал(а):
zvezda_t
Насколько большой объем данных? желательно в байтах, можно приблизительно
Что за ошибка?

Пс. Ты про эту тему в СМС-ках кричишь? )

Спустя 15 минут, 7 секунд (2.07.2011 - 13:20) Invis1ble написал(а):
zvezda_t
Если объем данных больше, чем выдает var_dump(ini_get('post_max_size')); то попробуй увеличить этот параметр

Спустя 1 день, 19 часов, 35 минут, 8 секунд (4.07.2011 - 08:55) zvezda_t написал(а):
var_dump(ini_get('post_max_size')); выдает:
Цитата
string(2) "8M"



ошибка такая:
Цитата
Notice: unserialize() [function.unserialize]: Error at offset 30 of 3573 bytes

Спустя 1 час, 34 минуты, 8 секунд (4.07.2011 - 10:29) Invis1ble написал(а):
zvezda_t
Ошибка, насколько я понимаю, говорит о нарушении целостности (структуры) массива.
Вполне возможно, что из-за того, что часть массива "обрезается" при передаче, хотя не уверен. Попробуй увеличь post_max_size:
var_dump(ini_set('post_max_size', '32M'));

Спустя 1 час, 56 секунд (4.07.2011 - 11:30) zvezda_t написал(а):
Invis1ble
вставила:
var_dump(ini_set('post_max_size', '32M'));

вышло:
Цитата
bool(false)

Спустя 1 час, 3 минуты, 17 секунд (4.07.2011 - 12:33) Invis1ble написал(а):
zvezda_t
а, ну тогда вручную поменяй это значение в php.ini

Спустя 50 минут, 13 секунд (4.07.2011 - 13:24) zvezda_t написал(а):
изменила. Но это не помогло.

Спустя 5 минут, 58 секунд (4.07.2011 - 13:30) Invis1ble написал(а):
zvezda_t
А ошибка осталась та же? Я имею ввиду не поменялись ли цифры 30 of 3573 при тех же данных ?

Спустя 5 минут, 37 секунд (4.07.2011 - 13:35) zvezda_t написал(а):
Invis1ble, да, те же числа.

Скажите пожалуйста, а можно как нибудь отправить значения таблицы на печать, методом POST, с перенаправлением на другую страницу, но не прописывать адрес в теги формы?

Например, сейчас у меня работает так:
<form name='form1' method='POST'>
//кнопки, изменяющие значения полей таблицы
<input type='submit' name=...>
<input
type='submit' name=...>
<table>

//значения таблицы, которые нужно отправить на печать.
</table>
</form>


массив $tab содержит поля таблицы.
<form method='POST' action='excel_file/dct_excel_st.php'>
<input
type='hidden' name='tab' name='tab' value='".$tab."'>
<input
type='submit' id='pechat' name='pechat' value='Печать'>
</form>


В итоге у меня при нажатии на кнопку Печать выполняется dct_excel_st.php, который выводит в браузер документ excel.
А можно как нибудь объединить эти две формы, чтобы и кнопка Печать сработала и при нажатии кнопок из формы form1, не было выполнения dct_excel_st.php?

Спустя 29 минут, 49 секунд (4.07.2011 - 14:05) Invis1ble написал(а):
Цитата
Скажите пожалуйста, а можно как нибудь отправить значения таблицы на печать, методом POST, с перенаправлением на другую страницу, но не прописывать адрес в теги формы?

Цитата
А можно как нибудь объединить эти две формы, чтобы и кнопка Печать сработала и при нажатии кнопок из формы form1, не было выполнения dct_excel_st.php?

ну по идее да, можно. На js
Цитата
value='".$tab."'

я так понимаю, что здесь выводится сериализованный массив?
Если да, то я кажется понял, в чем дело smile.gif

Спустя 2 минуты, 26 секунд (4.07.2011 - 14:08) zvezda_t написал(а):
Цитата
ну по идее да, можно. На js

а как? может быть я бы тогда обошлась без сериализованного массива...user posted image

Цитата
я так понимаю, что здесь выводится сериализованный массив?
Если да, то я кажется понял, в чем дело

совершенно верно!
и в чем же? rolleyes.gif

Спустя 7 минут, 22 секунды (4.07.2011 - 14:15) Invis1ble написал(а):
zvezda_t
Видимо в сериализованном массиве встречается апостроф кавычка в одном из значений или ключей массива (или другой какой-то спецсимвол), в результате верстка "рвется" и в value оказывается только кусок массива. Решение:
$tab = htmlspecialchars(serialize($data));
echo '<input type="hidden" name="tab" value="' . $tab . '" />'; // обрати внимание, аттрибуты заключены именно в кавычки, а не в апострофы

в обработчике:
$data = unserialize(htmlspecialchars_decode($_POST['tab']));


ПС. Попробуй так пока что.

Спустя 13 минут, 18 секунд (4.07.2011 - 14:28) zvezda_t написал(а):
Invis1ble
ты гений!!!)
Получилось)
на самом деле я передавала пустые значения ячеек как &nbsp;, и естественно при выводе в браузер их даже не видела....
спасибо, тебе большое!!!!

Получается проблема не в размерности POST, а 8M - это какой объем данных rolleyes.gif ?

Спустя 3 минуты, 42 секунды (4.07.2011 - 14:32) Invis1ble написал(а):
zvezda_t
Цитата
8M - это какой объем данных?

в смысле? ) 8 мегабайт =)

ПС.
Цитата
ты гений!!!)

спасибо ) но я только учусь на него smile.gif

Спустя 14 минут, 3 секунды (4.07.2011 - 14:46) zvezda_t написал(а):
Invis1ble
а как одну форму из двух сделать? rolleyes.gif

Спустя 29 минут, 12 секунд (4.07.2011 - 15:15) Invis1ble написал(а):
Ну например type="submit" заменить на type="button" и повесить на них функции-обработчики событий onclick
<script type="text/javascript">
window.onload = function() {
document.getElementById('pechat').onclick = function() {
// тут отправляем данные и редирект
}
}

</script>
<!-- html -->
<input type='button' id='pechat' name='pechat' value='Печать' />
<!-- html -->

Вобще, чесно говоря я не силен в js, поэтому это все, что могу сказать )

Спустя 1 год, 1 месяц, 18 часов, 50 минут, 8 секунд (5.08.2012 - 10:05) Гость_star написал(а):
А ваш пользователь не может в браузере нажать ctrl+p ?


_____________

Что ты сделал сегодня - для завтра?
"Приидите ко Мне вси труждающиеся и обремененнии и Аз упокою вы, возмите иго Мое на себе и научитеся от Мене яко кроток есмь и смирен сердцем и обрящете покой душам вашим, иго бо Мое благо и бремя Мое легко есть."(Мф. 11:28-30)
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.