Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Сохранить результаты поиска (выборку) в Excel
 
 автор: Gandzas   (01.11.2006 в 08:13)   письмо автору
 
 

Есть страница для поиска, где пользователь задает необходимые ему параметры поиска. Методом post передаем на следующую страницу и выводим результат из БД.
Вопрос: Как сделать так, чтобы пользователь мог сохранить эту выборку (в Excel) к себе на локалку.
Вариант Ctrl+C >>> Ctrl+V не предлагать :)

   
 
 автор: Trianon   (01.11.2006 в 09:45)   письмо автору
 
   для: Gandzas   (01.11.2006 в 08:13)
 

Проще сохранить таблицу в виде CSV-файла. Excel их тоже открывает.


$sql = "SELECT * FROM tab";
$res = mysql_qyery($sql) or die ( "Error in $sql : ". mysql_error());
if(mysq_num_rows($res) > 0)
{
  header('Content-Type: application/vnd.ms-excel; name="table.csv"');
  header('Content-Disposition: attachment; filename="table.csv"');
  while(($row = mysql_fetch_assoc)) !== false) 
  {
    foreach($row as $column => $val)
    {
        // здесь нужно преобразовать типы данных даты-времени, дробных чисел и строки. 
        if(...)  $val = $val[8].$val[9].'.'.$val[5].$val[6].'.'.$val[0].$val[1].$val[2].$val[3].' '
                 .$val[11].$val[12].':' .$val[14].$val[15].':' .$val[17].$val[18]; // для даты-времени
        if(...)  $val = '"'.str_replace('.', ',', $val);  //  для дробных чисел
        if(...)  $val = '"'.str_replace('"', '""', $val);  // для строк

        $row[$column] = $val;
    }
    $row = implode(';', $row);
    echo($row."\r\n");
  }
}

   
 
 автор: Gandzas   (05.11.2006 в 02:48)   письмо автору
 
   для: Trianon   (01.11.2006 в 09:45)
 

Я так понимаю, что здесь
$res = mysql_qyery($sql) or die ( "Error in $sql : ". mysql_error());
ошибка в query
и здесь
if(mysq_num_rows($res) > 0)
надо писать mysql
Только все равно не получается... :(

   
 
 автор: st.Ass   (05.11.2006 в 08:46)   письмо автору
 
   для: Gandzas   (05.11.2006 в 02:48)
 

Сталкивался с этой проблемой, решение нашел такое -
http://softtime.ru/forum/read.php?id_forum=1&id_theme=25416&page=1

   
 
 автор: Gandzas   (07.11.2006 в 13:56)   письмо автору
 
   для: st.Ass   (05.11.2006 в 08:46)
 

Спасибо, пошла смотреть.

   
 
 автор: Trianon   (07.11.2006 в 14:22)   письмо автору
 
   для: Gandzas   (05.11.2006 в 02:48)
 

Прикрепите, пожалуйста,фрагмент дампа таблицы: структуру и несколько строк данных.
Тогда можно будет сделать скрипт непосредственно под Ваш случай.

   
 
 автор: Gandzas   (08.11.2006 в 01:32)   письмо автору
 
   для: Trianon   (07.11.2006 в 14:22)
 

Фрагмент дампа таблицы:


CREATE TABLE `baza` (
  `id` int(11) NOT NULL auto_increment,
  `data` varchar(11) NOT NULL default '',
  `tip` varchar(100) NOT NULL default '',
  `kk` varchar(30) NOT NULL default '',
.....
  `ktel` varchar(20) NOT NULL default '',
  PRIMARY KEY  (`id`),
  UNIQUE KEY `ktel` (`ktel`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=98 ;




Почти все поля текстовые, т.к. данные заносятся из csv файла (который формируется из файла Excel) и обрабатываются, к тому же, скриптом :)) В файле-исходнике полный бардак, телефон может быть сохранен, как текст и т.д., поэтому типы данных записываются "как есть" (текстом).

Данные выводятся в веб-таблицу корректно. Кавычек и точки с запятой в тексте нигде нет (кроме разделителей). Есть готовый файл-шаблон с названиями столбцов, куда нужно записать только данные, выбранные юзером. Экспорт в csv-файл тоже корректен из phpMyAdmin (тестила на локалке), а вот из веб записать выборку пока не получается...

   
 
 автор: Trianon   (08.11.2006 в 09:40)   письмо автору
 
   для: Gandzas   (08.11.2006 в 01:32)
 

Прошу прощения. В первом скрипте и вправду было изрядно опечаток....
Вот исправленный код:
<?php
$sql 
"SELECT id,data,tip,kk,ktel FROM baza"
$res mysql_query($sql) or die ( "Error in $sql : "mysql_error());
if(
mysql_num_rows($res) > 0)
{
  
header('Content-Type: application/vnd.ms-excel; name="table.csv"');
  
header('Content-Disposition: attachment; filename="table.csv"');
  while((
$row mysql_fetch_assoc($res)) !== false)
  {
    foreach(
$row as $column => $val)
    {
        
$val '"'.str_replace('"''""'$val).'"';  // для строк
        
$row[$column] = $val;
    }
    
$row implode(';'$row);
    echo(
$row."\r\n");
  }
}
?>

Оператор SELECT нужно будет изменить, указав нужные поля и добавив WHERE с условиями фильтра.

   
 
 автор: Gandzas   (10.11.2006 в 14:02)   письмо автору
 
   для: Trianon   (08.11.2006 в 09:40)
 

Warning: Cannot modify header information - headers already sent by (output started at /home/infotmi/public_html/index.php:8)

Warning: Cannot modify header information - headers already sent by (output started at /home/infotmi/public_html/index.php:8)

Что это значит?

   
 
 автор: Trianon   (10.11.2006 в 14:07)   письмо автору
 
   для: Gandzas   (10.11.2006 в 14:02)
 

это значит что где-то до этих строк выполняется вывод в браузер.
Возможно это команда echo, возможно какие-то символы пусть даже пробел или пустая строка до <?php или после ?>.

Собственно, место, где этот вывод был начат, Вам указали. 8 строка файла index.php

   
 
 автор: Gandzas   (10.11.2006 в 14:16)   письмо автору
 
   для: Trianon   (10.11.2006 в 14:07)
 

Ага... понятно. Спасибо. Исправила. А как теперь можно сделать, чтобы выборка сохранялась не в новый файл, а в уже готовый шаблон с названиями столбцов. Файл называется rent.xls и лежит в этой же директории.

   
 
 автор: Trianon   (10.11.2006 в 14:45)   письмо автору
 
   для: Gandzas   (10.11.2006 в 14:16)
 

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

   
 
 автор: Gandzas   (10.11.2006 в 14:51)   письмо автору
 
   для: Trianon   (10.11.2006 в 14:45)
 

А средствами php можно как-то прописать название столбцов, и, самое важное, задать их ширину. Потому что, например, 5Е+05 вместо 45000 в столбце "цена" очень сильно смущает пользователей. ..

   
 
 автор: Trianon   (10.11.2006 в 15:20)   письмо автору
 
   для: Gandzas   (10.11.2006 в 14:51)
 

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

.... 
header('Content-Type: application/vnd.ms-excel; name="table.csv"'); 
header('Content-Disposition: attachment; filename="table.csv"'); 
echo "ID;DATA;TIP;KK;TEL".   "\r\n";
while(($row = mysql_fetch_assoc($res)) !== false) 
....


Ширину столбцов в csv указать не получится.
В конце концов колонки не фиксированы и ничто не мешает сверху написать предложение растянуть столбцы до нужной ширины. Как минимум, если пользователи свои.
Если чужие - им обычно не нужен excel ( а тех, кому нужен, запись 5Е+05 не смутит, человек сам кликнет на границе столбца)

Можно также попробовать воспользоваться советом targa и вывести данные в формате XML,
там задать ширину столбцов проблемы не представляет.
Но это куда долее сложный, а главное - громоздкий формат. Для большого прайса файл будет иметь изрядный размер. Что, на мой взгляд, куда менее удобно.

   
 
 автор: Gandzas   (10.11.2006 в 16:07)   письмо автору
 
   для: Trianon   (10.11.2006 в 15:20)
 

По поводу названий столбцов - понятно. Спасибо.
По поводу пользователей, да, пользователи "свои", но, как бы Вам это объяснить...

"Утюг существует для глажки, стиральная машина - для стирки, а компьютер - для переписки. Компьютер, как вы, наверное, догадываетесь, состоит из нескольких частей: монитор, клавиатура, мышь и большой железный ящик"

Так что, предложение "растянуть столбцы до нужной ширины" может очень смутить...
А если в первую строку (названия столбцов) вставить картинки нужной ширины? Такое возможно?

   
 
 автор: Trianon   (10.11.2006 в 16:41)   письмо автору
 
   для: Gandzas   (10.11.2006 в 16:07)
 

> А если в первую строку (названия столбцов) вставить картинки нужной ширины? Такое возможно?

Нет.
В этом формате можно передавать только текстовые данные.

Между прочим. Даже если Вы сформируете XML-файл, не убежден, что удастся заставить на лету открывать этот файл на компьютерах пользователей именно Excel'ем.

А почему (для тех кто...) просто не вывести HTML-таблицу? В качестве альтернативного варианта?

   
 
 автор: Gandzas   (10.11.2006 в 16:56)   письмо автору
 
   для: Trianon   (10.11.2006 в 16:41)
 

HTML-таблица в любом случае выводится. Это уже к ней по просьбе трудящихся :) добавляется возможность "Сохранить в Excel и отправить по почте".

Но когда сходишь с ума от звонков "у меня нет первых двух столбцов" (горизонтальная полоса прокрутки) или "у меня вместо телефонов какие-то плюсики" (ширина столбца), :( то хочется сделать так, чтобы вопросов не было.

   
 
 автор: Gandzas   (10.11.2006 в 17:05)   письмо автору
 
   для: Gandzas   (10.11.2006 в 16:56)
 

Спасибо за помощь. Напишу я, наверное, хелпу в картинках и перестану Вам морочить голову. Как минимум, в этой теме. ;)

   
 
 автор: FroNiTy   (08.11.2006 в 02:22)   письмо автору
 
   для: Gandzas   (01.11.2006 в 08:13)
 

Для того что бы создать Excel документ нужно, что бы хостинг был на платформе Windows и на нем был установлен Excel. Есть эти условия выполняются, то надо рюхать в COM-объектах.

   
 
 автор: targa   (08.11.2006 в 10:07)   письмо автору
 
   для: FroNiTy   (08.11.2006 в 02:22)
 

>>Для того что бы создать Excel документ нужно, что бы хостинг был на платформе Windows и
>>на нем был установлен Excel. Есть эти условия выполняются, то надо рюхать в COM-объектах.
Хотя это самый удобный вариант, но не единственный. Можно создать XML-документ, отформатированный для Excel'я. В таком документе будет сохранены и данные, и форматирование.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования