C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Таблица в документе MS Word, Нужно прочитать данные из таблицы
Slon
Отправлено: 06.02.2005, 01:19


Ученик-кочегар

Группа: Участник
Сообщений: 19



Открыть Word не составляет труда (делаю как в уроках).

Не пойму как можно распознать таблицу в документе Word.

Как извлечь данные из таблицы?

Делаю следующим образом:
1) в Word создаю закладку в первой ячейке таблицы (назв. закладки "start")
2) в Builder открываю соответствующий файл Word и перехожу к закладке "start":

CODE

HRESULT hr = CoInitialize(0);
       if(FAILED(hr))
               return -1;

       Variant App, Doc;

       try
       {
               App=Variant::GetActiveObject("Word.Application");
       }
       catch(...)
       {
               // Word íå çàïóùåí — çàïóñòèòü åãî
               try
               {
                       App=Variant::CreateObject("Word.Application");
               }
               catch (...)
               {
                       Application->MessageBox("Íåâîçìîæíî îòêðûòü Microsoft Word!"
                       "Âîçìîæíî Word íå óñòàíîâëåí íà êîìïüþòåðå.","Îøèáêà",MB_OK+MB_ICONERROR);
                       return -1;
               }
       }
       App.OlePropertySet("Visible",true);
       try
       {
               App.Exec( PropertyGet("Documents")).Exec( Function("Open") << FileName);
               Doc=App.OlePropertyGet("ActiveDocument");
       }
       catch(...)
       {
               Application->MessageBox("Îøèáêà îòêðûòèÿ äîêóìåíòà Microsoft Word!",
                                        "Îøèáêà",MB_OK+MB_ICONERROR);
               return -1;
       }


       //Ïåðåéäåì ê çàêëàäêå "start"
       Variant range = Doc.OleFunction("GoTo",-1,0,0,"start");


3) Дальше записываю в ворде макрос, который позволит достать текст из второй ячейки таблицы:
CODE

Selection.GoTo What:=wdGoToBookmark, Name:="start"
   With ActiveDocument.Bookmarks
       .DefaultSorting = wdSortByName
       .ShowHidden = False
   End With
   Selection.MoveRight Unit:=wdCell

   MsgBox Selection.Text


4) Нужно шаг 3 перенести на билдер.
Я пытаюсь это сделать следующим образом:
Variant sel = Doc.OleFunction("MoveRight", 12, 1, 0); //Т.к. MoveRight(Unit,
//Count, Extend), wdCell == 12, wdMove == 0
sel.OlePropertyGet("Text");

На строке "Variant sel = Doc.OleFunction("Move", 12, 1, 0);" вываливается exception: "Project rised exeption class EOleSysError with message 'Неизвестное имя'".


Толком не пойму почему не вызывается функция MoveRight...
Надеюсь на Вашу помощь!

Rius
Отправлено: 06.02.2005, 21:57


Мастер участка

Группа: Участник
Сообщений: 321



Вот достоверно рабочий код
CODE
Variant Documents = Word.OlePropertyGet("Documents");
Documents.OleProcedure("Add");
Variant ActiveDocument = Word.OlePropertyGet("ActiveDocument");

Variant Tables = ActiveDocument.OlePropertyGet("Tables");
ActiveDocument.OleProcedure("Select");

Variant Selection = Word.OlePropertyGet("Selection");
Variant Range = Selection.OlePropertyGet("Range");

Tables.OleProcedure("Add", Range, 1, 4);

Variant Font = Selection.OlePropertyGet("Font");
Font.OlePropertySet("Name", "Arial");
Font.OlePropertySet("Size", 14);
Font.OlePropertySet("Bold", "1");

Variant ParagraphFormat = Selection.OlePropertyGet("ParagraphFormat");
ParagraphFormat.OlePropertySet("Alignment", 2);

Selection.OleProcedure("TypeText", "Температура");
Selection.OleProcedure("MoveRight", 1);
Selection.OleProcedure("TypeText", "Код давления");
Selection.OleProcedure("MoveRight", 1);
Selection.OleProcedure("TypeText", "Код температуры");
Selection.OleProcedure("MoveRight", 1);
Selection.OleProcedure("TypeText", "Точка");
Selection.OleProcedure("MoveRight", 1);


p.s. я на поиск этих переходов по закладкам столько времени угрохал... а уроки вроде смотрел

Вернуться в Вопросы программирования в C++Builder