Форум: "Corba";
Текущий архив: 2006.01.22;
Скачать: [xml.tar.bz2];
Вниз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 вся ветка
Форум: "Corba";
Текущий архив: 2006.01.22;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.044 c