Создание текстового документа с таблицами
0) Использовать автоматизацию Word. Трудности: надо изучать COM, OLE и объектную модель Word. Плюс я не знаю, будет ли после этого приложение зависеть от версии Office, установленной на компьютере. В этом случае генерация будет осуществляться сразу в .doc, ибо документооборот ведётся именно в этом формате.
1) Использовать компонент RichTextBox. Трудностей полагаю гораздо меньше, разве только как вставить туда таблицу и заполнить её ячейки. Сохранение будет элементарным, насколько я знаю.
2) Изучить формат RTF и генерировать файлы самому. Единственная трудность — сам формат, ибо остальное кажется по сравнению с изучением его довольно простым.
Возможно, также потребуется не генерировать файл, а сразу печатать. Насколько это облегчит или усложнит задачу?
Платформа: VC++/WinAPI, безо всяких ATL/MFC.
Прокомментируйте каждый вариант, пожалуйста, а дальше мои вопросы будут опираться на то, что я увижу.
1) чем больше обьем, тем дольше процесс генерации
2) обязательное наличие установленного ворда на машине
3) зависимость по версиям только для более ранних редакций, последния версия поддреживает все предыдущие
4) абсолютный гемморой с форматирование абзацев, удваивается если не знаешь модель ворда впринципе.
ЗЫ: если все сводиться к ворду, то игра стоит свеч. Иначе пиши свой текстовой формат с ПО, лень пытайся в ртф что то делать.
источник ru , en
/.rtf
источник ru
Применять .DOC - теряеться читабельность отчёта т.к есть разыв строниц + черт голову сломает в коде.
.RTF - имеет сплошной текст, и код полегче , но тоже не так прост. Да и вес файла в разы болъше, чем у .DOC.
Думаю проще всево это .HTM вот примерный код и весит этот код 584байт(А это важно для скорости создания отчёта):
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<p>Отчёт за 31-12-2013</p>
<UL>
<li>Error 1</li>
<li>Error 11</li>
<li>Error 111</li>
</UL>
<table>
<tr>
<td style="width: 20px" valign="top">
<img src="
C:\Users\UserName\AppData\Roaming\Microsoft\windows\upgrade\images\alert.gif
" align="center"/>
</td>
<td>
<font size="2" face="Segoe UI" color="#1370AB"><Message xmlns="">
С Вашим Windows 7 , что-то не так.
</Message></font>
</td>
</tr>
</table>
</body>
</html>
Но дело в том, что я, наверное, выразился неправильно. Будет генерироваться что-то типа шаблона с заданными параметрами таблицы и некоторым текстом.
Хотя идея с HTML хороша, это ж вообще просто. Но тогда у меня следующий вопрос — как печатать отформатированную страницу?
А у меня всё просто и понятно — надо не только сгенерировать файл HTML, но и программно распечатать результат на принтере (не код разметки, а именно результат).
@pixo $oft, что является источником данных для отчёта (база данных, xml, etc)?
Не проще ли взять какой-нибудь генератор отчётов (как предлагает Ramon) и не париться?
Да я неправильно выразился, не отчёт это будет. Просто таблица с несколькими заполненными полями и определёнными ширинами/высотами столбцов. Тут даже не столь важно, во что сформировать — в .rtf, в .htm или даже в объект GDI (да, меня и такая мысль посетила), а в том, как потом из этого распечатать.
Дабы избежать головной боли в будущем лучше сразу копать в сторону .doc
<SCRIPT LANGUAGE="JavaScript">
window.print();
</script>
Команд строку
~~ Print name printer path file
Но думаю это есть аналог JavaScript.
Ыначе только как самому поднимать дрова принтеру.
Благо С++ это умеет.
А у Вас, Пиксо, появились какие нибудь идеи? Тема интересная.
А у Вас, Пиксо, появились какие нибудь идеи? Тема интересная.
Тема интересная, безусловно. Но про автоматизацию я сразу написал, что это довольно сложный путь и выбран он будет только в крайнем случае.
Я вижу минимум 2 варианта:
0) Генерация HTML-страницы. НЯП, размеры там можно задать в сантиметрах, и это тогда для меня самое главное, ибо таблица — основной элемент, а текст в неё впихнуть — как два пальца сами знаете что. А потом открыть её в браузере и напечатать. Правда, тут тоже не всё так банально, но выглядит довольно привлекательно.
1) Рисовать в принтер средствами GDI. Это для меня довольно новая тема, ибо надо будет задать и ширину линий, и шрифт правильно выбрать, и DPI, чтоб оно нарисовалось в точности так, как это выглядело бы в документе.
Как появится свободное время, буду думать и пробовать варианты. Начну с HTML как более простого на мой взгляд.
P.S. Если что, в начале моего ника — буква «а» ;-)
...
А потом открыть её в браузере и напечатать. Правда, тут тоже не всё так банально, но выглядит довольно привлекательно.
...
Зачем?
Фаил будет сохранён на диск или нет? Если да то теоретически метод распечатки таков:
В любом случае из под IE и вот так выезжает один и тот же диалог для печати файлов.
PS: Насчёт ника извените, не знал как трактовать @ )))
Фаил будет сохранён на диск или нет?
Есть идеи по поводу печати HTML-файла из памяти? ☺
Разумеется, я и думал с помощью чего-то типа ShellExecute() её распечатать, только сработает такое действие лишь в случае установки IE как браузера по умолчанию. Но это пока всё слова, надеюсь завтра добраться до дела и опробовать наконец.
Для меня эта тема интересна но я пока не могу заниматься экспериментами. ПЛИС нужно срочно кодить
Конечно, ведь когда IE по умолчанию, в меню файла есть глагол «Печать», Опера же такого не делает. Впрочем, если вызывать именно IE, то всё должно заработать, поэтому неважно, кто по умолчанию, а кто — нет ☺
Разумеется, столкнулся с проблемой, причём непонятной. Вывожу двустрочный текст с помощью DrawText(), в качестве прямоугольника вывода задаю границы ячейки. При этом по неизвестной мне причине текст выводится со смещением вверх, какие бы параметры выравнивания я не поставил. Вывожу так
char* szBuf;
…
r.left=139*fLineScale;r.top=134*fLineScale;r.right=204*fLineScale;r.bottom=145*fLineScale;
DrawText(hDC,szBuf,-1,&r,DT_TOP|DT_WORDBREAK|DT_NOCLIP);
Может быть, выравнивание текста производится по нижней границе, поэтому с каждой новой строкой текст смещается вверх? Тогда надо задать выравнивание по верхней границе, если это возможно, или рассчитывать смещение на n строк вручную и прибавлять к координатам вывода.
P.S.
Параметр формата DT_CALCRECT что-нибудь даёт?
P.S. Смещение текста я не задавал при выводе, просто позиционировался в нужное место.
Внезапно столкнулся с проблемой, что мой код почему-то работает только для XPS-принтера. При выводе на реальный принтер возникает следующая ситуация.
Т.е. документ вроде как отправляется, но в то же время с ошибкой. В XPS всё печатается на ура, никаких проблем.
Проверял код возврата функций, ответственных за это дело, начиная с CreateDC() — всё чисто. В чём может быть проблема?