Связь с администрацией сайта:       

demo

Среди толпы я одинок

Delphi 7 Вывод данных в MS Excel

В каждой прикладной программе необходим функционал вывода отчетов и подобных документов в MS Excel. В своей статье я расскажу, как легко этого достичь безо всяких дополнительных компонентов, а на основе файлов-шаблонов. Мой метод намного упрощает работу программисту в написании кода и вывода информации.
 
 
Подумайте как проще в такой ситуации. Вам дали двадцать образцов отчетов в MSExcel, в которых разлиновка, в нужных местах стоят визы, рисунок предприятия, в конце концов. И попросили сделать вывод из программы именно в них как можно скорее. До конца жизни вы будете их проклинать, потому что они даже не представляют какой это адский труд с нуля формировать документ из самой программы.
А с моим методом всё будет гораздо быстрее и проще. Нет необходимости формировать документ с нуля. Достаточно скопировать данные вам документы в папку, прописать пару моих функций для объединения и обводки ячеек, а остальные методы работы с документом остаются прежними.
Не забываем, что MSExcelбольше подходит для вывода отчетов предприятия, а для договоров и остальных подобных документов больше подходит MS Word. На сайте вы так же можете найти данную статью «Delphi 7 Вывод данных в MS Word».

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

Откройте код формы для того, чтобы прописать пару функций и подключить некоторые модули.
В блоке «interface»->«uses» подключите модули ActiveX,ComObj.
В блоке «interface»->«type» опишите будущие процедуры –
    procedure merge;
    procedure border;
В блоке «interface»->«public»  добавляемпеременную - app:variant;
Теперь добавляем глобальные константы, после «public»:
Const
xlGeneral = 1;
xlBottom = -4107;
xlContext =  -5002;
xlDiagonalDown = 5;
xlNone = -4142;
xlDiagonalUp = 6;
xlEdgeLeft = 7;
xlContinuous = 1;
xlThin = 2;
xlAutomatic = -4105;
xlEdgeTop = 8;
xlEdgeBottom = 9;
xlEdgeRight = 10;
xlInsideVertical = 11;
xlInsideHorizontal = 12;
xlCenter=-4108;
xlLeft=-4131;
xlUnderlineStyleNone= -4142;
xls:array[1..256]of string=('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O',
'P','Q','R','S','T','U','V','W','X','Y','Z','AA','AB','AC','AD','AE','AF','AG','AH','AI',
'AJ','AK','AL','AM','AN','AO','AP','AQ','AR','AS','AT','AU','AV','AW','AX','AY','AZ',
'BA','BB','BC','BD','BE','BF','BG','BH','BI','BJ','BK','BL','BM','BN','BO','BP','BQ',
'BR','BS','BT','BU','BV','BW','BX','BY','BZ','CA','CB','CC','CD','CE','CF','CG','CH',
'CI','CJ','CK','CL','CM','CN','CO','CP','CQ','CR','CS','CT','CU','CV','CW','CX',
'CY','CZ','DA','DB','DC','DD','DE','DF','DG','DH','DI','DJ','DK','DL','DM','DN','DO','DP',
'DQ','DR','DS','DT','DU','DV','DW','DX','DY','DZ','EA','EB','EC','ED','EE','EF','EG','EH',
'EI','EJ','EK','EL','EM','EN','EO','EP','EQ','ER','ES','ET','EU','EV','EW','EX','EY','EZ',
'FA','FB','FC','FD','FE','FF','FG','FH','FI','FJ','FK','FL','FM','FN','FO','FP','FQ','FR','FS',
'FT','FU','FV','FW','FX','FY','FZ','GA','GB','GC','GD','GE','GF','GG','GH','GI','GJ','GK','GL',
'GM','GN','GO','GP','GQ','GR','GS','GT','GU','GV','GW','GX','GY','GZ','HA','HB','HC','HD','HE',
'HF','HG','HH','HI','HJ','HK','HL','HM','HN','HO','HP','HQ','HR','HS','HT','HU','HV','HW','HX',
'HY','HZ','IA','IB','IC','ID','IE','IF','IG','IH','II','IJ','IK','IL','IM','IN','IO','IP','IQ',
'IR','IS','IT','IU','IV');
 
В блоке «implementation»-> после «{$R *.dfm}» вставляем процедуры:

Заметим, что TF_MAin – это мой идентификатор формы. У вас этот параметр будет отличаться. Его можно посмотреть в «interface»->«type» первой строкой TF_MAin = class(TForm).

    
procedure TF_MAin.merge; ///Процедура объединения ячеек
   begin
        App.Selection.HorizontalAlignment := xlGeneral;
        App.Selection.VerticalAlignment := xlBottom  ;
        App.Selection.WrapText := False ;
        App.Selection.Orientation := 0;
        App.Selection.AddIndent := False;
        App.Selection.IndentLevel := 0;
        App.Selection.ShrinkToFit := False;
        App.Selection.ReadingOrder := xlContext;
        App.Selection.MergeCells := True;
   end;
    procedure TF_MAin.border; ///Процедураобводкиячеек
   begin
App.Selection.Borders[xlDiagonalDown].LineStyle := xlNone; App.Selection.Borders[xlDiagonalUp].LineStyle := xlNone; App.Selection.Borders[xlEdgeLeft].LineStyle := xlContinuous ; App.Selection.Borders[xlEdgeLeft].Weight := xlThin; App.Selection.Borders[xlEdgeLeft].ColorIndex := xlAutomatic; App.Selection.Borders[xlEdgeTop].LineStyle := xlContinuous; App.Selection.Borders[xlEdgeTop].Weight := xlThin; App.Selection.Borders[xlEdgeTop].ColorIndex := xlAutomatic; App.Selection.Borders[xlEdgeBottom].LineStyle := xlContinuous; App.Selection.Borders[xlEdgeBottom].Weight := xlThin; App.Selection.Borders[xlEdgeBottom].ColorIndex := xlAutomatic; App.Selection.Borders[xlEdgeRight].LineStyle := xlContinuous; App.Selection.Borders[xlEdgeRight].Weight := xlThin; App.Selection.Borders[xlEdgeRight].ColorIndex := xlAutomatic; App.Selection.Borders[xlInsideVertical].LineStyle := xlNone; end;
Теперь перейдем непосредственно к процедуре выполнения кода на нажатие кнопки в меню N13Click.

Сразу оговорюсь, что InputQuery необходим для выбора периода, F_DM.qry1- это таблица-запрос в которой будут данные, tmp – имя листа в MSExcel.

procedure TF_MAin.N13Click(Sender: TObject);var  summs:Currency; t:Integer; YearPer:Integer;begin
    if not InputQuery('Отчетныйгод','Введитегод',YearPer, 2012, 2020,1) then exit;
    if (YearPer<2012) or (YearPer>2020) then
    begin
      ShowMessage('Введите период от 2012 до 2020 года');
      exit;
    end;
 summs:=0;
  try
    app:=CreateOleObject('Excel.Application');
    app.workbooks.open(ExtractFilePath(Application.exename)+'list_report\Годовойотчет.xls', readonly:=true);
    app.visible:=false;   
    app.workbooks[1].worksheets['tmp'].cells[4,8]:=IntToStr(YearPer)+' год';
        F_DM.qry1.Active:=False;
        F_DM.qry1.sql.text:='SELECT SUM(заказы.общая_сумма) AS [mixer], Month([Окончание_заказа]) AS mdog FROM заказы where (Year([Окончание_заказа])='+IntToStr(YearPer)+' and [Оплата]=TRUE) GROUP BY Month([Окончание_заказа]);';
        F_DM.qry1.Active:=True;  F_DM.qry1.First;
        while not F_DM.qry1.Eof do
        begin
          t:=F_DM.qry1.Fieldbyname('mdog').AsInteger;          
app.workbooks[1].worksheets['tmp'].cells[10,t]:=F_DM.qry1.Fieldbyname('mixer').AsInteger;
app.workbooks[1].worksheets['tmp'].Range[xls[t]+inttostr(10)+':'+xls[t]+inttostr(10)].Select;merge;border; summs:=summs+F_DM.qry1.Fieldbyname('mixer').AsInteger; F_DM.qry1.Next; end; app.workbooks[1].worksheets['tmp'].cells[12,1]:='ИТОГО: '+currtostr(summs)+' руб.'; App.workbooks[1].worksheets['tmp'].Range[xls[1]+inttostr(12)+':'+xls[3]+inttostr(12)].Select;merge;border; finally app.visible:=true; app:=unassigned; F_DM.qry1.active:=False; end;end;
Разберем основные моменты кода, относящиеся к делу.
Мы можем просто занести статичные данные в ячейку, очень хорошо подходит для вывода информации о дате.
 app.workbooks[1].worksheets['tmp'].cells[4,8]:=IntToStr(YearPer)+' год';
В данном случае на листе с именем «tmp» в ячейку 4,8 мы добавили год отчета.
App.workbooks[1].worksheets['tmp'].Range[xls[1]+inttostr(12)+':'+xls[3]+ inttostr(12)].Select;merge;border;
Здесь мы объединяем с 1-ой по 3-ю ячейку на 12-ой строке и делаем сформированной ячейке обводку. То есть смысл написанного в том, что мы выделяем нужные клетки с помощью метода Select, потом используем наши процедуры merge и border, для объединения ячеек и обводки.
Остальной код, написанный мною для вывода отчета. Чтобы наглядно показать работу процедур merge и border. По сути это две самые важные строки. При их использовании вы в разы сократите свое время для вывода отчетов в ваш шаблон. Так же вы можете использовать стандартные методы работы с ячейками, такие как Formula, Font.Color, Font.Size, Color и многое другое.
 
 
Голосуй
(0 Голоса)
Оставьте комментарий

Поля, отмеченные звездочкой(*) обязательны для заполнения. HTML теги не приветствуются.

Вход на сайт