Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Создание текстового документа с таблицами

7
07 декабря 2014 года
@pixo $oft
3.4K / / 20.09.2006
Всем привет. Есть задача — генерировать форму (пусть это будет отчёт) в текстовый документ (.doc/.rtf). Состоять он будет из таблиц, листы могут быть формата не только А4. Какие я вижу варианты:
0) Использовать автоматизацию Word. Трудности: надо изучать COM, OLE и объектную модель Word. Плюс я не знаю, будет ли после этого приложение зависеть от версии Office, установленной на компьютере. В этом случае генерация будет осуществляться сразу в .doc, ибо документооборот ведётся именно в этом формате.
1) Использовать компонент RichTextBox. Трудностей полагаю гораздо меньше, разве только как вставить туда таблицу и заполнить её ячейки. Сохранение будет элементарным, насколько я знаю.
2) Изучить формат RTF и генерировать файлы самому. Единственная трудность — сам формат, ибо остальное кажется по сравнению с изучением его довольно простым.
Возможно, также потребуется не генерировать файл, а сразу печатать. Насколько это облегчит или усложнит задачу?
Платформа: VC++/WinAPI, безо всяких ATL/MFC.

Прокомментируйте каждый вариант, пожалуйста, а дальше мои вопросы будут опираться на то, что я увижу.
392
07 декабря 2014 года
cronya
421 / / 03.01.2009
По ворду:
1) чем больше обьем, тем дольше процесс генерации
2) обязательное наличие установленного ворда на машине
3) зависимость по версиям только для более ранних редакций, последния версия поддреживает все предыдущие
4) абсолютный гемморой с форматирование абзацев, удваивается если не знаешь модель ворда впринципе.

ЗЫ: если все сводиться к ворду, то игра стоит свеч. Иначе пиши свой текстовой формат с ПО, лень пытайся в ртф что то делать.
260
07 декабря 2014 года
Ramon
1.1K / / 16.08.2003
Не знаю как сейчас, а раньше примерно для таких целей был Crystal Reports.

PS: Внезапно все на месте.
7
07 декабря 2014 года
@pixo $oft
3.4K / / 20.09.2006
Цитата:
Crystal Reports for Visual Studio .NET

Сорян, дальше не читал.

327
08 декабря 2014 года
UserNet2008
748 / / 03.04.2010
.doc
источник ru , en
/.rtf
источник ru
Применять .DOC - теряеться читабельность отчёта т.к есть разыв строниц + черт голову сломает в коде.
.RTF - имеет сплошной текст, и код полегче , но тоже не так прост. Да и вес файла в разы болъше, чем у .DOC.
Думаю проще всево это .HTM вот примерный код и весит этот код 584байт(А это важно для скорости создания отчёта):

Код:
<html xmlns="http://www.w3.org/TR/REC-html40">
<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="&#xA;C:\Users\UserName\AppData\Roaming\Microsoft\windows\upgrade\images\alert.gif&#xA;" align="center"/>
</td>
<td>
<font size="2" face="Segoe UI" color="#1370AB"><Message xmlns="">
С Вашим Windows 7 , что-то не так.
</Message></font>
</td>
</tr>
</table>
</body>
</html>
7
08 декабря 2014 года
@pixo $oft
3.4K / / 20.09.2006
Благодарю!
Но дело в том, что я, наверное, выразился неправильно. Будет генерироваться что-то типа шаблона с заданными параметрами таблицы и некоторым текстом.

Хотя идея с HTML хороша, это ж вообще просто. Но тогда у меня следующий вопрос — как печатать отформатированную страницу?
327
08 декабря 2014 года
UserNet2008
748 / / 03.04.2010
Честно сказать не очень понял вот ПредПросмотр кода выше для принтора:

IE - Файл - ПредПросмотр
7
08 декабря 2014 года
@pixo $oft
3.4K / / 20.09.2006
Картинка маленькая ☺

А у меня всё просто и понятно — надо не только сгенерировать файл HTML, но и программно распечатать результат на принтере (не код разметки, а именно результат).
297
09 декабря 2014 года
koodeer
1.2K / / 02.05.2009
Столько времени прошло, а Пихо всё кушает кактус. :р Реальные пацаны на ассемблере отчёты создают!

@pixo $oft, что является источником данных для отчёта (база данных, xml, etc)?
Не проще ли взять какой-нибудь генератор отчётов (как предлагает Ramon) и не париться?
7
09 декабря 2014 года
@pixo $oft
3.4K / / 20.09.2006
Ну я не реальный пацан жи ☺ А кактусов не ем и не пью.
Да я неправильно выразился, не отчёт это будет. Просто таблица с несколькими заполненными полями и определёнными ширинами/высотами столбцов. Тут даже не столь важно, во что сформировать — в .rtf, в .htm или даже в объект GDI (да, меня и такая мысль посетила), а в том, как потом из этого распечатать.
465
11 декабря 2014 года
QWERYTY
595 / / 25.03.2012
Попробуй заюзать интерфейсы. Не зависимо от версии установленного ворда всегда должен быть определённый набор интерфейсов(ну типа всегда будет пахать), такая была концепция. Насчёт .RTF сомнительно, с форматированием там какие то глюки. Всегда выглядят по разному на двух наших с братом компах(я уже молчу про прочие)

Дабы избежать головной боли в будущем лучше сразу копать в сторону .doc
327
13 декабря 2014 года
UserNet2008
748 / / 03.04.2010
Можно вставить этот скрипт
 
Код:
<body>
<SCRIPT LANGUAGE="JavaScript">
window.print();
</script>
OR
Команд строку
~~ Print name printer path file
Но думаю это есть аналог JavaScript.
Ыначе только как самому поднимать дрова принтеру.
Благо С++ это умеет.
465
13 декабря 2014 года
QWERYTY
595 / / 25.03.2012
Вот тут идёт работа через интерфейсы. Думается мне это не самый лёгкий путь.
А у Вас, Пиксо, появились какие нибудь идеи? Тема интересная.
7
13 декабря 2014 года
@pixo $oft
3.4K / / 20.09.2006
Цитата: QWERYTY
Вот тут идёт работа через интерфейсы. Думается мне это не самый лёгкий путь.
А у Вас, Пиксо, появились какие нибудь идеи? Тема интересная.

Тема интересная, безусловно. Но про автоматизацию я сразу написал, что это довольно сложный путь и выбран он будет только в крайнем случае.
Я вижу минимум 2 варианта:
0) Генерация HTML-страницы. НЯП, размеры там можно задать в сантиметрах, и это тогда для меня самое главное, ибо таблица — основной элемент, а текст в неё впихнуть — как два пальца сами знаете что. А потом открыть её в браузере и напечатать. Правда, тут тоже не всё так банально, но выглядит довольно привлекательно.
1) Рисовать в принтер средствами GDI. Это для меня довольно новая тема, ибо надо будет задать и ширину линий, и шрифт правильно выбрать, и DPI, чтоб оно нарисовалось в точности так, как это выглядело бы в документе.
Как появится свободное время, буду думать и пробовать варианты. Начну с HTML как более простого на мой взгляд.

P.S. Если что, в начале моего ника — буква «а» ;-)

465
13 декабря 2014 года
QWERYTY
595 / / 25.03.2012
Цитата: @pixo $oft

...
А потом открыть её в браузере и напечатать. Правда, тут тоже не всё так банально, но выглядит довольно привлекательно.
...


Зачем?
Фаил будет сохранён на диск или нет? Если да то теоретически метод распечатки таков:

 
Код:
ShellExecute(Form1.Handle, 'print', 'index.html', NIL, NIL, 0);
Но на практике не пробовал. Где создаю программы нет принтера.
В любом случае из под IE и вот так выезжает один и тот же диалог для печати файлов.


PS: Насчёт ника извените, не знал как трактовать @ )))
7
13 декабря 2014 года
@pixo $oft
3.4K / / 20.09.2006
Цитата: QWERYTY
Зачем?
Фаил будет сохранён на диск или нет?

Есть идеи по поводу печати HTML-файла из памяти? ☺
Разумеется, я и думал с помощью чего-то типа ShellExecute() её распечатать, только сработает такое действие лишь в случае установки IE как браузера по умолчанию. Но это пока всё слова, надеюсь завтра добраться до дела и опробовать наконец.

465
14 декабря 2014 года
QWERYTY
595 / / 25.03.2012
Да, действительно печатает только когда IE по умолчанию(этого не знал), как только поставил оперу по умолчанию перестали выезжать какие либо окна. Естественно так писать нельзя. Программа должна работать в любом случае, не опираясь на умолчания.
Для меня эта тема интересна но я пока не могу заниматься экспериментами. ПЛИС нужно срочно кодить
7
14 декабря 2014 года
@pixo $oft
3.4K / / 20.09.2006
Цитата: QWERYTY
Да, действительно печатает только когда IE по умолчанию(этого не знал), как только поставил оперу по умолчанию перестали выезжать какие либо окна

Конечно, ведь когда IE по умолчанию, в меню файла есть глагол «Печать», Опера же такого не делает. Впрочем, если вызывать именно IE, то всё должно заработать, поэтому неважно, кто по умолчанию, а кто — нет ☺

7
25 декабря 2014 года
@pixo $oft
3.4K / / 20.09.2006
Итак, я достиг уже некоторых успехов в этом деле. А решил я пойти по пути GDI.
Разумеется, столкнулся с проблемой, причём непонятной. Вывожу двустрочный текст с помощью DrawText(), в качестве прямоугольника вывода задаю границы ячейки. При этом по неизвестной мне причине текст выводится со смещением вверх, какие бы параметры выравнивания я не поставил. Вывожу так
 
Код:
RECT r;
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);
Числа — это координаты границы ячеек, увеличенные или уменьшенные на 1 (чтобы отступ был), значения задаются в мм. Результат — 1-я строка находится над границей ячейки. Результат — в прикреплённом файле.
Прикрепленные файлы:
59 Кб
Загрузок: 678
20K
25 декабря 2014 года
ellor!
198 / / 24.05.2012
Цитата: @pixo $oft
При этом по неизвестной мне причине текст выводится со смещением вверх, какие бы параметры выравнивания я не поставил.


Может быть, выравнивание текста производится по нижней границе, поэтому с каждой новой строкой текст смещается вверх? Тогда надо задать выравнивание по верхней границе, если это возможно, или рассчитывать смещение на n строк вручную и прибавлять к координатам вывода.

P.S.
Параметр формата DT_CALCRECT что-нибудь даёт?

7
25 декабря 2014 года
@pixo $oft
3.4K / / 20.09.2006
Он даёт вычисление значения RECT'а, если текст в него не влезает ☺ Но я уже разобрался — оказывается, не смотря ни на что, SetTextAlign() влияет на вывод DrawText()! Поэтому я поставил TA_TOP, и всё вывелось как надо.

P.S. Смещение текста я не задавал при выводе, просто позиционировался в нужное место.
7
04 февраля 2015 года
@pixo $oft
3.4K / / 20.09.2006
Всем привет!
Внезапно столкнулся с проблемой, что мой код почему-то работает только для XPS-принтера. При выводе на реальный принтер возникает следующая ситуация.

Т.е. документ вроде как отправляется, но в то же время с ошибкой. В XPS всё печатается на ура, никаких проблем.

Проверял код возврата функций, ответственных за это дело, начиная с CreateDC() — всё чисто. В чём может быть проблема?
Прикрепленные файлы:
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог