| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C++ Builder > Таблицы в Word |
| Автор: StamSvam 9.7.2012, 18:55 |
| Здравствуйте. Вы мне уже очень помогли. Надеюсь, не оставите меня и в этот раз. Моя задача записать в файл строки. В документе Word содержится что-то вроде таблицы. Шаблон допуска для студента. Мне необходимо в эту таблицу записать в определенные ячейки данные из программы. Конкретнее - строки. Как это реализовать я ума не приложу. Прикрепил файл с шаблоном. Помогите, пожалуйста. |
| Автор: artsb 9.7.2012, 22:22 |
| Я в шаблоне в нужных ячейках создавал закладки (bookmarks) и потом просто искал нужную закладку по имени и заменял её на текст. Завтра поделюсь кодом |
| Автор: StamSvam 9.7.2012, 22:36 |
| Спасибо большое за идею! Попробую сам, но все равно жду кода |
| Автор: Usper 10.7.2012, 09:25 | ||
Я предлагаю сформировать нужный файл средствами билдера и офиса без использования шаблонов. Пример создания таблицы:
А вообще какая задача стоит? Распечатать таблицу или сохранить в файл? Если распечатать, то можно на канве TPrinter создать нужную таблицу и сразу вывести на печать. |
| Автор: StamSvam 10.7.2012, 10:04 |
| Usper, в том то и дело, что создать этот файл с нуля - лишняя морока, имхо. Если еще и накосячу где-нибудь, то мне потом выскажут все. Эти шаблоны мне выдал "заказчик". А что касается дальнейшей судьбы файла, то его надо распечатать. P.S. Честно говоря, я в непонятках как создать такую табличку даже в самом Ворде. Слишком мудреная она какая-то. |
| Автор: StamSvam 10.7.2012, 10:22 |
| Кстати, если это что-то изменит, то файл изначально есть в формате *.RTF . Но, к стыду признаться я видел такой тип впервые, сохранил его как *.doc, т.к. о работе с таблицами в Ворде я хоть что-то слышал. |
| Автор: Usper 10.7.2012, 10:47 |
| Эээ, в чём морока? В моём примере выше я создал файл в ворде и показал как надо работать с таблицами. Нужно только туда запихать таблицу по шаблону. А накосячить можно и с готовым шаблоном. |
| Автор: StamSvam 10.7.2012, 10:58 |
| Поглядите файл, прикрепленный к теме. И в свойствах таблицы пройдитесь по строкам (Следующая строка/Предыдущая строка). Первые строки куда не шло. А дальше начинается маразм. Я вот просто не пойму, как она так сделана эта таблица. |
| Автор: deniska 10.7.2012, 11:43 | ||
ну на самом деле не так уж и много строк в таблице. можно и тупым перебором определить куда Ворд запишет строку по той или иной "i,j"
наверное и рисовать таблицу самому тоже нет смысла. Открыть "рыбу" и ее редактировать |
| Автор: StamSvam 10.7.2012, 11:59 |
| Такая проблема еще. Открываю файл для работы с ним: #define OPG OlePropertyGet #define OPS OlePropertySet #define OF OleFunction void exportToWord() { Variant vApp, vDoc, vDocs, vParagraphs, vParagraph, vRange, vTables, vTable; AnsiString S; int paragraphItem; try { vApp = CreateOleObject("Word.Application"); } catch(...) { Application->MessageBoxA("Не могу запустить сервер MS Word. Отчёт не может быть экспортирован.","Ошибка",MB_ICONERROR); return; } vDocs = vApp.OPG("Documents"); vDocs.OleProcedure("Open","Temp.doc"); ...................... } Вот на строчке с процедурой он выводит такую ошибку: Project *.exe raised exeption class EOleSysError with message 'Ошибка'. Process stoped.[U][/U] и перекидывает на Header "sysvari.h" на строчку OleProcedure(name, static_cast<TAutoArgsBase*>(&args)); Что ему не нравится? Пробовал перевести имя файла функцией StringToOleStr(), но толку никакого. Та же ошибка. |
| Автор: Usper 10.7.2012, 12:43 |
| Не такая уж она страшная эта таблица, просто представляет собой кучу сгруппированных ячеек. Кстати, нужна ли эта куча? Очевидно, что половина ячеек в ней никогда не будут использоваться. Задайте этот вопрос "заказчику". А проблема с открытием файла скорее всего в том, что ворд его не может найти в пути по умолчанию. Задайте нужный путь (например так: vDocs.OleProcedure("Open","d:\\Temp.doc");) |
| Автор: StamSvam 10.7.2012, 12:54 |
| Тогда возникает еще одна проблема. На другом компьютере ведь заново придется прописывать полный путь к файлу. неизвестно же где пользователь будет хранить файлы. А это не дело, юзеры обычно далеки даже от элементарного указания полного пути к файлу. Да и ленивы для этого.. |
| Автор: Usper 10.7.2012, 14:01 |
| Собственно поэтому я и предложил генерировать файл на месте. Иначе будет нужно распространять шаблон вместе с исполняемым файлом. |
| Автор: StamSvam 10.7.2012, 14:12 |
| Так. Ну с этим понятно. Надо будет оставить на крайний случай. А про закладки в вставку на их места текста кто что может рассказать? Выручите, плиз. Хоть ссылочкой какой. |
| Автор: artsb 10.7.2012, 14:29 | ||
Вот, как и обещал. Последовательность вызовов. Только не забудь проверять все значения на валидность.
|
| Автор: Usper 10.7.2012, 15:11 |
| Честно говоря, не вижу никакого смысла так делать. Всё равно нужно с собой таскать шаблон. И не проще ли в нужные ячейки вставить нужный текст, вместо поиска-замены? |
| Автор: artsb 10.7.2012, 15:16 |
| Usper, всё зависит от конкретной задачи. Я не спорю, что можно пробежаться по ячейкам и вставить нужные значения. Но мой способ хорош в том смысле, что можно изменить шаблон и не придётся пересобирать программу заного только из-за того, что столбцов стало на один меньше или больше. В общем, и там и там есть свои плюсы. Пускай ТС сам решает как ему будет удобнее и легче. |
| Автор: Usper 10.7.2012, 15:34 |
| Хм... действительно это плюс. Но случайно наткнулся на ещё один минус таскания за собой шаблона, если этот шаблон уже открыт (случайно или намеренно) в момент попытки открытия его программой через OLE, ворд выдаст сообщение, что может его открыть только для чтения. Если пользователь не слишком опытен, это может его сбить с толку. |
| Автор: artsb 10.7.2012, 15:46 |
| Этот минус устраняется так: расширение меняется с DOC на DOT. Теперь при создании документа на основе шаблона, создаётся новый документ, который никак не связан с шаблоном. |
| Автор: StamSvam 10.7.2012, 18:31 | ||||
Возможно я туплю..Но выдает две ошибки. Для каждой из строчек
Выдает такую ошибку при компиляции: "Qualifaer 'WdUnits' is not a class or namespace name. Function call missing )" Вот мой код функции.
В чем я накосячил? Полазил по инетам и не нашел ни одного упоминания о параметрах "MoveStart" и "MoveEnd". Для чего они? И что передает параметр Word_xp::WdUnits::wdCharacter? Для чего он нужен? |
| Автор: artsb 10.7.2012, 20:58 | ||||||
Да, вроде бы, ни в чём. У меня enum WdUnits описан в word_xp.h и выглядит так:
Ну раз у вас ругается, то напишите просто 1:
А потом разберётесь почему не находит enum. И если вы используете шаблоны, то открывайте документ как шаблон:
|
| Автор: KaZepKa 10.7.2012, 21:07 |
| Можно пройтись чисто по файлу, зная формат, например, в rtf это не сложно. |
| Автор: StamSvam 10.7.2012, 21:11 | ||||||
если я правильно понял, то я создам новый документ, содержащий таблицу из начального файла? Щас протестю Добавлено через 9 минут и 32 секунды теперь он (компилятор) не ругается. Зато при вызове функции выводит сообщение Project *.exe raised exeption class EOleSysError with message 'Неизвестное имя'. Process stoped. и показывает строчку
Вот это жесть..вообще не понимаю, что ему все время не нравится вот измененный код:
|
| Автор: StamSvam 10.7.2012, 22:03 | ||
| ВСЕ!! РАЗОБРАЛСЯ! Работает!! Ура! Спасибо, что пронянчились со мной все это время! Фрагмент с исправлениями:
Господа, нереально выручили! Извините и не сочтите за наглость, но посоветуйте, где мне глянуть инфу по распечатыванию файла? Думаю, там сам разбирусь. |