powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Открытие экселя из TMemoryStream
25 сообщений из 108, страница 2 из 5
Открытие экселя из 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
25 сообщений из 108, страница 2 из 5
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Открытие экселя из TMemoryStream
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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