Документ взят из кэша поисковой машины. Адрес оригинального документа : http://www.snto-msu.net/showflat.php?Number=5397262&src=arc&showlite=
Дата изменения: Unknown
Дата индексирования: Wed Apr 13 04:45:50 2016
Кодировка: Windows-1251
открытие документа Winword - Public forum of MSU united student networks
Root | Google | Yandex | Mail.ru | Kommersant | Afisha | LAN Support
  
Technical >> Development (Archive)

Страницы: 1
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?
Страницы: 1

Technical >> Development (Archive)

Дополнительная информация
0 зарегистрированных и 0 анонимных пользователей просматривают этот форум.

Модераторы:  DarkGray 

Печать темы

Права
      Вы можете создавать новые темы
      Вы можете отвечать на сообщения
      HTML отключен
      UBBCode включен

Рейтинг:
Просмотров темы:

Переход в