Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.01.22;
Скачать: CL | DM;

Вниз

OLE+WORD   Найти похожие ветки 

 
AL CAPONE   (2005-03-06 20:19) [0]

Народ, помогите плиз кто чем сможет. Ситуация такова: имеется doc-файл с таблицей из 3-х столбцов и 400 строк, в 1-м столбце номера от 1 до 400 соответственно, во 2-м столбце вопрос и 5 вариантов ответа к нему, в 3-м столбце правильные ответы (сложность в том, что правильных ответов на 1 вопрос может быть несколько, и они хранятся в WORD в виде , например, 1 2 или 3 5). Теперь вопросы :
1) как предварительно из этого файла считать правильные ответы в таблицу Paradox 7.0 следующего вида :
номер вопроса / ответ1/ ответ2/ ответ3/ ответ4/ ответ5 ,
где номер вопроса берётся из 1-го столбца DOC-файла, а дальше , если у заданного вопроса среди правильных ответов есть, например ответ 4, то нужно в базу поставить единицу в столбец ответ4, иначе в базу нужно поставить 0;
2) как с помощью OLE-технологий произвести считывание вопроса с заданным номером из такого DOC-файла и на какой компонент формы его можно забросить для корректного отображения.
Все заранее огромное спасибо за помощь !


 
GanibalLector ©   (2005-03-07 01:52) [1]

Информации по этому поводу предостаточно.Главное желание!Кстати,ЮрийЖЛ статейку написал неплохую(даже обечал подредактировать чуток).Общий принцип таков :

var WordApp:Variant;
begin
WordApp := CreateOleObject("Word.Application");
try
  WordApp.Documents.Open("C:\2.doc");
  WordApp.Visible:=true;
  Messagedlg("Ячейка [2,2] таблицы №1="+
             WordApp.ActiveDocument.Tables.Item(1).Cell(2,2).Range.Text,mtinformation,[MbOk],0);
finally
  WordApp:=UnAssigned;
end;
end;


 
AL CAPONE   (2005-03-08 12:07) [2]

Спасибо за дельный совет. Вcё получается довольно просто при использовании этой процедуры.
Вот только есть несколько вопросов:
1) при повторном запуске этой процедуры программа выдаёт ошибку, что документ WORD уже занят, и пытается открыть его только для чтения, т.е. не срабатывает процедура закрытия
WordApp:=UnAssigned; может быть WORD можно корректно закрыть каким-либо другим способом ?
2) что означают параметры RANGE и TEXT в твоей процедуре ? Какие ещё параметры можно использовать в данном случае ?
3) при считывании ячейки WORD-а (в которой записаны только числа) с помощью этой процедуры программа возвращает не только число, реально записанное в ячейке, но после него и какие-то символы "?"-прямоугольник, а их дальнейшее использование в таком виде неприемлимо. Что это может быть и как с этим бороться (возможно дело в подключении какого-то модуля DELPHI)?
4) При считывании ячеек с математическими формулами и выражениями на месте этих самых формул, набранных в MathType, выдаются уже знакомые прямоугольнички "?". Ворд же понимает все эти выражения и отображает их корректно. Можно ли как-нибудь заствить DELPHI тоже их понимать ?
Заранее огромное спасибо за помощь !


 
GanibalLector ©   (2005-03-08 16:43) [3]

> Вcё получается довольно просто при использовании этой процедуры
Ну и кто тебе сказал,что это процедура?

1)
> т.е. не срабатывает процедура закрытия  WordApp:=UnAssigned
Это не процедура закрытия.Это просто освобождение.Для закрытия необходимо использовать метод Close,который имеет три параметра.
НЕ ОБЯЗАТЕЛЬНЫЕ,В СЛУЧАЕ ПОЗДНЕГО СВЯЗЫВАНИЯ!
Первый
 wdDoNotSaveChanges = $00000000;
 wdSaveChanges = $FFFFFFFF;
 wdPromptToSaveChanges = $FFFFFFFE;
Второй
wdWordDocument = $00000000;//сохранить в Word
 wdOriginalDocumentFormat = $00000001;//сохранить в исходном
 wdPromptUser = $00000002;//вывести диалоговое окно
Третий не пригодиться.Итого

WordApp.ActiveDocument.Close;
WordApp.Quit;// зыгрузить нах


2)  
>что означают параметры RANGE и TEXT в твоей процедуре ?
Свойство текст обьекта RANGE.Какие еще?Много...Детали в обьектной модели Word-a или в Word97.pas
3) Мог бы и сам погадаться :
 
S:= WordApp.ActiveDocument.Tables.Item(1).Cell(2,2).Range.Text;
  SetLength(S,Length(S)-2);
  Messagedlg(S ,mtinformation,[MbOk],0);

4)не знаю.


 
AL CAPONE   (2005-03-10 16:57) [4]

Привет !
Насчёт S:= WordApp.ActiveDocument.Tables.Item(1).Cell(2,2).Range.Text; SetLength(S,Length(S)-2) всё работает. Вот тока непонятно, почему всё-таки происходит считывание 2-х лишних символов.
Но вот при использовании WordApp.ActiveDocument.Close($00000000,EmptyParam,EmptyParam)или WordApp.Quit выдаётся Invalid Variant Operation, а ВОРД остаётся в списке задач незакрытым. Даже не знаю, что и думать-то дальше.


 
GanibalLector ©   (2005-03-10 19:56) [5]


function GetCells(Doc:Variant;Table,CellX,Celly:integer):string;
begin
 Result:=Doc.Tables.Item(Table).Cell(CellX,CellY).Range.Text;
 SetLength(Result,Length(Result)-2);
end;

procedure SetCells(Doc:Variant;Table,CellX,CellY:Integer;Value:string) ;
begin
 Doc.Tables.Item(Table).Cell(CellX,CellY).Range.Text:=Value;
end;

procedure TForm1.Button1Click(Sender: TObject);
var WordApp,Doc1:Variant;
   i:integer;
begin
WordApp := CreateOleObject("Word.Application");
try
  WordApp.Documents.Open("C:\2.doc");
  WordApp.Visible:=FALSE;
  Doc1 := WordApp.ActiveDocument;

  for i:=1 to 20 do
   Memo1.Lines.Add(GetCells(Doc1,1,i,2));

  for i:=1 to 20 do
   SetCells(Doc1,1,i,3,"Fuck");

  Doc1.Close;
  WordApp.Quit;

finally
  Doc1:=UnAssigned;
  WordApp:=UnAssigned;
end;

end;


 
GanibalLector ©   (2005-03-11 02:58) [6]

Выйти без изменений :

Doc1.Close(0);
WordApp.Quit;


 
AL CAPONE   (2005-03-14 15:45) [7]

Спасибо огромное за помощь! Со всем этим разобрался и привёл в рабочий вид. Осталось ещё одно : необходимо считать ячейку ВОРДА с математическими выражениями и формулами и закинуть её на форму. Ты не подскажешь, на какой компонент её можно закинуть для корректного отображения. Вроде народ говорил об OleContainer-е, но он отображает тока весь документ, а мне нужна одна заданная ячейка. Спасибо !


 
AL CAPONE   (2005-03-19 17:47) [8]

Помогите сделать корректное отображение математических формул из заданной ячейки в таблице ВОРДА на компонент формы. Вроде
народ говорил, что это возможно в OleContainer, но он отображает тока весь документ сразу, а нужна 1 ячейка


 
YurikGL ©   (2005-03-19 18:01) [9]


> Помогите сделать корректное отображение математических формул
> из заданной ячейки в таблице ВОРДА на компонент формы. Вроде
>
> народ говорил, что это возможно в OleContainer, но он отображает
> тока весь документ сразу, а нужна 1 ячейка

Попробуй цепляться не к документу Ворд а к Microsoft Equation...


 
GanibalLector ©   (2005-03-19 22:04) [10]

2 YurikGL ©   (19.03.05 18:01) [9]
Это сложно.Только великий гуру GuAV делал такое ;)


 
AL CAPONE   (2005-03-21 19:35) [11]

Народ, а если серьёзно, то может мне кто-нибудь помочь с этим или нет ??? Обращение к  Microsoft Equation - это что, поясните, кто знает, с чем это блюдо едят ;))


 
GanibalLector ©   (2005-03-21 19:52) [12]

Это читал?
http://delphimaster.net/view/10-1110228903/


 
GuAV ©   (2005-03-22 00:28) [13]

2 GanibalLector ©   (19.03.05 22:04) [10]

Я не говорил что я такое делал - я говорил только что кое что с этим SDK получилось.

Про взять объект из ячейки - через  буфер обмена (.InlineShapes.Item(0).Range.Copy).

В MathType SDK есть ф-ция ExportEquations (сохраняет формулы в файлы), так вот она тоже работает через буфер обмена... и mathtype SDK поможет только если есть mathtype.

Кроме буфера обмена способов наверное нет, кроме разве что самому читать из Word документа.


 
AL CAPONE   (2005-03-24 17:56) [14]

1) Что именно у тебя получилось с SDK и для чего нужна ваще эта прога ?
2) через  буфер обмена (.InlineShapes.Item(0).Range.Copy) - это процедура какого элемента Дельфы, опиши пожалуйста поподробнее, а то я в этом полный лох.
Заранее спасибо !


 
GuAV ©   (2005-03-25 02:36) [15]

Этот код вставляет первый графич объект (в т.ч. формулу) в ячейке 1,1 в OleContainer.
Формула копируется в буфер обмена, оттуда вставляется в OleContainer.

var WD, DOC: Variant;
begin
 WD := CreateOleObject("Word.Application");
 try
   Doc := WD.Documents.Open("C:\1.DOC");
   Doc.Tables.Item(1).Cell(1,1)
     .Range.InlineShapes.Item(0).Range.Copy;
   OleContainer1.Paste;
 finally
   WD.Quit;
 end;
end;


 
GuAV ©   (2005-03-25 02:37) [16]

MathType SDK - описание функций mathtype и формата mathtype и equation editor.
Функции позволяют форматировать, преобразовывать и экспортировать формулы из макросов Word"а и из внешних приложений. функции доступны только для mathype (не для equation).

Например, такой код заменяет @1 на X, а @2 на Zed в формуле в буфере обмена. В этом случае кроме буфера обмена исходная формула и результат могли бы быть также в переменной или в файле.

var MTResult: Integer;
begin
 MTResult := MTInitAPI(mtinitLAUNCH_NOW, -1);
 MTCheck(MTResult);
 try
   MTResult := MTEquationOnClipboard;
   MTCheck(MTResult);

   MTResult := MTXFormReset;
   MTCheck(MTResult);

   MTResult := MTXFormSetPrefs(mtxfmPREF_EXISTING, nil);
   MTCheck(MTResult);

   MTResult := MTXFormAddVarSub(mtxfmSUBST_ALL, mtxfmVAR_SUB_PLAIN_TEXT,
     "@1", Length("@1"), mtxfmVAR_SUB_PLAIN_TEXT,
     "X", Length("X"), mtxfmSTYLE_VARIABLE);
   MTCheck(MTResult);

   MTResult := MTXFormAddVarSub(mtxfmSUBST_ALL, mtxfmVAR_SUB_PLAIN_TEXT,
     "@2", Length("@2"), mtxfmVAR_SUB_PLAIN_TEXT,
     "Zed", Length("Zed"), mtxfmSTYLE_VARIABLE);
   MTCheck(MTResult);

   MTResult := MTXFormEqn(mtxfmCLIPBOARD, mtxfmTEXT, "",
     0, mtxfmCLIPBOARD, mtxfmTEXT, "", 0, "", nil);

   MTCheck(MTResult);

   OleContainer1.Paste;
 finally
   MTTermAPI;
 end;
end;


Описание формата в SDK - и для mathtype и для equation. пока не пытался исползовать.

http://dessci.com/en/reference/sdk/


 
AloneAli   (2005-03-25 09:00) [17]

А не лучше ли использовать поля Word"а???
ИМХО, это намного проще, чем связываться с Equation или с MathType.
К тому же (точно незнаю), но мне кажется поля более корректно отображаются, чем формулы.


 
AloneAli   (2005-03-25 09:04) [18]


> GuAV ©   (25.03.05 02:37) [16]

А ты не мог бы скинуть dll на мыло?


 
GuAV ©   (2005-03-25 16:47) [19]

dll это часть mathtype. нужно ставить mathtype.

описание функций есть по ссылке внизу [16] (там длинная анкета но на самом деле достаточно указать что-то похожее на мыло :-) )

Дельфовские прототипы ф-циям из dll могу выложить или скинуть.


 
AL CAPONE   (2005-03-26 17:11) [20]

Привет, GuAV !!!
Твоя процедура
var WD, DOC: Variant;
begin
WD := CreateOleObject("Word.Application");
try
  Doc := WD.Documents.Open("C:\1.DOC");
  Doc.Tables.Item(1).Cell(1,1)
    .Range.InlineShapes.Item(0).Range.Copy;
  OleContainer1.Paste;
finally
  WD.Quit;
end;
end;
работает на все 100, вот только проблема в том, что у меня в ячейке хранятся не только формулы и выражения, они ещё и перемешаны с текстом (в ячейке хранится вопрос и 5 вариантов ответа к нему, вся прога - тестирующая система). Вот такую вот ячейку-бутерброд мне и нужно полностью и корректно отобразить хоть на каком-нибудь элементе формы. HELP !!!
Кстати пробовал сам сделать считывание всей ячейки через
WordApp.ActiveDocument.Tables.Item(1).Cell(1,2).Range.Select;
WordApp.Selection.Copy;
OleContainer1.Paste;
но на 2-й строке выдаётся "Ошибка команды" и прога останавливается.
Подумал, что оптимально будет сделать так :
1) выделить всю ячейку со всем содержимым и скопировать её в буфер;
2) открыть новый документ ВОРДА;
3) вставить всю инфу туда и сохранить документ на диске;
4) испрользовать OleContainer.LoadFromFile для отображения всего документа;
5) динамически удалить документ с диска.
Вот только как это всё организовать и довести до ума, понятия не имею. Может подскажешь. Заранее спасибо и пока !!!


 
GuAV ©   (2005-03-27 00:11) [21]


>2) открыть новый документ ВОРДА;
> 3) вставить всю инфу туда и сохранить документ на
>диске;
> 4) испрользовать OleContainer.LoadFromFile для
> отображения всего документа;
> 5) динамически удалить документ с диска.


Зачем так усложнять ?   OleContainer.CreateObject("Word.Application"), False); создаст документ в OleContainer. А ещё проще сразу вставить туда что надо.


>WordApp.ActiveDocument.Tables.Item(1).Cell(1,2).Range.Select;
>WordApp.Selection.Copy;
>OleContainer1.Paste;

Странно, а у меня работает.
Кстати, не проще ли сразу Cell(1,2).Range.Copy; ?

Вообще, см. справку по офису. для ХР - VBAWD10.CHM .


 
VoaCo   (2005-03-27 16:46) [22]

Здравствуйте!
Помогите пожалуйста.

У меня вопрос как можно экспортировать таблицу ворд в базу (dbf)
потом читать из базы?


 
AL CAPONE   (2005-03-27 18:00) [23]

Привет, GuAV !!!
Перепробовал всё и знаешь, в чём оказалось дело: просто при создании этого документа ВОРДА он разок подвис и не сохранился как надо и теперь из него не копируются 2 ячейки из 400 с лишним штук. На остальных же ячейках программа прекрасно работает при помощи
WordApp.ActiveDocument.Tables.Item(1).Cell(i,j).Range.Copy;
OleContainer1.Paste;
Вот только 2 вопроса напросились:
1) при отображении в OleContainer у ячейки обрезается 0.5-1 см. её левого края, хотя в ВОРДЕ отрезки нет, а копируется всё полностью. Размер OleContainer-a тоже больше размера самой ячейки. Так что непонятно, почему это происходит. Может есть какие-нибудь идеи ?
2) случаем не ведаешь, как при работе программы очистить OleContainer для помещения в него другой ячейки ?
Спасибо огромное за помощь !


 
YurikGL ©   (2005-03-28 06:58) [24]

VoaCo   (27.03.05 16:46) [22]

см. http://www.delphimaster.ru/articles/dbtoword/index.html

тока делать все наоборот.


 
AloneAli   (2005-03-28 11:21) [25]


> GuAV ©   (25.03.05 16:47) [19]
> Дельфовские прототипы ф-циям из dll могу выложить или скинуть.

Скинь на мыло, пожалуйста!



Страницы: 1 вся ветка

Текущий архив: 2006.01.22;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.031 c
11-1117459740
rOOse
2005-05-30 17:29
2006.01.22
Добавление unit a


3-1132810047
megaspring
2005-11-24 08:27
2006.01.22
Запросы&Access


2-1136225094
Sergey2005
2006-01-02 21:04
2006.01.22
JPG в BMP


3-1132719667
AlexLines
2005-11-23 07:21
2006.01.22
Изменение каталога временного файла BDE


14-1135680476
ANB
2005-12-27 13:47
2006.01.22
Таки поднялся Крымский вопрос.