Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Таблицы в Word, Добавить в таблицу данные 
:(
    Опции темы
StamSvam
Дата 9.7.2012, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 8.7.2012

Репутация: нет
Всего: нет



Здравствуйте. Вы мне уже очень помогли. Надеюсь, не оставите меня и в этот раз.
Моя задача записать в файл строки. В документе Word содержится что-то вроде таблицы. Шаблон допуска для студента. Мне необходимо в эту таблицу записать в определенные ячейки данные из программы. Конкретнее - строки. Как это реализовать я ума не приложу.

Прикрепил файл с шаблоном. 

Помогите, пожалуйста.

Присоединённый файл ( Кол-во скачиваний: 11 )
Присоединённый файл  Temp.doc 63,00 Kb
PM MAIL   Вверх
artsb
Дата 9.7.2012, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Я в шаблоне в нужных ячейках создавал закладки (bookmarks) и потом просто искал нужную закладку по имени и заменял её на текст.
Завтра поделюсь кодом smile А пока можете поискать в этом направлении.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
StamSvam
Дата 9.7.2012, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 8.7.2012

Репутация: нет
Всего: нет



Спасибо большое за идею! Попробую сам, но все равно жду кода
PM MAIL   Вверх
Usper
Дата 10.7.2012, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 13.4.2007

Репутация: 15
Всего: 15



Я предлагаю сформировать нужный файл средствами билдера и офиса без использования шаблонов. Пример создания таблицы:
Код

#include "ComObj.hpp"

#define OPG OlePropertyGet
#define OPS OlePropertySet
#define OF OleFunction

void exportToWord()
{
    Variant vApp, vDoc, vDocs, vParagraphs, vParagraph, vRange, vTables, vTable;    
    AnsiString S;
    int paragraphItem;
    const int colCount = 10; //количество столбцов в будущей таблице
    const int rowCount = 10; //количество строк в будущей таблице
    try
    {
        vApp = CreateOleObject("Word.Application");
    }
    catch(...)
    {
        Application->MessageBoxA("Не могу запустить сервер MS Word. Отчёт не может быть экспортирован.","Ошибка",MB_ICONERROR);
        return;
    }
    vApp.OPS("Visible", false); //прячем создаваемый документ (так быстрее работает)
    vDocs = vApp.OPG("Documents");
    vDocs.OleProcedure("Add");
    vDoc = vDocs.OF("Item", 1);
    vParagraphs = vDoc.OPG("Paragraphs");
    vParagraphs.OleProcedure("Add"); //добавляем параграф в документ
    vParagraph = vParagraphs.OF("Item", 1);//"указатель" на первый параграф
    vRange = vParagraph.OlePropertyGet("Range");
    vDoc.OlePropertyGet("Tables").OleProcedure("Add", vRange, rowCount, colCount, 1, 1); //вставляем в документ таблицу
    vTable = vDoc.OlePropertyGet("Tables").OleFunction("Item", 1);
    vTable.OF("Cell", 1, 1).OPG("Range").   //пример добавления текста в ячейки
                OPS("Text", "Столбец 1, строка 1");
    vTable.OF("Cell", 2, 1).OPG("Range").
                OPS("Text", "Столбец 1, строка 2");
    vTable.OF("Cell", 3, 3).OF("Merge", vTable.OF("Cell", 3, 5)); //объединяем три ячейки в третьей строке
    vTable.OPG("Borders").OF("Item", 4294967291).OPS("LineStyle", 0); //делаем невидимыми все вертикальные границы между ячейками таблицы...
    vTable.OPG("Borders").OF("Item", 4294967290).OPS("LineStyle", 0); //... и горизонтальные

    vTable.OF("Cell", 3, 3).OPG("Borders").OF("Item", 4294967293).OPS("LineStyle", 1); //делаем нижнюю границу ячейки 3,3 видимой
    vTable.OF("Cell", 3, 3).OPG("Range").
                OPS("Text", "Столбец 3, строка 3");
    vParagraphs.OF("Item", 25).OPG("Range").OPG("Font").OPS("Size", 14); //устанавливаем размер шрифта в 25 параграфе в 14 пунктов. В нашем случае 25 параграф это ячейка 3,3
    vParagraphs.OF("Item", 25).OPG("Range").OPG("Font").OPS("Bold", true); //устанавливаем жирный шрифт там же
    vApp.OPS("Visible", true); //делаем документ видимым
}

А вообще какая задача стоит? Распечатать таблицу или сохранить в файл? Если распечатать, то можно на канве TPrinter создать нужную таблицу и сразу вывести на печать.


--------------------
На посохе волшебном нехилый набалдашник, большой такой, огромный, нехилый набалдашник.
PM MAIL   Вверх
StamSvam
Дата 10.7.2012, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 8.7.2012

Репутация: нет
Всего: нет



Usper, в том то и дело, что создать этот файл с нуля - лишняя морока, имхо. Если еще и накосячу где-нибудь, то мне потом выскажут все. Эти шаблоны мне выдал "заказчик". 

А что касается дальнейшей судьбы файла, то его надо распечатать.

P.S. Честно говоря, я в непонятках как создать такую табличку даже в самом Ворде. Слишком мудреная она какая-то.
 

Это сообщение отредактировал(а) StamSvam - 10.7.2012, 10:40
PM MAIL   Вверх
StamSvam
Дата 10.7.2012, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 8.7.2012

Репутация: нет
Всего: нет



Кстати, если это что-то изменит, то файл изначально есть в формате *.RTF . Но, к стыду признаться я видел такой тип впервые, сохранил его как *.doc, т.к. о работе с таблицами в Ворде я хоть что-то слышал. 
PM MAIL   Вверх
Usper
Дата 10.7.2012, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 13.4.2007

Репутация: 15
Всего: 15



Эээ, в чём морока? В моём примере выше я создал файл в ворде и показал как надо работать с таблицами. Нужно только туда запихать таблицу по шаблону. А накосячить можно и с готовым шаблоном.


--------------------
На посохе волшебном нехилый набалдашник, большой такой, огромный, нехилый набалдашник.
PM MAIL   Вверх
StamSvam
Дата 10.7.2012, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 8.7.2012

Репутация: нет
Всего: нет



Поглядите файл, прикрепленный к теме. И в свойствах таблицы пройдитесь по строкам (Следующая строка/Предыдущая строка). Первые строки куда не шло. А дальше начинается маразм. Я вот просто не пойму, как она так сделана эта таблица. smile 

Это сообщение отредактировал(а) StamSvam - 10.7.2012, 11:04
PM MAIL   Вверх
deniska
Дата 10.7.2012, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 398
Регистрация: 1.7.2005
Где: Троицк

Репутация: нет
Всего: 0



ну на самом деле не так уж и много строк в таблице. можно и тупым перебором определить куда Ворд запишет строку по той или иной "i,j"
Код

Cur_Table->Cell(i, j)->Range->set_Text(WideString(L"Вася Пупкин"));


наверное и рисовать таблицу самому тоже нет смысла. Открыть "рыбу" и ее редактировать

Это сообщение отредактировал(а) deniska - 10.7.2012, 11:44
PM MAIL ICQ   Вверх
StamSvam
Дата 10.7.2012, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 8.7.2012

Репутация: нет
Всего: нет



Такая проблема еще. Открываю файл для работы с ним:

#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(), но толку никакого. Та же ошибка.
PM MAIL   Вверх
Usper
Дата 10.7.2012, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 13.4.2007

Репутация: 15
Всего: 15



Не такая уж она страшная эта таблица, просто представляет собой кучу сгруппированных ячеек. Кстати, нужна ли эта куча? Очевидно, что половина ячеек в ней никогда не будут использоваться. Задайте этот вопрос "заказчику".
А проблема с открытием файла скорее всего в том, что ворд его не может найти в пути по умолчанию. Задайте нужный путь (например так: vDocs.OleProcedure("Open","d:\\Temp.doc");)


--------------------
На посохе волшебном нехилый набалдашник, большой такой, огромный, нехилый набалдашник.
PM MAIL   Вверх
StamSvam
Дата 10.7.2012, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 8.7.2012

Репутация: нет
Всего: нет



Тогда возникает еще одна проблема. На другом компьютере ведь заново придется прописывать полный путь к файлу. неизвестно же где пользователь будет хранить файлы. А это не дело, юзеры обычно далеки даже от элементарного указания полного пути к файлу. Да и ленивы для этого..

Это сообщение отредактировал(а) StamSvam - 10.7.2012, 12:55
PM MAIL   Вверх
Usper
Дата 10.7.2012, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 13.4.2007

Репутация: 15
Всего: 15



Собственно поэтому я и предложил генерировать файл на месте. Иначе будет нужно распространять шаблон вместе с исполняемым файлом.


--------------------
На посохе волшебном нехилый набалдашник, большой такой, огромный, нехилый набалдашник.
PM MAIL   Вверх
StamSvam
Дата 10.7.2012, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 8.7.2012

Репутация: нет
Всего: нет



Так. Ну с этим понятно. Надо будет оставить на крайний случай. А про закладки в вставку на их места текста кто что может рассказать? Выручите, плиз. Хоть ссылочкой какой.
PM MAIL   Вверх
artsb
Дата 10.7.2012, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Вот, как и обещал. Последовательность вызовов. Только не забудь проверять все значения на валидность.
Код

varBookmarks = varActiveDocument.OlePropertyGet("Bookmarks");
varBookmark = varBookmarks.OleFunction("Item", WideString("myBookmark")); // второй параметр - имя закладки
varBookmark.OleProcedure("Select");
varSelection = varWordApplication.OlePropertyGet("Selection");

varSelection.OleProcedure("MoveStart", Word_xp::WdUnits::wdCharacter, 1); // wdCharacter = 1
varSelection.OleProcedure("MoveEnd", Word_xp::WdUnits::wdCharacter, -1);

varSelection.OlePropertySet("Text", WideString("myValue"));

// снять выделение
varRange = varActiveDocument.OleFunction("Range", 0, 0);
varRange.OleProcedure(_T("Select"));



--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0707 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.