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

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
    Stream:= nil;
    Stream:= TFileStream.Create;
    with DM.ADOQuery1 do
      begin
        Close;
        sql.text:='SELECT Cost FROM Settings ';
        Open;
        while not Eof do
          begin
            TBlobField(FieldByName('Cost')).SaveToStream(Stream);
            Next;
          end;
      end;

    Excel:=CreateOleObject('Excel.Application');
    Excel.Visible:=False;
    Excel.WorkBooks.Open(Stream);
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38110036
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я через OLE-контейнер открывал.
Там были какие-то нюансы, с ходу
по памяти не расскажу, но решаемые.

Думаю, с "отдельным" Application-ом
тоже вполне возможно, различий не
очень много должно быть.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38110037
ravt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Метод Open не будет работать с потоком.
как вариант сохраняйте во временный файл и открывайте его, после всего удаляйте.
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38110045
Jonnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ravtМетод Open не будет работать с потоком.
как вариант сохраняйте во временный файл и открывайте его, после всего удаляйте.

Поэтому и хочу открывать из потока, что бы не создвать файлы и не удалять их потом.

это хорошо что возможно, тогда буду дальше изучать.
Хотелось только понять в какую сторону копать.
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38110119
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ravt> Метод Open не будет работать с потоком.

Я вроде на понятно русском сказал, что это у меня
точно работало, точно с потоком, точно без файла.
Правда, не TExcelApplication, а OleContainer, но не
думаю, что это имеет какое-то значение.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38110121
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jonnik> Хотелось только понять в какую сторону копать.

Сравните содержимое потока и обычного файла.
В случае OLE были, IIRC, какие-то нюансы, типа
"лишнего" заголовка, который нужно было откидывать.
В целом, ничего сложного. Посмотрите в книге
"Тенцер, Елманова - Технология COM" - возможно,
там есть что-то на эту тему.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38110165
Jonnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гаджимурадов РустамJonnik> Хотелось только понять в какую сторону копать.

Сравните содержимое потока и обычного файла.
В случае OLE были, IIRC, какие-то нюансы, типа
"лишнего" заголовка, который нужно было откидывать.
В целом, ничего сложного. Посмотрите в книге
"Тенцер, Елманова - Технология COM" - возможно,
там есть что-то на эту тему.



Нашел такую функцию

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
procedure LoadDocument; 
 var 
     DocStream: TMemoryStream; 
 begin 
   DocStream:= TMemoryStream.Create; 
   TBlobField(aTable.FieldByName('Blob')).SaveToStream(DocStream); 
   DocStream.Position := 0; 
   aOleContainer.LoadFromStream(DocStream); 
   aOleContainer.Run; 
   DocStream.Destroy; 
 end;



Я на верном пути?
Только не знаю что с ней толком делать.
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38110203
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jonnik> Нашел такую функцию

А что она по-Вашему делает?
Зачем её искать? Такую простую
Вы и сами должны были написать.

> Я на верном пути?

Ну как. Нулевой шаг сделали, пожалуй.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38111539
Jonnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JonnikГаджимурадов РустамJonnik> Хотелось только понять в какую сторону копать.

Сравните содержимое потока и обычного файла.
В случае OLE были, IIRC, какие-то нюансы, типа
"лишнего" заголовка, который нужно было откидывать.
В целом, ничего сложного. Посмотрите в книге
"Тенцер, Елманова - Технология COM" - возможно,
там есть что-то на эту тему.



Нашел такую функцию

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
procedure LoadDocument; 
 var 
     DocStream: TMemoryStream; 
 begin 
   DocStream:= TMemoryStream.Create; 
   TBlobField(aTable.FieldByName('Blob')).SaveToStream(DocStream); 
   DocStream.Position := 0; 
   aOleContainer.LoadFromStream(DocStream); 
   aOleContainer.Run; 
   DocStream.Destroy; 
 end;




Проблема в том что этот вараинт почти работает, но он выдает ошибку
"EOleSysError with message %1 already exists" на этой строке aOleContainer.LoadFromStream(DocStream);
Поиск в инете ничег оне дал. Многие пишут про эту ошибку, но нигде не нашел решения ее устранения.
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38111552
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
насколько я понимаю, Excel не работает ни с чем, кроме файлов
даже из памяти загрузить не может
так что имхо без файлов не обойтись
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38111563
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JonnikМногие пишут про эту ошибку, но нигде не нашел решения ее устранения.Значит, плохо искали. Читайте про IStorage, TStreamHeader etc.
Всех подробностей без подсматривания в справку я не упомню,
но вроде бы без IStorage можно обойтись одним оперированием
с TStreamHeader (это и есть тот самый заголовок).

Ищите, читайте, пробуйте. Если не получится - дам Вам кусок
готового кода из проекта, хотя не уверем, что Вам это поможет.
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38111564
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUнасколько я понимаю, Excel не работает ни с чем, кроме файлов
даже из памяти загрузить не может
так что имхо без файлов не обойтисьExcel умеет, всё что нужно, лишь бы руки откуда нужно росли.
В данном случае не надо полагаться на "слышал звон" - тем более,
если сам по себе OLE-контейнер может хранить и обрабатывать
документ без файла - где-то же он его хранит - значит, в памяти.
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38111663
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамВ данном случае не надо полагаться на "слышал звон"

Как называется метод в Excel-е, который позволяет открыть Excel-данные, и не принимает в качестве аргумента FileName ?
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38112179
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU> Как называется метод в Excel-е

В каком ещё Excel-e ? Кто такой Excel для Delphi? В Delphi нет такого понятия. Клиника.

P.S. LoadFromStream, OpenStream

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38112273
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jonnik,
забей

Гаджимурадов Рустам,
IExcelApplication/IExcelWorksheets
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38112874
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU Jonnik,
забейРасписка в собственной профнепригодности. Вот, простейший набросок, только что
проверил на пустом проекте - работает почти с любым типом файлов, включая XLS:

Код: 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.
procedure BLOBToOleContainer(const Stream: TStream; OleContainer : TOleContainer);
  type
    TStreamHeader = record
      case Integer of
        0: ( // New
          Signature: Integer;
          DrawAspect: Integer;
          DataSize: Integer);
        1: ( // Old
          PartRect: TSmallRect);
    end;

  const
    StreamSignature = $434F4442;
    DVASPECT_CONTENT   = 1;
    DVASPECT_ICON      = 4;

  var
    Header : TStreamHeader;
    TempStream : TMemoryStream;
    R : TRect;
begin
  if OleContainer.OldStreamFormat then
  begin
    R := OleContainer.BoundsRect;
    Header.PartRect.Left := R.Left;
    Header.PartRect.Top := R.Top;
    Header.PartRect.Right := R.Right;
    Header.PartRect.Bottom := R.Bottom;
  end else
  begin
    Header.Signature := StreamSignature;
    if OleContainer.Iconic
      then Header.DrawAspect := DVASPECT_ICON
      else Header.DrawAspect := DVASPECT_CONTENT;
  end;

  TempStream := TMemoryStream.Create;
  try
    Header.DataSize := Stream.Size;
    TempStream.Write(Header, SizeOf(Header));
    Stream.Position := 0;
    TempStream.CopyFrom(Stream, Header.DataSize);
    TempStream.Position := 0;
    OleContainer.LoadFromStream(TempStream);
  finally
    TempStream.Free;
  end;
end;


И это, повторюсь, "ломовой" вариант, а не кошерный через CreateObjectFromInfo с
CreateInfo.CreateType = ctFromData (дабы не возиться с IStorage и иже с ним).
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38113136
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам

поистине работает
что странно
ибо ни ExcelApplication, ни ExcelWorksheets не имеются ни чего общего со Stream или IStorage
очень странно

интересно, как это работает
и можно ли применить сию фичу на OleAutomation
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38113149
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU> поистине работает. что странно

Море удивления, ппц. Когда я говорю, что это возможно -
следует голое отрицание, без кода, без собственных попыток,
без чтения доки или хотя бы интерфейсов, без ничего вообще.
Когда я говорю, что у меня это работало и работает в разных
ПО разными способами (в т.ч. без ОЛЕ) - следует ответ
"забей, невозможно" и т.д. Когда я даю семпл - следует
ответ "о чудо! это работает". Подумайте, всё ли нормально
в этой цепочке действий и поведения.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38113326
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам

Я больше трёх лет работаю с Excel. Взаимодействие с ним происходит по опубликованным интерфейсам. И там нет ни Stream, ни IStorage, к которому сводится OleContainer.LoadFromStream

Поэтому я и говорю, что данная работа странна. По каким то внутренним механизмам.
Теперь переделай данный код под OleAutomation
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38113377
Човайохоя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гаджимурадов Рустаму меня это работало и работает в разных
ПО разными способами (в т.ч. без ОЛЕ) ...Было бы не плохо, если бы Вы продемонстрировали пример без ОлеКонтейнера
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38113716
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU> Я больше трёх лет работаю с Excel.

Ну давайте начнём щас меряться пиписьками.
Я тоже гораздо больше трёх лет работаю с Excel.
Хотя не только с ним, конечно. И?

> Взаимодействие с ним происходит по опубликованным интерфейсам.
> И там нет ни Stream, ни IStorage, к которому сводится OleContainer.LoadFromStream

Наверное, нет. И это логично и правильно, ибо это методы не Excel. Внезапно?

> Теперь переделай данный код под OleAutomation

Оно мне надо? Я привёл простой пример,
показал что это работает и что ты неправ.
Дальше уж как-нибудь сам.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38113718
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Човайохоя> Было бы не плохо, если бы Вы продемонстрировали пример без ОлеКонтейнера

ОК, вечером постараюсь, как будет свободное время.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38113987
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам ,

у меня наоборот возникает ощущение, что ты тут активно хочешь доказать, что у тебя писька длиннее
что странно на фоне непонимания сути COM и OLE
в целом - я как и все здесь присутствующие буду рад увидеть код, работающий по OleAutomation
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38114006
Човайохоя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SOFT FOR YOU... ты тут активно хочешь доказать, что у тебя писька длиннее...молчи, глупый человек, а то нихрена не увидим :)
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38115454
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
боже, куда ты забрал от нас Гаджимурадова Рустама ?
...
Рейтинг: 0 / 0
25 сообщений из 108, страница 1 из 5
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Открытие экселя из TMemoryStream
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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