1 / 1 / 0
Регистрация: 06.12.2011
Сообщений: 52
1

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

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

Здравствуйте. Каким способом можно загрузить xls файл из blob поля на сервере oracle с загрузкой его в память и затем выгрузить на какой либо из компонентов для просмотра excel (например в ole container, если есть лучше варианты - предложите). Либо, если это возможно, напрямую загрузить из blob поля сразу в компонент для просмотра.
0

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

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.06.2017, 13:20
Ответы с готовыми решениями:

Загрузка из Blob на сервере Excel файла и выгрузка его в память с целью вывода на клиенте для просмотра
Здравствуйте, есть следующая функция //Загрузка файла из таблицы BLOBS function...

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

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

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

16
49 / 49 / 7
Регистрация: 23.08.2013
Сообщений: 121
02.06.2017, 14:53 2
Ну, например, через временный файл можно:
1) определяешься с местом хранения временного файла на диске и его именем;
2) создаёшь TFileStream с соответствующими параметрами;
3) для blob полей в компонентах доступа обычно есть методы для работы со TStream. С помощью такого метода загружаешь в свой временный файл содержимое blob поля;
4) открываешь файл через ole-автоматизацию, для чего конечно эксел должен быть установлен на компьютере.
0
1 / 1 / 0
Регистрация: 06.12.2011
Сообщений: 52
05.06.2017, 09:49  [ТС] 3
А можно напрямую из памяти грузить с помощью tmemorystream, меня больше этот вариант интересует без создания каких либо временных файлов на диске
0
49 / 49 / 7
Регистрация: 23.08.2013
Сообщений: 121
05.06.2017, 10:01 4
Использовать tmemorystream можно только совместно с какие-нибудь дельфишными компонентами работы с xls-файлами, при условии что они могу грузить данные из TStream, ole-автоматизация тут не подойдёт.
0
1 / 1 / 0
Регистрация: 06.12.2011
Сообщений: 52
05.06.2017, 10:21  [ТС] 5
Ну вот есть компонент 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
49 / 49 / 7
Регистрация: 23.08.2013
Сообщений: 121
05.06.2017, 10:36 6
Вы забыли обнулить позицию потока, отсюда и ошибка:
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  [ТС] 7
Ммм нет, что то не работает, при отладке посмотрел передается пустота в memory stream и в итоге access violation
0
49 / 49 / 7
Регистрация: 23.08.2013
Сообщений: 121
05.06.2017, 14:29 8
А вы уверенны, что у вас корректно пишутся данные из базы в мемстрим в этом месте:
Delphi
1
ParamByName('OUT_DATE').AsOraBlob.SaveToStream(ms); //Сохранение файла из БД
?
1
1 / 1 / 0
Регистрация: 06.12.2011
Сообщений: 52
06.06.2017, 07:18  [ТС] 9
Да в том то и дело, что ничего не передается, может быть сначала как то можно перенести с помощью blobstream, а потом уже оттуда извлекать данные?
0
49 / 49 / 7
Регистрация: 23.08.2013
Сообщений: 121
06.06.2017, 07:32 10
А вы же говорили, что у вас получилось с временным файлом, может код приведёте? Просто сейчас проблема явно не с мемстрим.
0
1 / 1 / 0
Регистрация: 06.12.2011
Сообщений: 52
06.06.2017, 08:27  [ТС] 11
Работает следующий метод только когда известен путь к файлу на диске
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
49 / 49 / 7
Регистрация: 23.08.2013
Сообщений: 121
06.06.2017, 10:23 12
Так этот же код к базе никакого отношения не имеет. Я думал у вас получилось файл считать из базы и сохранить в файл. Тогда проблема где-то в работе с базой, а не с файлами. Мне не очень понятно как вы данные читаете. Вот вижу, вы обращаетесь к хранимой процедуре... Попробуйте сначала более простыми способами данные получить, через обычный запрос.
0
5012 / 3909 / 1292
Регистрация: 14.04.2014
Сообщений: 17,996
Записей в блоге: 18
06.06.2017, 10:48 13
бррр
все что тут написано это
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  [ТС] 14
Сделал так
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
49 / 49 / 7
Регистрация: 23.08.2013
Сообщений: 121
07.06.2017, 16:08 15
У 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  [ТС] 16
В этой книге написано как вывести только на просмотр без открытия екселя, мне было бы удобней через ексель отрывать, но тогда появляется проблема со скрытием 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
2281 / 1395 / 481
Регистрация: 29.05.2013
Сообщений: 6,114
08.06.2017, 12:16 17
Попробовал через 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.06.2017, 12:16

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.