Igoryan
|
Hungry Monster
|
|
|
|
Рег.: 07.11.2003
|
Сообщений: 1342
|
Из: Раменки
|
Рейтинг: 3
|
|
открытие документа Winword
17.11.2006 16:13
|
|
|
В БД (MSSQL) лежит документ word, который нужно открыть в ворде. Как вариант, можно загрузить файл из БД, сохранить его на диск и потом открыть вордом. Что-то типа:
WordApp->Documents->Open( "файл.doc" );
Вопрос: можно ли каким-нибудь образом загрузить этот файл в Word, не сохраняя его на диске?
|
|
heGoat
|
меритократ
|
|
|
|
Рег.: 28.08.2002
|
Сообщений: 10419
|
Из: стойло
|
Рейтинг: 6576
|
|
Re: открытие документа Winword
[re: Igoryan]
17.11.2006 20:56
|
|
|
можно через memory stream
|
think you are different? |
|
alexk
|
addict
|
|
|
|
Рег.: 26.10.2003
|
Сообщений: 571
|
|
Рейтинг: 6
|
|
Re: открытие документа Winword
[re: heGoat]
18.11.2006 00:06
|
|
|
А можно немножко поподробнее? Конкретно, интересует, как его в Word засунуть.
|
|
heGoat
|
меритократ
|
|
|
|
Рег.: 28.08.2002
|
Сообщений: 10419
|
Из: стойло
|
Рейтинг: 6576
|
|
Re: открытие документа Winword
[re: alexk]
18.11.2006 17:41
|
|
|
ты среду скажи сначала...
|
think you are different? |
|
Libero
|
in flight
|
|
|
|
Рег.: 19.09.2005
|
Сообщений: 271
|
Из: В
|
Рейтинг: 0
|
|
Re: открытие документа Winword
[re: heGoat]
18.11.2006 18:15
|
|
|
Тоже интересно, среда MS Visual C++ 6.0 До сих пор проблема решалась с помощью временного файла.
|
|
alexk
|
addict
|
|
|
|
Рег.: 26.10.2003
|
Сообщений: 571
|
|
Рейтинг: 6
|
|
Re: открытие документа Winword
[re: heGoat]
18.11.2006 23:12
|
|
|
Delphi/С++ Builder, если это имеет значение. Word 2003, документ в WordML.
Вообще, интересует какой есть механизм в ворде для того, чтобы открыть документ не из файла на диске.
Пробовал:
code:
Application.Documents.Add();
Application.ActiveDocument.Content.InsertXML(..);
но результат получается немного не тот, что нужен (например, левый отступ на странице остается тот, что по умолчанию для создаваемого документа, а не тот, что во вставляемом документе)
Редактировал alexk (18.11.2006 23:35)
|
|
Libero
|
in flight
|
|
|
|
Рег.: 19.09.2005
|
Сообщений: 271
|
Из: В
|
Рейтинг: 0
|
|
Re: открытие документа Winword
[re: heGoat]
18.11.2006 23:25
|
|
|
Класс MemoryStream определен только в .NET Framework Class Library (или ты имел ввиду другой memory stream?)
|
|
Basilio
|
GreenOne
|
|
|
|
Рег.: 14.10.2002
|
Сообщений: 13750
|
Из: Москва
|
Рейтинг: 3476
|
|
Re: открытие документа Winword
[re: alexk]
19.11.2006 12:15
|
|
|
Попробуй покопать в сторону TStreamAdapter и IPersistStreamInit Вордовский документ может наверное поддерживать и такой интерфейс. Например, в TWebBrowser можно грузить из стрима: (WB.Document as IPersistStreamInit).Load(AdStream);
Редактировал Basilio (19.11.2006 12:16)
|
|
alexk
|
addict
|
|
|
|
Рег.: 26.10.2003
|
Сообщений: 571
|
|
Рейтинг: 6
|
|
Re: открытие документа Winword
[re: Basilio]
20.11.2006 11:48
|
|
|
В ответ на:
Попробуй покопать в сторону TStreamAdapter и IPersistStreamInit Вордовский документ может наверное поддерживать и такой интерфейс.
Попробовал, при запросе IPersistStreamInit Word.Document возвращает E_NOINTERFACE
Погуглив, нашел что Word.Document поддерживает IPersistStorage, и это возможно, единственный способ загрузить документ не из файла. Но у меня документ в XML, а его, как его запихнуть в IStorage я не представляю
|
|
heGoat
|
меритократ
|
|
|
|
Рег.: 28.08.2002
|
Сообщений: 10419
|
Из: стойло
|
Рейтинг: 6576
|
|
Re: открытие документа Winword
[re: alexk]
20.11.2006 14:30
|
|
|
VCL - великая кладезь кода....
code: procedure TOleContainer.LoadFromStream(Stream: TStream);
var
DataHandle: HGlobal;
Buffer: Pointer;
Header: TStreamHeader;
begin
DestroyObject;
Stream.ReadBuffer(Header, SizeOf(Header));
if (Header.Signature <> StreamSignature) and not FOldStreamFormat then
raise EOleError.CreateRes(@SInvalidStreamFormat);
DataHandle := GlobalAlloc(GMEM_MOVEABLE, Header.DataSize);
if DataHandle = 0 then OutOfMemoryError;
try
Buffer := GlobalLock(DataHandle);
try
Stream.Read(Buffer^, Header.DataSize);
finally
GlobalUnlock(DataHandle);
end;
OleCheck(CreateILockBytesOnHGlobal(DataHandle, True, FLockBytes));
DataHandle := 0;
OleCheck(StgOpenStorageOnILockBytes(FLockBytes, nil, STGM_READWRITE or
STGM_SHARE_EXCLUSIVE, nil, 0, FStorage));
OleCheck(OleLoad(FStorage, IOleObject, Self, FOleObject));
FDrawAspect := Header.DrawAspect;
InitObject;
UpdateView;
except
if DataHandle <> 0 then GlobalFree(DataHandle);
DestroyObject;
raise;
end;
end;
портировать на VS предлагаю самостоятельно. API тот же...
суть кода - не надо пытаться заставить оле-объект загрузить что-то, надо его изначально создавать из потока, благо OLE позволяет...
|
think you are different? |
|