Доступ к MS Excel из отчета

Больше
11 года 5 мес. назад #25645 от vlad-mal
vlad-mal создал эту тему: Доступ к MS Excel из отчета
По поводу доступа к документам MS Excel при создании отчетов.

Сразу скажу, что доступ возможен, однако, требует навыков программирования, причем сразу в двух областях: паскаль-скрипт и VBA for MS Excel, т.е., в двух словах не расскажешь.
Тем не менее, раз есть интерес, рассказываю с приложением минимального примера.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Пример. Создать отчет, который при запуске открывает нужный файл с MS Excel, считывает первые три ячейки из первых трех строк активного листа книги MS Excel. Считанные данные показываются в отчете.

Решение.
Вот здесь: narod.ru/disk/62588697001.2ce94ea9a37e86e18bfe7d6cea2d1e39/XLSRep.rar.html находится архив с двумя фалами: шаблон отчета и исходный MS Excel файл (из которого считываются данные).
Архив следует распаковать в удобное место, файл шаблона отчета (XLSWork.cfr) следует загрузит в Турбо архив, а файлик XLSExample.xls - это просто пример, из которого будут считаны данные.

Теперь, если запустить этот отчет на выполнение, он попросит у Вас указать имя файла, где лежит отчет и, если вы укажите, построит отчет из трех строк, считав их из файла MS Excel.

Дальше я расскажу, как это работает.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Описываемый метод - конечно, не единственный. К примеру, можно создать плагин, который читает даннные практически откуда угодно и заносит из в базу. Или стразу строит отчет особой формы. К примеру, с привлечением MS Access.

Ты попался:

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
11 года 5 мес. назад #25646 от vlad-mal
vlad-mal ответил в теме Доступ к MS Excel из отчета
Как это работает.

1. Для объекта отчета следует создаеть обработчик события OnManualBuild, в котором создатель отчета должен написать скрипт, описывающий необходимую логику.

2. При выполнении скрипта, у пользователя запрашивается имя файла MS Excel. Затем выполняется подключение к MS Excel, передача последнему имени файла и в цикле считывание первых трех строк с листа MS Excel.

3. Каждая считанная строка выводится в отчет.

Ты попался:

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
11 года 5 мес. назад #25647 от vlad-mal
vlad-mal ответил в теме Доступ к MS Excel из отчета
Вот текст срипта отчета, с коментариями:
// Глобальные переменные                                                  
var
// Имя файла отчета                                           
 fFN : string = 'Не задан';
// Номер строки в отчете                                                                                   
 fLN : integer;                            
    
  
// Ручное построение отчета                                                         
procedure Page1OnManualBuild(Sender: TfrxComponent);
var
// Объект диалога выбора файла                                                                  
 fOD : TOpenDialog;
// Объект приложения MS Excel                                                                                                        
 fExelApp : Variant;                                                      
// Объекты элементов приложения MS Excel: книга и лист                                                                                                                                                                         
 fVB, fVS :Variant;
begin
  
//  Создаем диалог для запроса имени файла MS Excel                                                                                                                
  fOD := TOpenDialog.Create(nil);
  try
    // Задем фильтр для выбора файлов                                                                                                                          
    fOD.Filter := 'Файлы MS Excel(*.xls)|*.xls|Все файлы(*.*)|*.*';
    if not fOD.Execute then begin
       ShowMessage('Файл не выбран');                                                                      
       Engine.StopReport;                             
    end;
    // Имя файла получено                                                     
    fFN := fOD.FileName;
  finally
    fOD.Free();                  
  end;

 // Показываем заголовок отчета                                                                         
  ReportTitle1.Visible := True;
  Engine.ShowBand(ReportTitle1);

 // Показываем шапку данных                                                                                                
  Engine.ShowBand(Header1);
    
// Получаем доступ к MS Excel                                                                                    
  fExelApp := '';
  fExelApp := CreateOleObject('Excel.Application');
  if VarToStr(fExelApp) = '' then begin
  // Подключиться к MS Excel не получилось                                                                                                           
    ShowMessage('Ошибка при подключении к MS Excel.');                                                                      
    Engine.StopReport;                             
  end else begin                                  
    // Открываем выбранный файл в MS Excel                                                                                             
    fVB := fExelApp.WorkBooks.Open(fFN);
    // Выбираем активный лист                                                                                                          
    fVS := fVB.ActiveSheet;
    // В цикле считываем три строки                                                                                                                                                                    
    for fLN := 1 to 3 do begin
      // Первая ячейка                                      
      memA.Text := fVS.Cells.Item[1, fLN].Text;
      // Вторая ячейка                                      
      memB.Text := fVS.Cells.Item[2, fLN].Text;
      // Третья                                                
      memC.Text := fVS.Cells.Item[3, fLN].Text;
      // Отображение очередной строки в отчете                                                                                                                               
      Engine.ShowBand(MasterData1);
    end;                                  
    // Завершение работы с MS Excel                                                                              
    fExelApp.Quit;
  end;            
    
  fExelApp := '';
end;

begin

end.

Ты попался:

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
11 года 5 мес. назад #25648 от vlad-mal
vlad-mal ответил в теме Доступ к MS Excel из отчета
Дополнительно, есть смысл посмотреть на сам бланк отчета. Видно, что добавлен бэнд заголовка данных Header1, в сами бэнды помещены несколко элементов для отображения текста.

Ты попался:

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
11 года 5 мес. назад #25649 от vlad-mal
vlad-mal ответил в теме Доступ к MS Excel из отчета
Комбинируя возможности скрипта и VBA for MS Excel, данные из MS Excel можно использовать, например, как справочные при построении отчетов на основе данных из базы Турбо архива.

Естественно, взаимодействием с MS Excel возможности сриптовой системы не ограничиваются. Однако, еще раз повторю, такая комплексная обработка сложных источников данных требует наличия специальных навыков и знаний.

Ты попался:

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
11 года 5 мес. назад #25650 от кичтемсобруТ
кичтемсобруТ ответил в теме Доступ к MS Excel из отчета

2. При выполнении скрипта, у пользователя запрашивается имя файла MS Excel. Затем выполняется подключение к MS Excel, передача последнему имени файла и в цикле считывание первых трех строк с листа MS Excel.

А можно пример скрипта, в котором в цикле выполняется не СЧИТЫВАНИЕ определенных ячеек Excel а ВНЕДРЕНИЕ в определенные ячейки?

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
11 года 5 мес. назад #25652 от vlad-mal
vlad-mal ответил в теме Доступ к MS Excel из отчета
Можно.

Пример: записать занчения в первые три ячейки первой строки:
  fVS.Cells.Item[1, 1].Value := 'Первое значение';
  fVS.Cells.Item[1, 2].Value := 'Второе значение';
  fVS.Cells.Item[1, 3].Value := 'Третье значение';

Затем, чтобы сохранить результаты работы в фале, перед вызовом
fExelApp.Quit;
- следует выполнить сохранение рабочей книги MS Excel:
fVB.Save();                                      

Ты попался:

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
11 года 5 мес. назад #25653 от кичтемсобруТ
кичтемсобруТ ответил в теме Доступ к MS Excel из отчета
Работает!
а каким кодом открыть документ exсel сразу после сохранения?
и запустить существующий в нем макрос?

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
11 года 5 мес. назад #25654 от vlad-mal
vlad-mal ответил в теме Доступ к MS Excel из отчета

...
а каким кодом открыть документ exсel сразу после сохранения?
...

Вопрос непонятен.

...
и запустить существующий в нем макрос?


Предположим, есть макрос именем "MyMacro".
fExelApp.Run('MyMacro');    
Однако, работать будет, если в настройках Вашей системы это разрешено. Могут поднять крик антивирусы, сам MS Excel и даже система безопасности Windows. для разрешения выполнения макросов вMS Excel обратитесь к системному администратору, в общем.

Ты попался:

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
11 года 5 мес. назад #25655 от vlad-mal
vlad-mal ответил в теме Доступ к MS Excel из отчета
Если нужно показать документ на экране в MS Excel, то просто не закрывайте его, т.е. не вызывайте
fExelApp.Quit; 

...а после того, как книга открыта, дайте команду показать MS Excel:
fExelApp.Visible := True;

Желательно, последний вызов делать после того, как вся работа в MS Excel уже проделана, так как визуализация замедляет работу MS Excel.

Ты попался:

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Модераторы: vlad-mal