powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Открытие экселя из TMemoryStream
108 сообщений из 108, показаны все 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
Открытие экселя из TMemoryStream
    #38115622
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот, собственно, и пример без ОлеКонтейнера, принцип тот же:

Код: 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.
procedure BLOBToExcel(const Stream: TStream);
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));
    OleCheck(OleLoad(FStorage, IOleObject, nil, FOleObject));
    FOleObject.DoVerb(0, nil, nil, 0, 0, Rect(0, 0, 0, 0));

//    XLAPP := GetActiveOleObject('Excel.Application'); // коннектимся
//    или можно делать CreateOleObject, но раньше
//    или если нужно раннее связывание
//    XLApp := TExcelApplication.Create(Application);
//    XLApp.ConnectKind := ckRunningOrNew;
//    XLApp.Connect;
//    а дальше всё как обычно

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


OleCheck-и, управление хендлами и пр. по вкусу, не в них суть.
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38115629
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам,

т.е. если есть библиотека, создающая файл в TStream, его можно не на диск сохранять, а напрямую вбросить в Excel ?
И любая разумная версия, скажем от 2000 и выше это умеет ?

Здорово.

Интересно сделали ли подобную штуку с OpenOffice.org
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38115639
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUу меня наоборот возникает ощущение, что ты тут
активно хочешь доказать, что у тебя писька длиннееЗачем доказывать? Я это итак знаю.

А объяснить (а не доказать) я пытаюсь то, что ты некомпетентен и вредишь
(при чём очень настойчиво, невзирая ни на что) своими ответами ТСу.

Впрочем, я сам виноват, ибо не сразу признал тебя, болезного, не вспомнил,
а в профиль не сразу заглянул, иначе не стал бы связываться и пачкаться.

SOFT FOR YOUчто странно на фоне непонимания сути COM и OLEМда... Чего только не услышишь... А в чём в данном случае отличие?
И в чём вообще может быть отличие, если одно "надстройка" над
другим, а OleContainer не делает чего-то "левого" и сверхординарного?
Впрочем, я уверен, что у юного падавана обязательно найдутся возражения,
как минимум, что "использованы COM-вызовы, а не чистый OLE Automation!"
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38115652
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochт.е. если есть библиотека, создающая файл в TStream, его
можно не на диск сохранять, а напрямую вбросить в Excel ?
И любая разумная версия, скажем от 2000 и выше это умеет ?И не только в Excel, а в Word и почти в любое приложение.
"Почти", потому что последний вариант я не проверял, скажем,
с каким-нибудь PDF или тем более DJVU может и не сработать.
Насчёт версий - это по идее должно работать на всех версиях
с 96 по 2003, насчёт 2007 и выше я не уверен, интерфейс-то
поддерживается, а вот воспримет ли офис старый формат
файлов - ХЗ, не уверен (у кого установлен MSO2007-20010 -
проверьте, плиз, заодно и узнаем).

AriochИнтересно сделали ли подобную штуку с OpenOffice.orgЯ в нем не силён, это надо у Юрия спрашивать. Но думаю, можно.
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38115684
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам,

Код: pascal
1.
 OleCheck(OleLoad(FStorage, IOleObject, nil, FOleObject));


Яправильно понимаю, что второй параметр тут означает что-то типа "объект по умолчанию" ?
Просто XML может грузиться совсем разнымипрограммами, даже Excel XML...

Туда можно подставить интерфейс CLASS_ExcelOLEObject или CLASS_ExcelApplication чтобы точно грузилось в Excel ?

У IOLEObject вроде нет метода грузиться с IStorage, так что предварительно создавать ExcelApplication и брать от него OLEObject видимо нет смысла ?
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38115702
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам
Код: pascal
1.
2.
3.
procedure BLOBToExcel(const Stream: TStream);
...
      Stream.Read(Buffer^, Stream.Size);



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

Да я ж ещё раз говорю, рад если у тебя длиннее. Тока зачем тебе со мной мериться ?

По поводу листинга. Мож я слепой, но я вообще не увидел ни какой связи с OleAutomation и экземпляром ExcelApplication. Что собственно ТС (и другим нормальным людям) нужно.

вот так должна выглядеть адекватная функция загрузки:
Код: pascal
1.
2.
3.
4.
function LoadSheetFromStream(const ExcelApp: Variant; const Stream: TStream): Variant{ExcelWorksheet};
begin
  ...
end;
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38115713
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IStorage судя по всему грузит толькo старый XLS/BIFF файлы... Потому и Excel, что другие форматы не будет брать
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38115721
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochStream.Write ?
не, там правильно Read стоит

AriochIStorage судя по всему грузит толькo старый XLS/BIFF файлы... Потому и Excel, что другие форматы не будет брать
почему ты так подумал ?
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38115733
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

Птому что IStorage - это интерфес к OLE Compound Document, частный случай которого старые офисные форматы.
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38115735
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

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

Нет.

> Просто XML может грузиться совсем разнымипрограммами, даже Excel XML...

XML-то тут при чём вообще? Когда грузиться будет xlsx - это
не будет xml, архив и пр., само приложение об этом не знает.

> У IOLEObject вроде нет метода грузиться с IStorage

Метода нет, зато есть процедура. К чему все эти вопросы?

> так что предварительно создавать ExcelApplication и брать от него OLEObject видимо нет смысла ?

Конечно, нет, потому что нужно ровно обратное.
Ты вообще понимаешь постановку задачи?

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

Низачем. Это ты так решил. А я написал, что нет ни желания,
ни времени это делать, но тебе ведь невдомёк, как обычно.
По сути, ничего кроме переходов на личности и тупняка,
перемежающегося флудом, предложить не можешь.

> я вообще не увидел ни какой связи с OleAutomation и экземпляром ExcelApplication.

Желающий увидеть да увидит. Для тех, кто на бронепоезде -
я в комментариях написал аж три варианта перехода к
OLEAutomation, на любой вкус. А перламутровые пуговицы -
это не ко мне, бисер метать не привык.

> Что собственно ТС (и другим нормальным людям) нужно.

Ты за себя говори, а не за ТС и тем более за нормальных людей.
Задача решена? Решена. OLE-переменная получена? Получена.

> вот так должна выглядеть адекватная функция загрузки:

Какие проблемы переделать приведённую процедуру в желаемую
("должна" - поржал) функцию? Добавится ровно одна строчка кода.

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

пока напоминает выкрики выскочки, который где-то в тырнетах нарыл, что у OleContainer есть метод загрузки из Stream и показано, какой к нему хедер заполнить

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

Что это напоминает я уже сказал - "гуру с трёхлетним опытом Excel"
не только некомпетентен и неспособен это понять и принять, но ещё
и хамит и троллит. На этом всё, по сабжу будет что-то?

> а тем временем процедуры загрузки книги (файла) для какого
> то конкретного ExcelApplication как не было так и нет

Не может не быть того, что приведено. Повторяю - имеющий глаза
да увидит, не запихивать же разжёванное в рот сопротивляющимся.
Таки проблема с одной строчкой кода, переводящей приведённую
процедуру в желаемую функцию?

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

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

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
function LoadSheetFromStream(const ExcelApp: Variant; const Stream: TStream): Variant{ExcelWorksheet};
...
begin
  try
    ...
    Result := XLApp.ActiveSheet;
  except
    ...
end


и?
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38115913
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUа тем временем процедуры загрузки книги (файла) для какого то конкретного ExcelApplication как не было так и нет
ну и к чему этот выпендрёж ?
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38115919
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU> для какого то конкретного ExcelApplication как не было так и нет

А чем последний приведённый вариант не конкретный?
Только не надо щас про то, что в имеющийся WorkBook
должны добавиться листы из БЛОБ-документа.

Так что, действительно, "к чему этот выпендрёж" ? (с)
Марш на повышение квалификации. На курсы всякие.
Или книжки читать, в крайнем случае.


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

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

XML-то тут при чём вообще? Когда грузиться будет xlsx - это
не будет xml, архив и пр., само приложение об этом не знает.


Не просто XML, а Excel XML. Формат такой.

Но поскольку IStorage сделан под классические XLS/DOC и прочие OLE Compound, то и Excel XML и XLSX отпадают.
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38115950
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собственно вопрос был "откуда Винда узнает, что грузить нужно именно Excell, а не например Фотошоп.
И ответ - в IStorage будет формат XLS, как подвид OLE Compound.

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

твой пример во-первых, не взаимодействует с Excel. Во-вторых, не взаимодействует с конкретным ExcelApplication. В итоге у тебя нет примера без OleContainer-а. А пальцы гнёшь так, как будто сам написал Excel и технологию OleAutomation
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38117144
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я всё понимаю, но удосужится ли великий Гаджимурадов Рустам продемонстрировать не поделку на коленке, а нормальную рабочую функцию ?

мои предположения:
1) похоже не получится. скорее всего оле-контейнер открывается по BOM в стриме, и как справедливо заметил Arioch , файлы типа xlsx не откроются, ибо там BOM zip-файла.
2) иначе говоря не Stream цепляется к оле-контейнеру (как необходимо), а наоборот оле-контейнер идентифицируется по стриму
3) скорее всего загрузка из памяти представляет временное сохранение в файл. как по сути уже советовали в 13769439

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

Поделки в ближайшем зеркале. А нормальные рабочие
функции уже приведены в нескольких вариантах.
Додумывание сабжа и условий по ходу предлагаю
оставить себе.

> 3) скорее всего загрузка из памяти представляет временное сохранение в файл

Бред.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38117204
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) ты не привёл нормальной функции
2) ты тупо скопировал код из TOleContainer.LoadFromStream
3) много выпендриваешься
4) не провёл исследований, доказывающих, что в конечном счёте не происходит загрузки из файла
5) а я это исследование могу провести. но для этого нужен рабочий код, а не твоё собрание букв и знаков препинания, которые ты называешь якобы рабочим кодом. грош цена твоему коду
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38117212
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нормальность у каждого своя. Мне достаточно того, что задачу автора она решает.
Твои критерии меня волнуют мало. Исследования проводить у меня нет ни времени,
ни желания, тем более неизвестно для кого. Тебе надо - ты и проводи. Тем более, что
исследований чтобы "доказаться отсутствие" - это нонсенс. При работе по сети
MSO тоже, к примеру, временный файл (в том или ином виде) создаёт - не считать
же теперь, что это вина пользователя. Это внутреннее дело сервера. Ну и насчёт
цены кода - не тебе её оценивать. Тем более, что ты вообще никакого кода не привёл.

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

Как будет момент - постараюсь вариант для всех версий сделать,
а для 2003 включительно подходит любой из вышеприведённых.

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

не называй заголовок BOM'омо.

BOM - это специфично Юникодовская хня с очень узкой целью.

ЗАголовок, magic bytes, whatever - но только ен byte order mark :-)
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38117390
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам,

может там быть открытие любого файла, поддерживаемого Экселем ? или только IStorage который OLE Compound Document т.е. DOC/XLS/MSC и некоторый другие аналогичные форматы ?
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38117394
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам

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

ей-богу, утомил.
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38117399
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochне называй заголовок BOM'омо.

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

ну так и не читай
кто заставляет тебя лезть в ветку, в которой ты к тому же не разбираешься
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38117423
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUкто заставляет тебя лезть в ветку, в которой ты к тому же не разбираешься
Толсто троллишь, слабак.
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38117425
Jude
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUкто заставляет тебя лезть в ветку, в которой ты к тому же не разбираешься



У меня уже попкорн скоро закончится...

а как выглядит СЕКРЕТНЫЙ КОД Вашего производства?
пока только видно, что троллизм прокачан до 80го уровня...

развейте сомнения, Ваш вариант РАБОЧЕГО кода?

п.с. компилируемый.
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38117441
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanТолсто троллишь, слабак.

каждый судит по себе
я тебя не троллил

Judeразвейте сомнения, Ваш вариант РАБОЧЕГО кода?

сохраняешь во временный файл, загружаешь в Excel, обрабатываешь, закрываешь Excel, удаляешь файл
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38117471
Човайохоя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гаджимурадов РустамКак будет момент - постараюсь вариант для всех версий сделать,
а для 2003 включительно подходит любой из вышеприведённых. Будем ждать с нетерпением.

А по предыдущему коду вопрос. Нет ли вероятности, что так совпадет, что одновременно будет запускаться еще один экземпляр Экселя (из другой проги или пользователем) и перехватит этот файл раньше ? (теоретически)
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38117505
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дык вроде в предыдущем коде нет файла как такового - даные берутся из TMemoryStream
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38117520
xen2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SOFT FOR YOUсохраняешь во временный файл ... удаляешь файлили просто CreateFile(..., FILE_ATTRIBUTE_TEMPORARY + FILE_FLAG_DELETE_ON_CLOSE, 0)
по идее, такой файл МОЖЕТ вообще не писаться на диск (пребывая в системном кэше), но, говорят, по факту таки пишется
ну хотя бы удалять не надо
gunsmoker не даст соврать
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38117522
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xen2,

ЕМНИП такой файл не может открыть ни одна программа кроме твоей. Т.е. для передачи файла в другую програму - не поможет. Всё-таки Windows не Unix и временные файлы элегантно в ней не делаются
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38117594
xen2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arioch, верно, к сожалению
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38117675
Човайохоя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AriochДык вроде в предыдущем коде нет файла как такового - даные берутся из TMemoryStreamда, но ведь в стриме а точнее в blob-поле файл :\)
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38117720
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Човайохоя,

там содержимое файла ,без имени и т.д.

а что же там должно было быть по вашему ?
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38117763
Човайохоя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну да, в файле главное что? правильно, имя! без имени ты просто стрим
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38118580
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЧовайохояБудем ждать с нетерпением.Там есть какие-то нюансы (глубже не разбирался и причины пока не установил)
с наличием одновременно нескольких версий MSO. Правда, проявилось только
с Excel (c Word-ом почему-то сработало - удивительно).

ЧовайохояА по предыдущему коду вопрос. Нет ли вероятности, что так совпадет, что одновременно будет запускаться еще один экземпляр Экселя (из другой проги или пользователем) и перехватит этот файл раньше ? (теоретически)Не, там же файл не передаётся. Даже если будет запущено одновременно несколько разных версий - всё должно работать (не проверял). Правда, по умолчанию может подхватиться не та версия сервера, которую хотелось бы, но и это можно обойти перебором ROT и выбором нужного сервера. Впрочем, это всё детали реализации, да ещё мало встречаемые на практике, поэтому ими, думаю, вполне можно пренебречь.
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38119124
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамНе, там же файл не передаётся. Даже если будет запущено одновременно несколько разных версий - всё должно работать (не проверял). Правда, по умолчанию может подхватиться не та версия сервера, которую хотелось бы, но и это можно обойти перебором ROT и выбором нужного сервера. Впрочем, это всё детали реализации, да ещё мало встречаемые на практике, поэтому ими, думаю, вполне можно пренебречь.

Судя по коду, который ты привёл - загружается новый сервер относительно содержимого IStorage
в xls чёткий хедер, по которому можно определить Excel-файл. В xlsx же хедер zip

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

как успехи ?
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #38123805
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никак, ещё конь не валялся. Будут успехи (или неуспехи) - сообщу.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Открытие экселя из TMemoryStream
    #39010356
avlaxoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамНикак, ещё конь не валялся. Будут успехи (или неуспехи) - сообщу.
Коллеги, а какие мысли будут насчёт "продолжения" этой задачи - записать модифицированный документ обратно в TStream?
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #39010472
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О, какой старый топик подняли.

IIRC, с записью обратно никаких проблем не было, работало с
любым из приведённых способов (хотя зуб не дам, не помню).

Что касается работы с 2007/2010 и зоопарком версий - помню,
что в тот раз быстро и в лоб у меня с моникерами не вышло, а
в МСДН на сей счёт было слишком много и я забросил. Было бы
хорошо, если бы кто-то (Василиск, к примеру) глянул на досуге.
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #39011712
avlaxoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам,

Всё же хотелось бы поиметь живой, работающий пример кода "обратной записи", хотя бы для XLS/XLT. Что касается формата OpenOffice, то пример из этого топика не работает. И вообще, какой букварь посоветуете по этой теме, я всё же специалист в основном по БД, а не системным "штучкам" винды. Хотя жизнь вынудила столкнуться - хранить шаблоны офисных документов в базе.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Открытие экселя из TMemoryStream
    #39285744
Фотография Egoр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам,

up. интересно.
Таки можно ли открыть xls[xmb] из TStream в конкретно заданном ole-сервере,
когда этих серверов на машине запущено несколько, без использования временного файла?
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #39287783
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О, опять апнули. :)

Что значит "когда этих серверов на машине запущено несколько"?
Это редкая ситуация - может, имелось в виду "установлено"?
В любом случае, если я и смогу найти время проверить завтра или
на след. выходных через неделю - то только 2003+2007, больше у
меня на личных компах/ноутах ничего не установлено.

Я подробностей уже не помню, но IIRC старые форматы (<=2003) можно
открыть без проблем с помощью перебора ROT . Но если у кого-то есть
возможность - было бы неплохо проверить и сообщить.
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #39287903
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да здравствует воскресенье! :)

Быстренько проверил на пустом проекте. В общем, в двух словах:

1. Вышеприведённый код работает для xls при любых* установленных/запущенных версих MSO.
Любых* - потому что я проверил только на имеющихся 2003+2007, но привязки к версиям нет,
поэтому и с более новыми версиями проблем быть не должно.

2. Если запущено одновременно несколько экземпляров разных версий (как я уже сказал,
ситуация чрезвычайно редкая), то код отработает по простому принципу "кто первый встал,
того и тапки", т.е. принимающей стороной будет первый запущенный.

3. AFAIU, можно коннектититься и к конкретному экземпляру, но это надо разбираться с ROT,
с [не]регистрацией в которой у разных версий есть свои нюансы, коды юзер-сообщений и т.д.
Если будет время - гляну; если кто-то разберётся сам - сообщите, самому интересно.
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #39287909
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот года три назад разработал ActiveX, который обеспечивает работу в automation c "Structured Storage"
/поддержаны все interfaces/
Код: pascal
1.
2.
Structured Storage           https://msdn.microsoft.com/en-us/library/windows/desktop/aa380369(v=vs.85).aspx
Structured Storage Reference https://msdn.microsoft.com/en-us/library/windows/desktop/aa380365(v=vs.85).aspx

PS: Help ни какого ни прилагаю.
Можете легко с dll получить idl.
Остальная вся документация приведена на ссылках выше.
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #39288052
Фотография Egoр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамЕсли запущено одновременно несколько экземпляров разных версий (как я уже сказал, ситуация чрезвычайно редкая)Для многозадачной ОС, отнюдь, нет. Excel, сам по себе, параллелиться не умеет.
Поэтому для организации одновременной обработки екселевских табличек, особенно при наличии пользователя (что на современных персоналках тоже не редкость (: ),
приходится запускать несколько отдельных excel.application. Да бы не мешать ни друг-другу ни пользователю.
Кстати, почему вы так подчеркиваете именно "разных версий", мне не понятно.
Гаджимурадов Рустам..., то код отработает по простому принципу "кто первый встал, того и тапки", т.е. принимающей стороной будет первый запущенный.

3. AFAIU, можно коннектититься и к конкретному экземпляру, но это надо разбираться с ROT,
с [не]регистрацией в которой у разных версий есть свои нюансы, коды юзер-сообщений и т.д.
Если будет время - гляну; если кто-то разберётся сам - сообщите, самому интересно. В этом-то и есть основной вопрос.
С помощью LoadFromStream можно открыть Workbook из потока, но это будет первый попавшийся excel.application.
С помощью IDispatch для excel.application можно открыть Workbook в конкретном экземпляре Excel, но только из файла на диске (не из потока).
Как совместить эти две полезные особенности?
Кстати, ROT тут не поможет. Он лишь для регистрации работающих объектов, а не для работы с ними.
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #39288592
ГР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
EgoрДля многозадачной ОС, отнюдь, нет. Excel, сам по себе, параллелиться не умеет.
Поэтому для организации одновременной обработки екселевских табличек ...
приходится запускать несколько отдельных excel.application.Многозадачность и параллелизм Вы сюда зря приплели. :) Речь шла не только о наличии нескольких разных версий (а не экземпляров), что уже редкость, а одновременный запуск нескольких экземпляров разных версий и требование работы с конкретным[ой] из них. Что касается параллельной обработки - тут ничего не могу сказать, я таким не занимался, постановка несколько странная, но проблем с фоновыми процессами по идее быть не должно.

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

Как совместить эти две полезные особенности? Кстати, ROT тут не поможет. Он лишь для регистрации работающих объектов, а не для работы с ними.Запустить "чистый" экземпляр можно и без файла на диске. А про ROT я говорил
в контексте выбора нужной версии (не все и не всегда там регистрируются).

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

Ok. Давайте попробую по другому.
Если активный экземпляр Excel находится, например, в состоянии редактирования пользователем ячейки, то
при вызове OleCreateFromFile(GUID_NULL, PWideChar('C:\tmp\tmp.xlsx'), IOle... ) будет получена ошибка RPC_E_SERVERCALL_RETRYLATER = $8001010A.
Как этого избежать?
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #39292905
Фотография Egoр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ГР,

Эксперименты с ROT ничего особенного не дали.
Но в процессе наткнулся на еще один способ встроить ёксель в свою форму - SetParent.
Создал TPanel, создал excel.application, установил Tpanel парентом для аппликайшона. Чуть подшаманил с resize и paint. Все выглядит и функционирует как при Ole embedding, но явно не оно. Т.к. ексель не считает себя встроенным.
Кто знает, какие грабли могут всплыть при таком использовании excel?
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #39349497
Cheetos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу сильно не пинать - как заставить Excel в примере без ОлеКонтейнера [13792343] не появляться на экране?
Просто необходимо загрузить шаблон из БД, вывести в него необходимые данные и только потом отобразить на экране.
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #39349698
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cheetos> как заставить Excel ... не появляться на экране?

XLAPP.Visible := False, конечно.
ОлеКонтейнер и пр. тут не при чём.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #39349723
Фотография Egoр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамXLAPP.Visible := False, конечно.
ОлеКонтейнер и пр. тут не при чём.
У меня есть ощущение, что вы слабо разбираетесь в работе с Excel через IOleObject.
выражение XLAPP.Visible := False никак не повлияет на отображение листа Excel, открытого через IOleObject.
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #39349751
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Egoр,

авторвыражение XLAPP.Visible := False никак не повлияет на отображение листа Excel, открытого через IOleObject.

Можно подумать, что Cheetos что-то говорил про отображение листа :)
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #39349766
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Egoр> У меня есть ощущение, что вы слабо
Egoр> разбираетесь в работе с Excel через IOleObject.

Возможно, это смотря с кем сравнивать.
Получить ссылку на ранее запущенный
или вновь созданный экземпляр сервера
можно - соответственно, с ним можно
делать, всё, что требуется.

Egoр> выражение XLAPP.Visible := False никак не повлияет
Egoр> на отображение листа Excel, открытого через IOleObject.

Я плохо понимаю, что Вы пытались
сказать по поводу отображения листа
(скрывают обычно окно), но работать
оно совершенно точно будет - скорее
всего, "моргнёт", но опять же и с этим
можно попытаться бороться, пожалуй.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #39349767
Фотография Egoр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,

Я не говорил, что Cheetos говорил про листы. Но он ссылался на работу с Excel через IOleObject.
А микрософт в названиях объектов Excel, которые можно использовать с IOleObject, почему-то использует слово "лист".
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #39349774
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Egoр> А микрософт в названиях объектов Excel, которые можно
Egoр> использовать с IOleObject, почему-то использует слово "лист".

При чём тут микрософт? Я не очень понял, к чему Вы
придираетесь - если к тому, что обращение к свойству
или методу Visible будет не напрямую - ну так пусть
будет не XLAPP.Visible, а XLAPP.Application.Visible.

Делов-то...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #39349781
Фотография Egoр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустамили вновь созданный экземпляр сервера
можно - соответственно, с ним можно
делать, всё, что требуется.
Нельзя.
Отображение объектов ОЛЕ-сервера excel, встроенных в свое приложение,
и отображение собственно приложения excel отличаются кардинальным образом.
и свойство Visible от ExcelApplication никак не влияет на встроенные объекты.

Гаджимурадов РустамЯ плохо понимаю, что Вы пытались
сказать по поводу отображения листаТут я с вами согласен. Вы не понимаете различий между приложением excel и Ole-сервером excel.
Однако пытаетесь давать советы в этой области.
Которые из-за вашего незнания, к сожалению, вместо конкретных примеров не редко заканчиваются словами типа "можно попытаться бороться".
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #39349796
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Egoр> Отображение объектов ОЛЕ-сервера excel, встроенных в свое приложение,

Но в данном случае ничего подобного нет.
Поэтому весь Ваш пафосный спич мимо.

> Тут я с вами согласен. Вы не понимаете различий
> между приложением excel и Ole-сервером excel.

Повторюсь, Вы выдумали себе какую-то
ситуацию, применили мои слова к ней и
мужественно с ними боретесь.

Вас не затруднит, во-первых, вернуться
к обсуждаемой ситуации (или хотя бы
описать своё "видение" для начала), а
во-вторых, немного "снизить тон" ?

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

Эксперименты с ROT ничего особенного не дали.
Но в процессе наткнулся на еще один способ встроить ёксель в свою форму - SetParent.
Создал TPanel, создал excel.application, установил Tpanel парентом для аппликайшона. Чуть подшаманил с resize и paint. Все выглядит и функционирует как при Ole embedding, но явно не оно. Т.к. ексель не считает себя встроенным.
Кто знает, какие грабли могут всплыть при таком использовании excel?Ооо!!! Помню эти свои эксперименты... Почти 10 лет минуло...

Там грабли с меню экселя и тормозами и SetFocus между панелькой с экселем и главным окошком

ЕМНИП как-то кривовато обошёлся юзаньем двух способов:
- для отображения панелька с экселем
- для работы с файлом - какой-то компонент а ля TExcel/
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #39350660
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gator Пардон!
Конечно не TExcel! а какойто прямой доступ а ля TXLS
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #39350687
Товарищ младший сержант
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имхо, эта - самая трэшовая тема в дельфийской ветке. ГР создал интригу, смущающую целые поколения нубов!
...
Рейтинг: 0 / 0
Открытие экселя из TMemoryStream
    #39350718
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не наговаривай, никакой интриги я не создавал.
Более того, что просили - дал, с кодом, кто-то
даже пользуется, время от времени поднимают.

Для каких-то экзотических способов, типа того,
что просит Егор, решения нет (или пока нет).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Открытие экселя из TMemoryStream
    #39907570
Гаджимурадов Рустам,

добрый день.

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

Создаю экземпляр объекта OLE Automation через CreateOleObject('Excel.Application'). Получаю ссылку на интерфейс IDispatch.

Готовлю хранилище по вашему примеру.

Я так понимаю после этого надо загрузить хранилище FStorage в созданный объект Excel.Application? Но не понимаю как.
...
Рейтинг: 0 / 0
Открытие экселя из 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
108 сообщений из 108, показаны все 5 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Открытие экселя из TMemoryStream
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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