открытие документа Winword
можно через memory stream
А можно немножко поподробнее? Конкретно, интересует, как его в Word засунуть.
ты среду скажи сначала...
До сих пор проблема решалась с помощью временного файла.
Вообще, интересует какой есть механизм в ворде для того, чтобы открыть документ не из
файла на диске.
Пробовал:
Application.Documents.Add;
Application.ActiveDocument.Content.InsertXML(..);
но результат получается немного не тот, что нужен (например, левый отступ на странице остается тот, что по умолчанию для создаваемого документа, а не тот, что во вставляемом документе)
![](/images/graemlins/frown.gif)
Класс MemoryStream определен только в .NET Framework Class Library (или ты имел ввиду другой memory stream?)
Вордовский документ может наверное поддерживать и такой интерфейс.
Например, в TWebBrowser можно грузить из стрима:
(WB.Document as IPersistStreamInit).Load(AdStream);
Попробуй покопать в сторону TStreamAdapter и IPersistStreamInitПопробовал, при запросе IPersistStreamInit Word.Document возвращает E_NOINTERFACE
Вордовский документ может наверное поддерживать и такой интерфейс.
![](/images/graemlins/frown.gif)
Погуглив, нашел что Word.Document поддерживает IPersistStorage, и это возможно, единственный способ загрузить документ не из файла. Но у меня документ в XML, а его, как его запихнуть в IStorage я не представляю
![](/images/graemlins/frown.gif)
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 позволяет...
Оставить комментарий
Slavaga
В БД (MSSQL) лежит документ word, который нужно открыть в ворде.Как вариант, можно загрузить файл из БД, сохранить его на диск и потом открыть вордом. Что-то типа:
WordApp->Documents->Open( "файл.doc" );
Вопрос: можно ли каким-нибудь образом загрузить этот файл в Word, не сохраняя его на диске?