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

Код: 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
14.01.2013, 22:16
    #38110036
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Открытие экселя из TMemoryStream
Я через OLE-контейнер открывал.
Там были какие-то нюансы, с ходу
по памяти не расскажу, но решаемые.

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

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

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

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

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

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

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

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
15.01.2013, 01:04
    #38110165
Jonnik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Открытие экселя из TMemoryStream
Гаджимурадов Рустам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
15.01.2013, 03:13
    #38110203
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Открытие экселя из TMemoryStream
Jonnik> Нашел такую функцию

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

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

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

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
15.01.2013, 23:28
    #38111539
Jonnik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Открытие экселя из TMemoryStream
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
16.01.2013, 00:18
    #38111552
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Открытие экселя из TMemoryStream
насколько я понимаю, Excel не работает ни с чем, кроме файлов
даже из памяти загрузить не может
так что имхо без файлов не обойтись
...
Рейтинг: 0 / 0
16.01.2013, 00:56
    #38111563
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Открытие экселя из TMemoryStream
JonnikМногие пишут про эту ошибку, но нигде не нашел решения ее устранения.Значит, плохо искали. Читайте про IStorage, TStreamHeader etc.
Всех подробностей без подсматривания в справку я не упомню,
но вроде бы без IStorage можно обойтись одним оперированием
с TStreamHeader (это и есть тот самый заголовок).

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

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

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

P.S. LoadFromStream, OpenStream

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

Гаджимурадов Рустам,
IExcelApplication/IExcelWorksheets
...
Рейтинг: 0 / 0
16.01.2013, 19:25
    #38112874
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Открытие экселя из TMemoryStream
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
17.01.2013, 00:19
    #38113136
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Открытие экселя из TMemoryStream
Гаджимурадов Рустам

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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