C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: C++Builder и Word  (Прочитано 11739 раз)
vadoo
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 27


C++Builder и Word
« : 30 Май 2007, 20:19:21 »

1. Требуется поместить в определённое место в документе Ворда (шаблон отчета) таблицу из базы данных. Подскажите как это делается, ну хотя бы на уровне идеи. Возможно где-то есть описание как такое сделать, буду благодарен и за ссылку. Саму таблицу поместить в Ворд могу, но вот что бы в нужное место - для меня проблема.
2. Как в таблицу Ворда поместить данные из вариантного массива (всю сразу, а не по отдельным ячейкам в цикле). В Икселе получается, а вот в Ворде нет.
Заранее благоддарю за ответ.
Записан
vva
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 29


Re: C++Builder и Word
« Ответ #1 : 31 Май 2007, 15:47:21 »

Может быть это поможет
http://wladm.narod.ru/C_Sharp/comword.html
Записан
Tantos
А ты воспользовался поиском перед тем, как спросить?!
Давний друг


Сказали спасибо: +350/-28
Offline

Сообщений: 2181


Re: C++Builder и Word
« Ответ #2 : 31 Май 2007, 16:04:05 »

1. Проще всего создать таблицу в Ворде, а потом уже перекидывать данные из БД. Правда, надо контролировать кол-во строк в таблице.
Код
bool __fastcall TfrmMain::InsertText(Variant *App, Variant *Doc,
                                              AnsiString Bkmk, AnsiString Text)
{
WideString text(Text);
 
if(Bkmk.Length())
 GotoBookmark(Doc, Bkmk);
 
App->OlePropertyGet("Selection").OleProcedure("TypeText", text);
 
 return true;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::tbWordReportClick(TObject *Sender)
{
const AnsiString asFileName(ExtractFilePath(Application->ExeName) + "files\\act.dot");
AnsiString asDocName("");
int        i = 0, j = 0;
TDateTime  dtReport(Date());
Variant    app   = Unassigned,
           ws    = Unassigned,
           range = Unassigned,
           table = Unassigned,
           cell  = Unassigned;
 
app = CreateOleObject("Word.Application");
if(!app.IsEmpty())
 {
  try{
    app.OlePropertySet("Visible", false);
    ws = app.OlePropertyGet("Documents").OleFunction("Open", asFileName);
    InsertText(&app, &ws, "DayNow", dtReport.FormatString("dd"));
    InsertText(&app, &ws, "MonthNow", AnsiLowerCase(dtReport.FormatString("mmmmm")));
 
    dtReport = IncMonth(dtReport, -1);
 
    asDocName = ExtractFilePath(Application->ExeName) + "отчет " +
                        AnsiLowerCase(dtReport.FormatString("mmmmm")) + ".doc";
    ToStartDay(dtReport);
    InsertText(&app, &ws, "DateFrom", dtReport.FormatString("dd.mm.yy"));
    ToLastDay(dtReport);
    InsertText(&app, &ws, "DateTo", dtReport.FormatString("dd.mm.yy"));
 
    table = ws.OlePropertyGet("Tables").OleFunction("Item", 2);
 
    for(i = 1; i != sgResults->RowCount; i++)
     {
      for( j = 2; j 7; j++)
       {                            
        cell  = table.OleFunction("Cell", i+2, j+1);
        range = cell.OlePropertyGet("Range");
        range.OlePropertySet("Text", WideString(sgResults->Cells[j][i]));
       }
     }
    ws.OleProcedure("SaveAs", asDocName);
   }
  __finally{
    app.OleProcedure("Quit");
    app = ws = range = table = cell = Unassigned;
    ShowMessage("Выполнено!");
   }
 }
}
//---------------------------------------------------------------------------
 
Записан
vadoo
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 27


Re: C++Builder и Word
« Ответ #3 : 31 Май 2007, 20:19:39 »

Спасибо большое, буду читать и разбираться. а попутно вот такой вопрос, я сегодня повозился и доколупался вот до такого.

Вот такой есть код, естественно облегченный максимально, код работает, но не до конца.

word_app = Variant::CreateObject("word.application");

this_selection = word_app.OlePropertyGet(“Selection”) ;
this_find = this_selection.OlePropertyGet(“Find”) ;
//---то, что хотим найти
this_find.OlePropertySet(“Text”, “авто”) ;
//---на что заменить
this_find. OlePropertyGet(“Replacement”). OlePropertySet(“Text”, “велик”) ;
//---устанавливаем свойство поиска во всём документе
this_find.OlePropertySet(“Wrap”, (Variant) 1) ;
//---Запуск обработки
this_find.OleProcedure(“Execute”) ;

Он находит слово «авто», выделяет его, но не заменяет на «велик».

Это текст макроса самого Ворда.
With Selection.Find
    .Text = "авто"
    .ClearFormatting
    .Wrap = wdFindContinue (параметр можно заменить на цифру 1)
    .Replacement.Text = "велик"
    .Replacement.ClearFormatting
    .Forward = True
    .Execute Replace:=wdReplaceAll
End With

Дело в том, что замена не происходит если в Execute не указать Replace:=wdReplaceAll (параметр можно заменить цифрой 2), такой у него синтаксис.
Подскажите плиз как в this_find.OleProcedure(“Execute”) ; вставить этот Replace:=wdReplaceOne. Как не изголялся не получается, или выдаёт ошибку или просто не работает даже поиск.


Записан
AVC
Администратор


Сказали спасибо: +28/-6
Offline

Сообщений: 1189


Re: C++Builder и Word
« Ответ #4 : 01 Июнь 2007, 09:27:48 »

Посмотрите тут http://cppbuilder.ru/component/option,com_joomlaboard/Itemid,40/func,view/id,552/catid,5/#msg552
Записан
vadoo
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 27


Re: C++Builder и Word
« Ответ #5 : 01 Июнь 2007, 20:25:27 »

Спасибо!
И где вы такие ссылки берёте? 

Мож кому надо - перетранслирую решение моей проблемы подсказанное по ссылке.

word_app = Variant::CreateObject("word.application");

this_selection = word_app.OlePropertyGet(“Selection”) ;
this_find = this_selection.OlePropertyGet(“Find”) ;
//---Запуск обработки
this_find.OleProcedure ("Execute",
/* FindText          */      "авто",
/* MatchCase         */      false,
/* MatchWholeWord    */      false,
/* MatchWildcards    */      false,
/* MatchSoundsLike   */      false,
/* MatchAllWordForms */      false,
/* Forward           */      true,
/* Wrap              */      1,
/* Format            */      false,
/* ReplaceWith       */      "велик",
/* Replace           */      2
);
}
Причем процедуру Execute надо писать именно так, по другому она не работает. Естественно то, что закомментировано можно не писать и вместо конкретных слов авто и велик можно поставить переменные.
Записан
AVC
Администратор


Сказали спасибо: +28/-6
Offline

Сообщений: 1189


Re: C++Builder и Word
« Ответ #6 : 04 Июнь 2007, 09:55:14 »

Цитата: vadoo от 01 Июнь 2007, 20:25:27
И где вы такие ссылки берёте? 
Некоторые пишу сам
Неоднократно замечал, что вопросы с одинаковыми проблемами имеют свойство задаваться Одновременно на одном/разных форумах. Непознанная закономерность ? 
Записан
egorych
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 19


Re: C++Builder и Word
« Ответ #7 : 09 Июнь 2007, 22:59:51 »

Цитата: AVC
Неоднократно замечал, что вопросы с одинаковыми проблемами имеют свойство задаваться Одновременно на одном/разных форумах. Непознанная закономерность ?
И ники такие похожие... 
Записан
Seeker
новенький


Сказали спасибо: +0/-0
Offline

Сообщений: 2


Re: C++Builder и Word
« Ответ #8 : 19 Август 2008, 11:59:09 »

авторы сообщений в этой теме, подскажите, как программно в документе Word перейти к закладке с известным именем и вставить после нее свой текст. Вариант с функцией GotoBookMark (......) - не компилируется.
Записан
Tantos
А ты воспользовался поиском перед тем, как спросить?!
Давний друг


Сказали спасибо: +350/-28
Offline

Сообщений: 2181


Re: C++Builder и Word
« Ответ #9 : 20 Август 2008, 16:14:14 »

Код
bool __fastcall TfrmMain::GotoBookmark(Variant *Word, AnsiString Bkmk)
{
TVariant What(0xFFFFFFFF), BkmkName(Bkmk);
 
if (Word->OlePropertyGet("Bookmarks").OleFunction("Exists", WideString(Bkmk)))
 Word->OleFunction("GoTo", &What, EmptyParam, EmptyParam, &BkmkName).OleFunction("Select");
else
 throw Exception("Закладка '" + Bkmk + "' не найдена!");
 
return true;
}
 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.063 секунд. Запросов: 21.