Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: генерация файла excel на php  (Прочитано 15355 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Chuda
Гость
« : 09-08-2006 19:40 » 

поставили задачу - прайс-лист упаковывать в .xls и давать скачивать.
Эксельный формат закрытый, но удалось найти несколько xml-файлов, выдающих себя за .xls (или .xls это и в самом деле xml?), и отреинжинирить их.
Вот что получилось: http://www.comptorg.ru/price.xls (3Мб).
Просьба. Если здесь есть люди, которых не затруднит (и для кого три мегабайта не проблема) скачать файл и посмотреть, нормально ли он отображается в M$ Excel, OpenOffice.org или в чём ещё, на всяких разных ОС, в разных версиях этих программ, была бы очень признательна. И ещё, может кто-то имел уже опыт работы с M$-форматами? Правильно ли этот файл сделан? Я его делала по аналогии с теми файлами.xls, которые при открытии в текстовом редакторе оказывались XML.

Кстати, если кого тема заинтересует, могу поделиться классом для создания такого файла.
« Последнее редактирование: 10-08-2006 07:40 от Алексей1153 » Записан
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 10-08-2006 05:58 » 

in MS Excel  нормально отобразилось. Опубликуй здесь код для создания, думаю кому-то может пригодиться, если не сейчас, то позже Ага

Только сейчас заметил одну тонкость, у тебя там где цены не все числа имеет один и тот же формат. В принципе пользователь, если захочет, то сможет изменить формат, но все же ... .
Приведу пример:
Самый первый товар - Supermicro SYS-6014P-32RB, E7520, 2xSocket 604, FSB800, SAS/SATA, Video, LAN1000, 1U, 700 Вт
три цены (или что там) - 1721 воспринят как тескт, остальные два - как число.
Сам Эксель пишит, что "число либо отформатировано как текст, либо перед ним стоит апостроф".
Там где нумерация продуктов, там вообще  все такие числа.
« Последнее редактирование: 10-08-2006 06:05 от nikedeforest » Записан

ещё один вопрос ...
Kivals
Команда клуба

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 10-08-2006 06:38 » 

Это не xml, а html документ (с небольшой xml вставкой). Из условия перед этой вставкой ("if gte mso 9") следует (ИМХО), что офис должен быть версии 9.0 и выше.
Office XP - все Ок, с учетом замечаний nikedeforest
Office 2000 и ниже - нет под рукой, не проверял
Open Office 1.2 (ASP Linux) - 5 минут и устал ждать пока откроет. Снял приложение

А чтобы не 3 мега качать людям - заархивируй. Жмется до 350 кб zip-ом...
Записан
Chuda
Гость
« Ответ #3 : 10-08-2006 06:49 » 

Выкладываю.
Сильно прошу прощения, класс не универсален, жёстко заточен под конкретный прайс-лист, но я надеюсь, что код достаточно понятен и легко модифицируем.
Код:
<?php

class MSExcel
{

var 
$fp=null;

function MSExcel($file=""){
return $this->open($file);
}

function open($file){
$this->fp=fopen($file,"w+");
fwrite($this->fp,$this->writeHeader());
return $this->fp;
}

function close(){
fwrite($this->fp,$this->writeFooter());
fclose($this->fp);
return ;
}

function writeHeader(){
$header "<html xmlns:o=\"urn:schemas-microsoft-com:office:office\"
xmlns:x=\"urn:schemas-microsoft-com:office:excel\"
xmlns=\"http://www.w3.org/TR/REC-html40\">

<head>
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\" />
<meta http-equiv=\"Content-Language\" content=\"ru\" />
<meta name=\"ProgId\" content=\"Excel.Sheet\">
<!--[if gte mso 9]><xml>
 <o:DocumentProperties>
  <o:LastAuthor>Inga Mahovetzka</o:LastAuthor>
  <o:LastSaved>2005-01-02T07:46:23Z</o:LastSaved>
  <o:Version>10.2625</o:Version>
 </o:DocumentProperties>
 <o:OfficeDocumentSettings>
  <o:DownloadComponents/>
 </o:OfficeDocumentSettings>
</xml><![endif]-->
<style>
<!--table
{mso-displayed-decimal-separator:\"\.\";
mso-displayed-thousand-separator:\"\,\";}
@page
{margin:1.0in .75in 1.0in .75in;
mso-header-margin:.5in;
mso-footer-margin:.5in;}
tr
{mso-height-source:auto;}
col
{mso-width-source:auto;}
br
{mso-data-placement:same-cell;}
.style0
{mso-number-format:General;
text-align:general;
vertical-align:bottom;
white-space:nowrap;
mso-rotate:0;
mso-background-source:auto;
mso-pattern:auto;
color:windowtext;
font-size:10.0pt;
font-weight:400;
font-style:normal;
text-decoration:none;
font-family:Arial;
mso-generic-font-family:auto;
mso-font-charset:0;
border:none;
mso-protection:locked visible;
mso-style-name:Normal;
mso-style-id:0;}
td
{mso-style-parent:style0;
padding-top:1px;
padding-right:1px;
padding-left:1px;
mso-ignore:padding;
color:windowtext;
font-size:10.0pt;
font-weight:400;
font-style:normal;
text-decoration:none;
font-family:Arial;
mso-generic-font-family:auto;
mso-font-charset:0;
mso-number-format:General;
text-align:general;
vertical-align:bottom;
border:none;
mso-background-source:auto;
mso-pattern:auto;
mso-protection:locked visible;
white-space:nowrap;
mso-rotate:0;}
.xl24
{mso-style-parent:style0;
white-space:normal;}
-->
</style>
<!--[if gte mso 9]><xml>
 <x:ExcelWorkbook>
  <x:ExcelWorksheets>
   <x:ExcelWorksheet>
<x:Name>CompTorg.ru Price</x:Name>
<x:WorksheetOptions>
 <x:Selected/>
 <x:ProtectContents>False</x:ProtectContents>
 <x:ProtectObjects>False</x:ProtectObjects>
 <x:ProtectScenarios>False</x:ProtectScenarios>
</x:WorksheetOptions>
   </x:ExcelWorksheet>
  </x:ExcelWorksheets>
  <x:WindowHeight>10005</x:WindowHeight>
  <x:WindowWidth>10005</x:WindowWidth>
  <x:WindowTopX>120</x:WindowTopX>
  <x:WindowTopY>135</x:WindowTopY>
  <x:ProtectStructure>False</x:ProtectStructure>
  <x:ProtectWindows>False</x:ProtectWindows>
 </x:ExcelWorkbook>
</xml><![endif]-->
</head>

<body link=\"blue\" vlink=\"purple\">
<table x:str border=\"0\" cellpadding=\"0\" cellspacing=\"0\" style=\"border-collapse: collapse;table-layout:fixed;\">"
;
return $header;
}

function writeFooter(){
return "</table></body></html>";
}

function writeHead($no,$name){
fwrite($this->fp,"
<tr>
<td class=\"xl24\" width=\"60\">
$no</td>
<td colspan=\"4\" class=\"xl24\" width=\"650\">
$name</td>
</tr>"
);
return;
}

function writeProduct($no,$name,$price1,$price2,$price3){
fwrite($this->fp,"
<tr>
<td class=\"xl24\" width=\"60\">"
.$no."</td>
<td class=\"xl24\" width=\"500\">"
.$name."</td>
<td class=\"xl24\" width=\"50\">"
.$price1."</td>
<td class=\"xl24\" width=\"50\">"
.$price2."</td>
<td class=\"xl24\" width=\"50\">"
.$price3."</td>
</tr>
"
);
return;
}

}
?>

Записан
Chuda
Гость
« Ответ #4 : 10-08-2006 07:02 » 

Это не xml, а html документ (с небольшой xml вставкой). Из условия перед этой вставкой ("if gte mso 9") следует (ИМХО), что офис должен быть версии 9.0 и выше.
Office XP - все Ок, с учетом замечаний nikedeforest
Office 2000 и ниже - нет под рукой, не проверял
Open Office 1.2 (ASP Linux) - 5 минут и устал ждать пока откроет. Снял приложение

А чтобы не 3 мега качать людям - заархивируй. Жмется до 350 кб zip-ом...

Спасибо за критику, у меня OpenOffice2.0.3(ArchLinux) этот файл тоже открывает минут пять-десять. Что с этим делать - без понятия. M$ Excel отрывает его достаточно легко на той же машине в той же ОС.
Насчёт zip, к моему ужасу на сервере php не поддерживает оного. Можно было бы заархивировать в bz2, ещё компактнее получится, но некоторые виндострадальцы даже не знают, что это такое.
Насчёт версий поддерживаемых версий M$ Office - пока даже не в курсе, как сделать так, чтобы и в старых оно работало. В 2000 выглядит коряво по отзывам пользователей.
Код выложен, скорее всего он будет совершенствоваться, если у кого будут конструктивные предложения, давайте и в самом деле сделаем приличный класс для создания excel-таблиц. Задача-то практически востребованная.
Записан
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 10-08-2006 07:15 » 

Есть предложение по поводу архивирования. Ты как линуксоид должна знать tgz, а "виндострадальцы" смогуь его открыть если пользуются ВинКоммандером.
Записан

ещё один вопрос ...
Chuda
Гость
« Ответ #6 : 10-08-2006 07:34 » 

тоталкоммандер и bz2 открывает на ура. Я за bz2, потому как жмёт лучше всех остальных, и zip, и gzip, и rar ему уступают. Но ведь целевая аудитория в половине случаев не знает даже что такое тоталкоммандер.
Записан
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 10-08-2006 07:36 » 

Я думаю здесь таких нет Ага, все таки форум программистов.
p.s. думаю потом надо будет этот флуд про архивирование покоцать.
« Последнее редактирование: 10-08-2006 07:38 от nikedeforest » Записан

ещё один вопрос ...
Chuda
Гость
« Ответ #8 : 10-08-2006 07:41 » 

я имела в виду целевую аудиторию сайта с прайс-листом. Но вообще над архивированием я сейчас думаю. Наверняка найдётся некий cgi-скрипт, который в состоянии упаковать в zip.
Надеюсь, никому не надо рассказывать, что выбор формата далеко не всегда обусловлен техническими характеристиками этого формата. Распространённость, мать её.. маркетинг.. некрософт.. нах Жаль
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 10-08-2006 15:59 » 

Вижу только файл на 3кБ!..
МС Офис 2000 открывает без проблем.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Chuda
Гость
« Ответ #10 : 10-08-2006 16:27 » 

Это крайне странно! Специально проверила - файл 3.7 МЕГАбайт.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines