На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
  
> Word без компонентов , добавление нескольких таблиц
    Поискал по форуму - подымался этот вопрос ни раз, но ответа так и не было.
    Вот код :
    ExpandedWrap disabled
      #include <ComObj.hpp>
       
      Variant Word, Doc, Table,Tables, Cell, Range;
        
        Word = CreateOleObject("Word.Application.8");
        Word.OlePropertySet("Visible",(Variant)true);
        
        Doc  = Word.OlePropertyGet("Documents");
        Doc.OleProcedure("Add");
        Doc = Word.OlePropertyGet("Documents").OleFunction("Item", 1);
       
        Doc.OlePropertyGet("Tables").OleFunction("Add", Doc.OleFunction("Range",0,0), Col, Row);
        Doc.OlePropertyGet("Tables").OleFunction("Add", Doc.OleFunction("Range",0,0), Col, Row);
        Doc.OlePropertyGet("Tables").OleFunction("Add", Doc.OleFunction("Range",0,0), Col, Row);


    Простенькое создание нескольких таблиц. Проблема в том что каждая последущая таблица рисуется в первой ячейке предыдещей таблицы :wall: :wall: :wall:

    Я решил эту проблему воспользовавшись компонентом TWordApplication, там после каждого создания таблицы выполнял :

    ExpandedWrap disabled
        OleVariant L=wdStory;
        WordApplication1->Selection->EndKey(L,EmptyParam);


    Так с компонентами тоже не всё в порядке - не хочет запускаться на лругих ПК :wall: :wall: :wall:
      Дима, эти вопросы поднимались уже не раз. В ворде записываешь макрос и переводишь с бейсика на ole :)
      Здесь, скорее всего, тебе всего и надо-то записать то, что получается при нажатии Ctrl+End - перевод каретки в конец документа после создания таблицы.
        Цитата
        записываешь макрос и переводишь с бейсика на ole

        Читал об этом только конечных решений этого не видел.
        Сам пытался. На Basik получилось:

        ExpandedWrap disabled
          Sub End()
              Selection.EndKey Unit:=wdStory
          End Sub

        В переводе на OLE - это переход в конец документа.
        Откуда берут эти значения для OLE я не допёр. По форуму нашёл вот такой перевод в конец :

        ExpandedWrap disabled
          Word.OlePropertyGet("Selection").OleFunction("EndKey",wdStory,EmptyParam);


        Ставил его перед и после каждого создания таблицы - НИЧЕГО не получилось.

        Как правильно сделать подскажаите, пожалуйста?
        Сообщение отредактировано: Дима -
          Цитата Дима @
          Откуда берут эти значения для OLE я не допёр.

          ExpandedWrap disabled
            Word_2K.h
            ....
            typedef enum WdUnits
            {
              wdCharacter = 1,
              wdWord = 2,
              wdSentence = 3,
              wdParagraph = 4,
              wdLine = 5,
              wdStory = 6,
              wdScreen = 7,
              wdSection = 8,
              wdColumn = 9,
              wdRow = 10,
              wdWindow = 11,
              wdCell = 12,
              wdCharacterFormatting = 13,
              wdParagraphFormatting = 14,
              wdTable = 15,
              wdItem = 16
            } WdUnits;
            Bas, а куда это вставлять? :wacko:

            Вообще вот эта вещь :
            ExpandedWrap disabled
              Word.OlePropertyGet("Selection").OleFunction("EndKey",wdStory,EmptyParam);

            переводит курсор в конец документа. Это я таблицы как-то так криво вставляю. Видимо вот это :
            ExpandedWrap disabled
               Doc.OleFunction("Range",0,0)

            указывает вставлять таблицу сначала документа. Пытался делать вот такое:

            ExpandedWrap disabled
                 Variant isRange = Doc.OleFunction("Range",0,0);
                 Range = Doc.OleFunction("Range",isRange.OlePropertyGet("End"),isRange.OlePropertyGet("End"));
                 Doc.OlePropertyGet("Tables").OleFunction("Add", Range, Col, Row);

            На второй строчке вылетает ошибка (просто исключительная ситуация и окно с текстом "ошибка").

            Добавлено
            Bas, я имел ввиду где можно взять описание как выполнять при помощи OLE разные действия с Word-ом?
            Где описано что вот так отрывать Word:

            ExpandedWrap disabled
              Variant  Word = CreateOleObject("Word.Application.8");


            ???

            Где описано что вот так таблицу создавать :
            ExpandedWrap disabled
              Doc  = Word.OlePropertyGet("Documents");
                Doc.OleProcedure("Add");
                Doc = Word.OlePropertyGet("Documents").OleFunction("Item", 1);
               
                Doc.OlePropertyGet("Tables").OleFunction("Add", Doc.OleFunction("Range",0,0), Col, Row);


            ???


            Где можно почитать как текст вставлять, его стиль и шрифт менять?
              Цитата Дима @
              Где описано что вот так отрывать Word:
              Variant Word = CreateOleObject("Word.Application.8");
              Ну, именно это надо просто один раз запомнить.

              Цитата Дима @
              Где описано что вот так таблицу создавать :
              Цитата Дима @
              Где можно почитать как текст вставлять, его стиль и шрифт менять?
              А всё остальное - перевод макросов. К сожалению, сейчас нету под рукой экселя - попробуй записать макрос вставки своих таблиц (полностью, т.е. вставка таблицы, переход в конец в документа, вставка следующей таблицы) и приведи его здесь.
              Кстати, посмотри и приведи тут, описание метода Tables.Add из справки Экселя.
                Adil, допустим даже если разбераться в Basic, то как всё-таки прикрутить эти операции к OLE в Builder?
                Вот код того как вставлется одна таблица, потом переводится курсор в конец документа + жму Enter, далее вставляю след. табл. :
                ExpandedWrap disabled
                  Sub Макрос1()
                      ActiveDocument.Tables.Add Range:=Selection.Range, NumRows:=2, NumColumns:= _
                          5, DefaultTableBehavior:=wdWord9TableBehavior, AutoFitBehavior:= _
                          wdAutoFitFixed
                      With Selection.Tables(1)
                          If .Style <> "Сетка таблицы" Then
                              .Style = "Сетка таблицы"
                          End If
                          .ApplyStyleHeadingRows = True
                          .ApplyStyleLastRow = True
                          .ApplyStyleFirstColumn = True
                          .ApplyStyleLastColumn = True
                      End With
                      Selection.EndKey Unit:=wdStory
                      Selection.TypeParagraph
                      ActiveDocument.Tables.Add Range:=Selection.Range, NumRows:=2, NumColumns:= _
                          5, DefaultTableBehavior:=wdWord9TableBehavior, AutoFitBehavior:= _
                          wdAutoFitFixed
                      With Selection.Tables(1)
                          If .Style <> "Сетка таблицы" Then
                              .Style = "Сетка таблицы"
                          End If
                          .ApplyStyleHeadingRows = True
                          .ApplyStyleLastRow = True
                          .ApplyStyleFirstColumn = True
                          .ApplyStyleLastColumn = True
                      End With
                  End Sub


                Мне надо бы в С++ написать вот этот кусочек :
                ExpandedWrap disabled
                      Selection.EndKey Unit:=wdStory
                      Selection.TypeParagraph
                  Основная трудность превода в том что ворд вставляет Selection куда не поподя. Поэтому надо явно поределять выделенную область методом Range.
                  Второй вариант попробуйте вставить тексть или как в макросе новый праграф после созданной таблицы (InsertAfter) а потом уж вставить таблицу.
                    Цитата
                    попробуйте вставить тексть или как в макросе новый праграф после созданной таблицы

                    Bas, это первое что я пробовал. Курсор нормально перемещаетсяв конец документа, а вот таблица вставляется в начало :wacko:

                    Я вставляю таблицу вот так:
                    ExpandedWrap disabled
                      Doc.OlePropertyGet("Tables").OleFunction("Add", Doc.OleFunction("Range",0,0), Col, Row);

                    Из сего видно что я сам принудительно пишу с начала документа - Doc.OleFunction("Range",0,0).

                    Как задать этот Range так чтоб писалось в конце документа?
                    Пробовал туда Selection передать - так пишет несовпадение типов.

                    Ещё по ходу дела вопрос - как менять размер и имя шрифта?
                    Basic выдал вот это :
                    Selection.Font.Size = 14
                    Как это прикрутить к OLE в Builder?
                    Сообщение отредактировано: Дима -
                      Вот древний код, даже незнаю рабочий ли он (дааааавно это было)
                      ExpandedWrap disabled
                        void __fastcall TForm1::WordApplicationDocumentChange(TObject *Sender)
                        {
                        WordDocument1->ConnectTo(WordApplication1->ActiveDocument);
                        //WordApplication1->Selection->SetRange(1,20);
                        WordApplication1->Selection->InsertAfter(TVariant("\nПереход к документу  :"+TVariant(WordApplication1->ActiveDocument->Name)));
                        long s=WordApplication1->Selection->get_Start();
                        long e=WordApplication1->Selection->get_End();
                        WordApplication1->Selection->SetRange(s,e);
                        WordApplication1->Selection->InsertAfter(TVariant("\n произведен          :"+DateTimeToStr(Now())));
                        s=WordApplication1->Selection->get_Start();
                        e=WordApplication1->Selection->get_End();
                        WordApplication1->Selection->SetRange(s,e);
                        WordApplication1->Selection->InsertAfter(TVariant("\n пользователь        :"+TVariant(WordApplication1->Get_UserName())));
                        s=WordApplication1->Selection->get_Start();
                        e=WordApplication1->Selection->get_End();
                        WordApplication1->Selection->SetRange(s,e);
                        WordApplication1->Selection->InsertAfter(TVariant("\n Printer :"+TVariant(WordApplication1->Get_ActivePrinter())));
                        s=WordApplication1->Selection->get_Start();
                        e=WordApplication1->Selection->get_End();
                        WordApplication1->Selection->SetRange(s,e);
                        WordApplication1->Selection->InsertAfter(TVariant("\n Path :"+TVariant(WordApplication1->Get_Path())));
                        }
                        //---------------------------------------------------------------------------
                        Bas, с компонентами у меня в этом плане проблем нет, спасибо. Как без компонентов реализовать встаку таблицы в конце документа?
                        Может есть другой способ вставки не требующий параметра Range?

                        Или что поставить в Range чтоб таблица прорисовалась в конце документа?

                        :wall: :wall: :wall: :wall:

                        Добавлено
                        СДЕЛАЛ!!!! :tong:

                        Вот кому надо весь код вставки нескольких таблиц подряд. Нормально подряд:
                        ExpandedWrap disabled
                          Variant Word, Doc, Selection;
                            
                            Word = CreateOleObject("Word.Application.8");
                            Word.OlePropertySet("Visible",(Variant)true);
                            
                            Doc  = Word.OlePropertyGet("Documents");
                            Doc.OleProcedure("Add");
                            Doc = Word.OlePropertyGet("Documents").OleFunction("Item", 1);
                           
                            Selection = Word.OlePropertyGet("Selection");
                           
                            
                            //курсор в конец документа
                            Selection.OleFunction("EndKey",wdStory,EmptyParam);
                            //новый параграф
                            Selection.OleFunction("TypeParagraph");
                            
                            Doc.OlePropertyGet("Tables").OleFunction("Add",Selection.OlePropertyGet("Range"),Col, Row);  
                           
                            //курсор в конец документа
                            Selection.OleFunction("EndKey",wdStory,EmptyParam);
                            //новый параграф
                            Selection.OleFunction("TypeParagraph");
                           
                            Doc.OlePropertyGet("Tables").OleFunction("Add",Selection.OlePropertyGet("Range"),Col, Row);  
                           
                            // и т.д.
                          Ну, вот видишь как все просто оказалось. Кстати, если в басике функция не функция :) а процедура - т.е. ничего не возвращает, то можно использовать OleProcedure вместо OleFunction
                          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                          0 пользователей:


                          Рейтинг@Mail.ru
                          [ Script execution time: 0,0867 ]   [ 16 queries used ]   [ Generated: 12.09.25, 01:27 GMT ]