Я безусловно понимаю, что эта тема стара как мир, и набила всем оскомину, но перечитав форум, ознакомившись с FAQ и иными темами для новичков форума - все же решил создать эту тему.
Задача: посредством php страницы создать и сохранить в формате .doc (.docx все равно) следующий код <table border="1"> <tr><td>привет</td><td>еще раз</td></tr></table>
На выходе нужно получить word-файл c табличкой из двух ячеек с русскими словами. Кодировка используется в проекте utf-8.
Что предпринято: прежде всего PHPWord, однако он не читает html теги, далее нашел надстройку которая их читает, но он категорически не хочет принимать utf-8 (одни кракозябры). http://htmltodocx.codeplex.com/ вот линк... пока этот вариант совсем отпал и решил попробовать самый "простой" способ... найденный на просторах сети
<form action="word.php" method="POST">
<p>
<label><b>Название документа:</b><br /> </label>
<input name="docname" />
</p>
<p>
<label><b>Ваше имя:</b><br /> </label>
<input name="myself" />
</p>
<p>
<label><b>Ваш текст:</b><br /> </label>
<textarea name="text" rows="10" cols="25" tabindex="2"></textarea>
</p>
<input type="submit" value="Создать документ!" />
</form>
вот простая форма...
далее идет обработчик
word.php
if (isset($_POST['docname']) && !empty($_POST['docname'])) $docname = $_POST['docname'];
if (isset($_POST['myself']) && !empty($_POST['myself'])) $myself = $_POST['myself'];
if (isset($_POST['text']) && !empty($_POST['text'])) $text = $_POST['text'];
if (isset($docname) && isset($myself) && isset($text)) {
header('Content-type: application/vnd.ms-word');
header('Content-Disposition: attachment;Filename=' . $docname . '.doc');
header("Content-Transfer-Encoding: binary");
//echo '<meta http-equiv=Content-Type content="text/html; charset=utf-8">';
// header('Content-type: application/vnd.ms-word');
// header('Content-Disposition: attachment;Filename=' . $docname . '.doc');
header('Content-type: text/html; charset=utf-8');
echo '<html>';
// echo '<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">';
echo '<body>';
echo 'Автор: ' . $myself;
echo '<b>' . $text . '</b>';
echo '</body>';
echo '</html>';
}
закомментированы различные варианты/попытки...
все файлы созданы в кодировке utf-8 без BOM.
что имею на выходе... создается word документ в формате веб-страницы, но кодировка не срабатывает. Далее жму Параментры Word - дополнительно - в самом низу Параметры веб-документа - Кодировка (там отображается.. Загрузить текущий документ как: Кириллица), меняю на UTF-8 и вуаля ... все по-русски.
Попытки поставить это все по умолчанию успехов не увенчались(((
в связи с этим хотел бы просить совета, как это все "починить" и реализовать в самом удобном формате...
уверен, что готовое решение станет реальным подспорьем для многих начинающих. Заранее спасибо и хорошего рабочего дня)
Спустя 5 минут, 2 секунды (12.03.2012 - 07:46) rooor написал(а):
функция iconv не поможет?
Спустя 1 минута, 6 секунд (12.03.2012 - 07:48) ADiel написал(а):
header("Content-Transfer-Encoding: binary"); разве?
Спустя 1 минута, 19 секунд (12.03.2012 - 07:49) born написал(а):
iconv в этом варианте не пробовал - в htmldocx не помогает(((
про binary и так пробовал и без оного...
про binary и так пробовал и без оного...
Спустя 19 минут, 1 секунда (12.03.2012 - 08:08) ADiel написал(а):
У меня офиса нет, но есть openoffice
И сохраняет в формате html он так:
Может и не utf-8 нужно использовать?
И сохраняет в формате html он так:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1251">
<TITLE></TITLE>
<META NAME="GENERATOR" CONTENT="OpenOffice.org 3.3 (Win32)">
<META NAME="CREATED" CONTENT="0;0">
<META NAME="CHANGED" CONTENT="20120312;9070204">
</HEAD>
<BODY LANG="ru-RU" LINK="#000080" VLINK="#800000" DIR="LTR">
<P><B>ГЫ абыр абырвал</B></P>
</BODY>
</HTML>
Может и не utf-8 нужно использовать?
Спустя 26 минут, 59 секунд (12.03.2012 - 08:35) born написал(а):
utf-8 ... у меня вся БД на ней построена.
попробую конечно iconv.. только непонятно что на что конвертировать. потому что detect выдает utf-8.
попробую конечно iconv.. только непонятно что на что конвертировать. потому что detect выдает utf-8.
Спустя 18 минут, 16 секунд (12.03.2012 - 08:53) alex12060 написал(а):
Пробуй в rtf, это реально проще.
Спустя 32 минуты, 35 секунд (12.03.2012 - 09:26) born написал(а):
проще то проще) но чуть-чуть же осталось... как передать в ворд нужный заголовок - ведь многие это уже реализовали... но конкретно у меня не срабатывает(
а с htmldocx вообще обидно. реально здоровская утилита - работает - все четко, но с русским не дружит(
а с htmldocx вообще обидно. реально здоровская утилита - работает - все четко, но с русским не дружит(
Спустя 3 минуты, 23 секунды (12.03.2012 - 09:29) alex12060 написал(а):
Пробуй iconv() как тебе посоветовали.
Спустя 12 минут, 43 секунды (12.03.2012 - 09:42) born написал(а):
хех - iconv помог.
сделал сборку
$html='';
$html=$html.'<html>';
$html=$html.'<body>';
$html=$html.'Автор: ' . $myself;
$html=$html.'<b>' . $text . '</b>';
$html=$html.'</body>';
$html=$html.'</html>';
$html2=iconv ("utf-8","windows-1251",$html);
echo $html
вывел в ворд все по-русски.
спасибо за соучастие) но я думаю, что тему еще разовью...
сделал сборку
$html='';
$html=$html.'<html>';
$html=$html.'<body>';
$html=$html.'Автор: ' . $myself;
$html=$html.'<b>' . $text . '</b>';
$html=$html.'</body>';
$html=$html.'</html>';
$html2=iconv ("utf-8","windows-1251",$html);
echo $html
вывел в ворд все по-русски.
спасибо за соучастие) но я думаю, что тему еще разовью...
Спустя 11 часов, 40 минут, 32 секунды (12.03.2012 - 21:22) born написал(а):
я буду скромного о себе мнения, но я все таки сделал ЭТО!!! долго ли коротко ли... но htmltodocx теперь говорит на русском языке!!!! разворачивает ворд в альбомный вид, читает теги... полный Яху)))
теперь осталось решить маааааленькую задачу)
этот класс? построен по следующему принципу...
$html = file_get_contents('example_files/example_html.html');
это ключевая команда... забирает html содержимое
в этом файле у меня, например одна строка <h1> Мы победили - yeah! </h1>
в итоге все срабатывает... все в ворде как надо. но задача то конечная, подключить это все дело к БД. вот тут я застрял(((
делаю так:
$html = file_get_contents('example_files/base.php');
или так...
понимаю, что извращение конечно...
при этом
рисует вполне добротную табличку...
как быть? как достать чистый html из php файла?
уверен, что если мы сейчас это решим... это будет очень красивое решение - в библиотеку однозначно;) сорри за излишние эмоции;)
теперь осталось решить маааааленькую задачу)
этот класс? построен по следующему принципу...
$html = file_get_contents('example_files/example_html.html');
это ключевая команда... забирает html содержимое
в этом файле у меня, например одна строка <h1> Мы победили - yeah! </h1>
в итоге все срабатывает... все в ворде как надо. но задача то конечная, подключить это все дело к БД. вот тут я застрял(((
делаю так:
$html = file_get_contents('example_files/base.php');
<?
require_once("../../config_2012.php");
$query2="SELECT * FROM b117556_mon2012.f4_1_1";
$result2=mysql_query($query2) or die ("неверный запрос".mysql_error());
$html='<table border="1">';
while ($row=mysql_fetch_array($result2)){
$html=$html.'<tr>';
$html=$html.'<td>'.$row[0].'</td>'.'<td>'.$row[1].'</td>'.'<td>'.$row[2].'</td>';
$html=$html.'</tr>';
}
$html=$html.'</table>';
return $html;
// echo $html;
// print $html;
?>
или так...
<table border="1">
<?
while ($row=mysql_fetch_array($result2)){
?>
<tr> <td><?=$row[0];?></td> <td><?=$row[1];?></td> <td><?=$row[2];?></td></tr>
<?
}
?>
</table>
понимаю, что извращение конечно...
при этом
<table border="1">
<tr> <td>1</td> <td>чва</td> <td>хря</td></tr>
</table>
рисует вполне добротную табличку...
как быть? как достать чистый html из php файла?
уверен, что если мы сейчас это решим... это будет очень красивое решение - в библиотеку однозначно;) сорри за излишние эмоции;)
Спустя 2 часа, 14 минут, 34 секунды (12.03.2012 - 23:37) born написал(а):
в общем "привет" прилетел как всегда откуда не ждешь... ((( видимо пора отдыхать... вот что я сделал.
$html берется из вышеуказанного кода... все нормаль. файл записался - все четко...
теперь я его начинаю "забирать" ... и что получаю? правильно...
"не удается открыть файл из-за ошибок его содержимого.. недопустимый знак xml. Местоположение Часть:/word/document.xml строка 56, столбец 96...
методом научного тыка начал искать где засада...
в общем он не "читает", не срабатывает на русскую заглавную букву Р (эр), и на какое-то пустое место... ( ) вы не поверите, но между скобками оно и есть... вырезал и вставил... ибо если я его из кода убираю - файл начинает работать.
остальное все проверил (алфавит, знаки) все фурычит... грешным делом думаю это какой-нить спец. символ? аля альт-энтер? ^p? ибо скопировав его и вставив в автозамену он мне таких заменил порядка 15 в документе... значит явно не пусто.
что посоветуете? как этого всего избежать и что это вообще?
$h = fopen("my.html","r");
$text = "Этот текст запишем в файл.";
if (fwrite($h,$html))
echo "Запись прошла успешно";
else
echo "Произошла ошибка при записи данных";
fclose($h);
$html берется из вышеуказанного кода... все нормаль. файл записался - все четко...
теперь я его начинаю "забирать" ... и что получаю? правильно...
"не удается открыть файл из-за ошибок его содержимого.. недопустимый знак xml. Местоположение Часть:/word/document.xml строка 56, столбец 96...
методом научного тыка начал искать где засада...
в общем он не "читает", не срабатывает на русскую заглавную букву Р (эр), и на какое-то пустое место... ( ) вы не поверите, но между скобками оно и есть... вырезал и вставил... ибо если я его из кода убираю - файл начинает работать.
остальное все проверил (алфавит, знаки) все фурычит... грешным делом думаю это какой-нить спец. символ? аля альт-энтер? ^p? ибо скопировав его и вставив в автозамену он мне таких заменил порядка 15 в документе... значит явно не пусто.
что посоветуете? как этого всего избежать и что это вообще?
Спустя 2 часа, 23 минуты, 59 секунд (13.03.2012 - 02:01) FatCat написал(а):
http://phpforum.ru/index.php?act=Print&cli...r&f=125&t=58723 - так нормально?
Рекомендую открыть файл блокнотом, сразу все станет понятно.
Рекомендую открыть файл блокнотом, сразу все станет понятно.
Спустя 7 часов, 21 минута, 11 секунд (13.03.2012 - 09:22) born написал(а):
спасибо, я встречал на форуме Ваш пример... внешне выглядит конечно здорово, но не получилось сходу догнать...
блокнотом открыть получается только в качестве сохраненной веб-страницы... и там просто куча всего лишнего и понятным от этого не становится(
все же хотелось бы до конца разобраться с тем примером что я привел...
блокнотом открыть получается только в качестве сохраненной веб-страницы... и там просто куча всего лишнего и понятным от этого не становится(
все же хотелось бы до конца разобраться с тем примером что я привел...
Спустя 8 дней, 10 часов, 50 минут, 49 секунд (21.03.2012 - 20:13) born написал(а):
продвижение хорошее... уже 5-6 различных вариантов попробовал - задачу решает! на выбор ексель либо ворд, книжный либо альбомный.. все ок!
теперь вот в чем засада - в БД хранятся ссылки на изображения. Соответственно приходит код
<img src="files/123.png"> все бы ничего - но когда сохраняешь в ворд - то соответственно если файл не в корне, то и картинки нет. Хочется записывать картинку напрямую!
начитался про base64... получаю
<img src="data:image/png;base64, куча кода"> - в веб сохраняется и отображается норм... а вот в ворд уже не экспортируется(
какие могут быть решения? буду признателен за совет
теперь вот в чем засада - в БД хранятся ссылки на изображения. Соответственно приходит код
<img src="files/123.png"> все бы ничего - но когда сохраняешь в ворд - то соответственно если файл не в корне, то и картинки нет. Хочется записывать картинку напрямую!
начитался про base64... получаю
<img src="data:image/png;base64, куча кода"> - в веб сохраняется и отображается норм... а вот в ворд уже не экспортируется(
какие могут быть решения? буду признателен за совет
Спустя 5 минут, 39 секунд (21.03.2012 - 20:19) Игорь_Vasinsky написал(а):
Цитата |
абырвал |
абырвалг!
Спустя 44 минуты, 14 секунд (21.03.2012 - 21:03) born написал(а):
в общем вопрос получился дурной - сорри - слишком все усложнил.