Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/34: Рейтинг темы: голосов - 34, средняя оценка - 4.68
1 / 1 / 0
Регистрация: 06.12.2011
Сообщений: 52

Загрузка Excel-файла из BLOB

02.06.2017, 13:20. Показов 6719. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Каким способом можно загрузить xls файл из blob поля на сервере oracle с загрузкой его в память и затем выгрузить на какой либо из компонентов для просмотра excel (например в ole container, если есть лучше варианты - предложите). Либо, если это возможно, напрямую загрузить из blob поля сразу в компонент для просмотра.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.06.2017, 13:20
Ответы с готовыми решениями:

Загрузка из Blob на сервере Excel файла и выгрузка его в память с целью вывода на клиенте для просмотра
Здравствуйте, есть следующая функция //Загрузка файла из таблицы BLOBS function GetBLOBSFile(id : Integer; FilePath : String = '')...

Загрузка файла в поле blob таблицы сервера Oracle
Необходимо создать приложение которое будет выбирать файл (предположительно (.xls)) с компьютера и отправлять его на сервер.По заданию это...

Загрузка из файла Excel
7.7 сетевая (7.70.025),Торговля и склад 7.70.011 Написал код для выгрузки в файл Excel-все нормально работает.Пишу обратный(мне нужно...

16
52 / 52 / 7
Регистрация: 23.08.2013
Сообщений: 123
02.06.2017, 14:53
Ну, например, через временный файл можно:
1) определяешься с местом хранения временного файла на диске и его именем;
2) создаёшь TFileStream с соответствующими параметрами;
3) для blob полей в компонентах доступа обычно есть методы для работы со TStream. С помощью такого метода загружаешь в свой временный файл содержимое blob поля;
4) открываешь файл через ole-автоматизацию, для чего конечно эксел должен быть установлен на компьютере.
0
1 / 1 / 0
Регистрация: 06.12.2011
Сообщений: 52
05.06.2017, 09:49  [ТС]
А можно напрямую из памяти грузить с помощью tmemorystream, меня больше этот вариант интересует без создания каких либо временных файлов на диске
0
52 / 52 / 7
Регистрация: 23.08.2013
Сообщений: 123
05.06.2017, 10:01
Использовать tmemorystream можно только совместно с какие-нибудь дельфишными компонентами работы с xls-файлами, при условии что они могу грузить данные из TStream, ole-автоматизация тут не подойдёт.
0
1 / 1 / 0
Регистрация: 06.12.2011
Сообщений: 52
05.06.2017, 10:21  [ТС]
Ну вот есть компонент TdxSpreadSheet, он заточен под xls и с диска у меня нормально открывает excel файлы, но мне не понятно как туда из памяти подтянуть данные. Создавал в соседнем разделе тему, по ходу только с вами придется вести диалог.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function GetBLOBSFile(id : Integer) : String;
 
var
dxsprdsht1: TdxSpreadSheet;//компонент TdxSpreadSheet для открытия excel таблиц
begin
 
   with TOraStoredProc.Create(nil) do
   try
    StoredProcName := 'tp.PAC_BODY_OPER.ViewerBlob';
    PrepareSQL;
    ParamByName('in_id').Value:=id;
    ExecProc;
 
        ms := TMemoryStream.Create;
        ParamByName('OUT_DATE').AsOraBlob.SaveToStream(ms); //Сохранение файла из БД
         
         dxsprdsht1.LoadFromStream(ms); //загрузка из потока
   finally
     free;
   end;
Собственно вопрос какие операторы должны быть после сохранения файла из бд чтобы компонент правильно все считал (сейчас пишет stream read error)
0
52 / 52 / 7
Регистрация: 23.08.2013
Сообщений: 123
05.06.2017, 10:36
Вы забыли обнулить позицию потока, отсюда и ошибка:
Delphi
1
2
3
4
5
6
7
8
ms := TMemoryStream.Create;
try
  ParamByName('OUT_DATE').AsOraBlob.SaveToStream(ms); //Сохранение файла из БД
  ms.Position := 0;
  dxsprdsht1.LoadFromStream(ms); //загрузка из потока
finally
  ms.free;
end;
1
1 / 1 / 0
Регистрация: 06.12.2011
Сообщений: 52
05.06.2017, 12:24  [ТС]
Ммм нет, что то не работает, при отладке посмотрел передается пустота в memory stream и в итоге access violation
0
52 / 52 / 7
Регистрация: 23.08.2013
Сообщений: 123
05.06.2017, 14:29
А вы уверенны, что у вас корректно пишутся данные из базы в мемстрим в этом месте:
Delphi
1
ParamByName('OUT_DATE').AsOraBlob.SaveToStream(ms); //Сохранение файла из БД
?
1
1 / 1 / 0
Регистрация: 06.12.2011
Сообщений: 52
06.06.2017, 07:18  [ТС]
Да в том то и дело, что ничего не передается, может быть сначала как то можно перенести с помощью blobstream, а потом уже оттуда извлекать данные?
0
52 / 52 / 7
Регистрация: 23.08.2013
Сообщений: 123
06.06.2017, 07:32
А вы же говорили, что у вас получилось с временным файлом, может код приведёте? Просто сейчас проблема явно не с мемстрим.
0
1 / 1 / 0
Регистрация: 06.12.2011
Сообщений: 52
06.06.2017, 08:27  [ТС]
Работает следующий метод только когда известен путь к файлу на диске
Delphi
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
procedure TForm2.N1Click(Sender: TObject);
var
id: Integer;
FilePath: String ;
F : file;
FN : string;
begin
        //Чтение данных из файла в динамический массив байтов.
        id:= 155046;
        FilePath:='D:\plstemp2.xls';
        FN := FilePath;
        AssignFile(F, Fn);
        Reset(F, 1); //Размер буфера записи = 1 байт
 
        Len := FileSize(F);
        SetLength(Arr, Len);
        BlockRead(F, Pointer(Arr)^, Len);
 
        CloseFile(F);
 
        //Копирование данных из массива в поток.
         ms := TMemoryStream.Create;
         ms.SetSize(Len);
         ms.Write(Pointer(Arr)^, Len);
         ms.Position := 0;
 
 
        dxsprdsht1.LoadFromStream(ms);
Проблема в этом методе как получить такой же путь FilePath к файлу blob
0
52 / 52 / 7
Регистрация: 23.08.2013
Сообщений: 123
06.06.2017, 10:23
Так этот же код к базе никакого отношения не имеет. Я думал у вас получилось файл считать из базы и сохранить в файл. Тогда проблема где-то в работе с базой, а не с файлами. Мне не очень понятно как вы данные читаете. Вот вижу, вы обращаетесь к хранимой процедуре... Попробуйте сначала более простыми способами данные получить, через обычный запрос.
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,666
Записей в блоге: 21
06.06.2017, 10:48
бррр
все что тут написано это
Delphi
1
2
ms:=TFileStream.Create('D:\plstemp2.xls',fmOpenRead);
dxsprdsht1.LoadFromStream(ms);
1
1 / 1 / 0
Регистрация: 06.12.2011
Сообщений: 52
07.06.2017, 09:55  [ТС]
Сделал так
Delphi
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
procedure TForm1.btn1Click(Sender: TObject);
var
ms: TMemoryStream;
id :integer;
Filepath : string;
begin
   with TOraStoredProc.Create(nil) do
   try
    Options.AutoClose := true;
    StoredProcName := 'saprtp.PAC_BODY_OPER.ViewerBlob';
    PrepareSQL;
    ParamByName('in_id').Value:=155046;
    ExecProc;
            FilePath := 'D:\12345.xls';
            ms:= TMemoryStream.Create;
            ms.Position := 0;
            ParamByName('OUT_DATE').AsOraBlob.SaveToStream(ms); //Сохранение файла из БД
            ms.SaveToFile(FilePath);
            ms.Position := 0;
            dxsprdsht1.LoadFromStream(ms); //загрузка из потока
   finally
     ms.free;
     Free;
   end;
end;
Данные грузятся в файл и в компонент корректно

Добавлено через 21 час 51 минуту
А можно еще тем же методом из памяти забрать данные только в ole container, т.к. выяснилось что dxspreadsheet плохо работает с xls документами, содержащими картинки?
0
52 / 52 / 7
Регистрация: 23.08.2013
Сообщений: 123
07.06.2017, 16:08
У TOleContainer тоже есть методы для работы с TStream, поэтому вроде как можно.

Добавлено через 13 минут
Цитата Сообщение от aknyazev Посмотреть сообщение
вроде как можно
Точнее не скажу, т.к. сам так ни делал никогда.

Добавлено через 16 минут
Вот книга: http://bookfi.net/book/482423 (Delphi и технология COM, Н. Елманова, С. Трепалин, А. Тенцер)
Глава 5.
2
1 / 1 / 0
Регистрация: 06.12.2011
Сообщений: 52
08.06.2017, 10:08  [ТС]
В этой книге написано как вывести только на просмотр без открытия екселя, мне было бы удобней через ексель отрывать, но тогда появляется проблема со скрытием ribbon панели. Нашел вот такой пример:
Delphi
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
unit Unit4;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OleCtnrs, ComObj, StdCtrls, ComCtrls;
 
type
  TForm4 = class(TForm)
    OleContainer1: TOleContainer;
    procedure FormShow(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form4: TForm4;
 
  wdApp, wdDocs, wdDoc : Variant;
implementation
 
{$R *.dfm}
 
procedure TForm4.FormShow(Sender: TObject);
var
  ev : OleVariant;
   i : Integer;
begin
  OleContainer1.CreateObject('Word.Application',False);
  OleContainer1.CreateObjectFromFile(
  ExtractFilePath(Application.ExeName)+'Помощь.doc',false);
 
  OleContainer1.DoVerb(ovOpen);
 
  // Проходим по всем тулбарам связанного с контейнером приложения
  // и устанавливаем всем невидимость, чтоб не мешали ...
  for i:=1 to OleContainer1.OleObject.CommandBars.Count do
  if OleContainer1.OleObject.CommandBars.Item[i].Visible then
  OleContainer1.OleObject.CommandBars.Item[i].Visible:=False;
 
  ev := 2;
  OleContainer1.OleObject.Protect(ev);
end;
 
procedure TForm4.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  OleContainer1.DestroyObject;
end;
 
end.
Но у меня после ввода OleContainer1.OleObject не видит commandBars и соответсвенно на эту строчку начинает ругаться при компиляции.
0
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
08.06.2017, 12:16
Попробовал через ADO. Все нормально читается напрямую, без промежуточных файлов.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var
  Xls: TMemoryStream;
begin
ADOTable1.Append;
TBlobField(ADOTable1.FieldByName('Xls')).LoadFromFile('H:\test.xls');
ADOTable1.Post;
ADOStoredProc1.Parameters.ParamByName('XlsID').Value := 3;
ADOStoredProc1.Open;
Xls := TMemoryStream.Create;
TBlobField(ADOStoredProc1.FieldByName('Xls')).SaveToStream(Xls);
Xls.Position := 0;
dxSpreadSheet1.LoadFromStream(Xls);
Xls.Free;
end;
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.06.2017, 12:16
Помогаю со студенческими работами здесь

Загрузка Excel файла
Вот страница загрузки xls файла. if(isset($_POST)){ $lunch = new PanelLh; header('Content-Type:...

Загрузка файла Excel в DataGridView
Всем привет! Столкнулся с очень интересной задачей, у меня не получается загрузить файл good.xls в DGV, получилось лишь с открытым...

Загрузка новосозданного Excel файла
Возможно, не ясно сформулировал название темы но суть такова: имеется две формы: первая форма отображает список предприятий. ...

Загрузка данных из файла Excel в DataGridView
Здравствуйте! Есть проблема. Программа по нажатию кнопки на форме, должна считать файл Excel и поместить данные в датагрид на форме....

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru