powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Открытие экселя из TMemoryStream
8 сообщений из 108, страница 5 из 5
Открытие экселя из TMemoryStream
    #39907728
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброе утро. Вы простите, случаем не клон?
А-то у нас один товарищ есть, почти Ваш тёзка.

> Можно поподробнее на счет " или можно делать CreateOleObject, но раньше"?

Если я правильно понял о чём Вы - то вызвать
CreateOleObject, что создаст экземпляр сервера,
в который и "зальётся" документ из потока.

Вы лучше опишите Вашу задачу и приведите код.

P.S. Бессмертная тема, ей-Богу, даже в личку по
поводу неё писали.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #39907859
Гаджимурадов Рустам,

да я вроде человек. Про тезку не в курсе.

То есть OleLoad "заливает" объект содержащийся в FStorage в первый попавшийся ему экземпляр сервера?

Задача: Имеется шаблон XLS который хранится в базе данных. Необходимо для конкретного документа заполнить шаблон значениями и сохранить на диск. Ранее это было реализовано через сохранение шаблона на диск во временный каталог пользователя с последующим FExcelApp:= CreateOleObject('Excel.Application'); FExcelApp.Workbooks.Add(FileNameXLS);

Наткнулся на эту тему и захотел переделать. Код ниже не дает желаемого эффекта.

после FExcelApp := StreamToExcel(filestream); в FExcelApp экземпляр сервера с пустой книгой. Как заставить OleLoad залить содержимое хранилища в открытый экземпляр сервера?


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
function GenerateTSCAFile(id_document:Integer):boolean;
var
  i:integer;
  filestream:TMemoryStream;
  FExcelApp: OleVariant;

  function StreamToExcel(const Stream: TMemoryStream):OleVariant;
  var
    DataHandle: HGLOBAL;
    Buffer: Pointer;
    FLockBytes: ILockBytes;
    FStorage: IStorage;
    FOleObject: IOleObject;
  begin
    DataHandle := GlobalAlloc(GMEM_MOVEABLE, Stream.Size);
    if DataHandle = 0 then OutOfMemoryError;

    try
      Buffer := GlobalLock(DataHandle);
      try
        Stream.Read(Buffer^, Stream.Size);
      finally
        GlobalUnlock(DataHandle);
      end;
      CreateILockBytesOnHGlobal(DataHandle, True, FLockBytes);
      OleCheck(StgOpenStorageOnILockBytes(FLockBytes, nil, STGM_READWRITE or STGM_SHARE_EXCLUSIVE, nil, 0, FStorage));
      result := CreateOleObject('Excel.Application');
      result.Application.EnableEvents:=true;
      result.Visible:=false;
      OleCheck(OleLoad(FStorage, IOleObject, nil, FOleObject));
    except
      VarClear(result);
      if (DataHandle <> 0)
        then GlobalFree(DataHandle);
      if (FOleObject <> nil)
        then FOleObject.Close(OLECLOSE_NOSAVE);
      raise;
    end;
  end;

begin
  try
    filestream := TMemoryStream.Create;
    filestream.Clear;

    try
      If MainDM.GetSystemFileFormBase(1,filestream) then begin
        FExcelApp := StreamToExcel(filestream);
        if ActivateSheet(FExcelApp,1,1) then begin
          ShowMessage(VarToStr(FExcelApp.ActiveSheet.Range['B23']));
        end;
      end;
    except
      on E : Exception do begin
        Showmessage(E.Message);
      end;
    end;
  finally
    FreeAndNil(filestream);

    if not VarIsEmpty(FExcelApp) then begin
      for i := 1 to FExcelApp.Workbooks.Count do begin
        FExcelApp.WorkBooks[i].Close;
      end;

      FExcelApp.Quit;
      VarClear(FExcelApp);
    end;
  end;

end;


...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #39907890
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир Золотарёв> Задача: Имеется шаблон XLS который хранится в базе данных.
Владимир Золотарёв> Необходимо для конкретного документа заполнить шаблон значениями

Тупо берёте код из приведённого примера и подставляете
в него BLOBToExcel(ВашаBLOBStreamПеременная). Всё.

Владимир Золотарёв> после FExcelApp := StreamToExcel(filestream);
Владимир Золотарёв> в FExcelApp экземпляр сервера с пустой книгой.

Значит, Вы что-то сделали неправильно, там должен быть Ваш шаблон.

Владимир Золотарёв> Как заставить OleLoad залить содержимое хранилища в открытый экземпляр сервера?


В один из нескольких открытых или как?
И в уже открытую книгу или создать новую?

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #39907902
Гаджимурадов Рустам

Тупо берёте код из приведённого примера и подставляете
в него BLOBToExcel(ВашаBLOBStreamПеременная). Всё.

Собственно почти так и сделал


авторЗначит, Вы что-то сделали неправильно, там должен быть Ваш шаблон.

Код: pascal
1.
2.
3.
4.
5.
6.
      CreateILockBytesOnHGlobal(DataHandle, True, FLockBytes);
      OleCheck(StgOpenStorageOnILockBytes(FLockBytes, nil, STGM_READWRITE or STGM_SHARE_EXCLUSIVE, nil, 0, FStorage));
      result := CreateOleObject('Excel.Application');
      result.Application.EnableEvents:=true;
      result.Visible:=false;
      OleCheck(OleLoad(FStorage, IOleObject, nil, FOleObject));



В result пустая книга. Если OleLoad "заливает" объект содержащийся в FStorage в первый попавшийся ему экземпляр сервера то где-то ошибка. Вот понять где не могу. Вроде все верно написано.

авторВ один из нескольких открытых или как?
И в уже открытую книгу или создать новую?

В один конкретный. Который создался через

Код: pascal
1.
result := CreateOleObject('Excel.Application');



авторИ в уже открытую книгу или создать новую?

Это не критично. Книгу можно и до этого создать. Можно в новую, можно в активную.
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #39907938
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир Золотарёв> Собственно почти так и сделал

Если у меня работает, а у Вас нет - значит, не так.

> В один конкретный. Который создался через

В конкретный - без доп.телодвижений не получится.

> Книгу можно и до этого создать. Можно в новую, можно в активную.

В уже существующую загрузить шаблон (или книгу) -
точно не получится, ибо сам Эксель такого не умеет.
Скопировать в том или ином виде - можно, но после.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #39908379
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так на чём Вы остановились?
С пом. BLOBToExcel не получилось?
А-то НГ на носу, не до Вас будет. :)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #39909249
Гаджимурадов Рустам,
Увы, пока не получилось. Сейчас разбираюсь с IPersistStorage. По сути OleLoad c ним же и работает.
После праздников постараюсь сделать тестовый пример с BLOBToExcel, что бы было легче понять чего нет у меня и есть у вас.

Спасибо за помощь и с наступающим. )
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #39909429
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир Золотарёв
Увы, пока не получилось.
После праздников постараюсь сделать тестовый пример с BLOBToExcel
Такое ощущение, что Вы заблудились в трёх соснах. Простейшее

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
function BLOBToExcel(const Stream: TStream) : OleVariant;
var
  DataHandle: HGLOBAL;
  Buffer: Pointer;
  FLockBytes: ILockBytes;
  FStorage: IStorage;
  FOleObject: IOleObject;
begin
  DataHandle := GlobalAlloc(GMEM_MOVEABLE, Stream.Size);
  if DataHandle = 0 then OutOfMemoryError;
  try
    Buffer := GlobalLock(DataHandle);
    try
      Stream.Read(Buffer^, Stream.Size);
    finally
      GlobalUnlock(DataHandle);
    end;

    Result := CreateOleObject('Excel.Application');
    ...
    CreateILockBytesOnHGlobal(DataHandle, True, FLockBytes);
    OleCheck(StgOpenStorageOnILockBytes(FLockBytes, nil, STGM_READWRITE or STGM_SHARE_EXCLUSIVE, nil, 0, FStorage));
    OleCheck(OleLoad(FStorage, IOleObject, nil, FOleObject));
    FOleObject.DoVerb(0, nil, nil, 0, 0, Rect(0, 0, 0, 0));

  except
    if (DataHandle <> 0)
      then GlobalFree(DataHandle);
    if (FOleObject <> nil)
      then FOleObject.Close(OLECLOSE_NOSAVE);
    raise;
  end;
end;

function GenerateTSCAFile(id_document:Integer):boolean;
var
  i:integer;
  filestream:TMemoryStream;
  FExcelApp: OleVariant;

begin
  try
    filestream := TMemoryStream.Create;
    filestream.Clear;

    try
      If MainDM.GetSystemFileFormBase(1,filestream) then
      begin
        FExcelApp := BLOBToExcel(filestream);
        ShowMessage(VarToStr(FExcelApp.ActiveSheet.Range['B23']));
      end;
    except
      on E : Exception do Showmessage(E.Message);
    end;
  finally
    FreeAndNil(filestream);
  end;
end;


работает ?
...
Рейтинг: 0 / 0
8 сообщений из 108, страница 5 из 5
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Открытие экселя из TMemoryStream
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]