Шаг 149.
Автоматизация Microsoft Excel. Работа с ячейками.
Подготовка формы налоговой декларации

    На этом шаге мы рассмотрим пример использования некоторых из изученных свойств и методов.

    Применим наши знания на практике. Пользователям часто приходится заполнять различные формы в Excel. Обычно эта работа монотонна и однообразна, но необходима и очень важна. Одним из видов такой работы является заполнение форм налоговых деклараций, которых на большом предприятии очень много, а заполнять их приходится в огромном количестве за очень небольшой промежуток времени. Конечно, эту проблему можно решить, используя в формах Excel функции и небольшие макросы. Но здесь мы разберем, как можно использовать Delphi для решения этой задачи.

    Рассмотрим пример создания формы налоговой декларации НДС. Формы, которые требуется заполнять, можно взять в любой справочно-правовой системе, например "Консультант Плюс". Для заполнения формы достаточно использовать методы поиска и замены. Но сначала подготовим форму.

    Суть подготовки заключается в расстановке некоторых строковых констант в определенные ячейки. В процессе работы программы эти константы будут заменены реальными значениями из базы данных. На рисунке 1 представлен шаблон документа для формы налоговой декларации, подготовленный для заполнения из приложения Delphi.


Рис.1. Подготовленный шаблон документа для формы налоговой декларации

    Как вы обратили внимание, некоторые ячейки шаблона документа содержат строки типа #ИНСПЕКЦИЯ& и #ОРГАНИЗАЦИЯ& или строки типа И1&, И2&... И12& и К1&, К2& ... (рисунок 2).


Рис.2. Фрагмент шаблона документа для формы налоговой декларации

    Эти строки будут использоваться для поиска и подстановки на их место реальных данных при заполнении формы налоговой декларации. Рассмотрим представленный ниже программный код, предназначенный для формирования формы. Он основан на использовании метода Replace объекта Range, который производит замену текста в рабочей книге Excel. Метод Replace вызывает ошибку выполнения, если искомый фрагмент не найден. Мы использовали это обстоятельство в функции FindAndReplace, которая возвращает значение True или False в зависимости от результата поиска и замены. Обратите внимание на то, что объект Range указывает на область A1:EL230. Это позволяет осуществлять поиск не на всем листе, а на его части, что ускоряет работу.

function FindAndReplace(f,r:string):boolean;
var
  range:variant;
begin
  FindAndReplace:=False;
  if  f<>''   then
  begin
    try
      range:=E.Range['A1:EL230'].
         Replace(What:=f,Replacement:=r);
      FindAndReplace:=True;
    except
      FindAndReplace:=False;
    end;
  end;
end;


procedure TForm1.Button3Click(Sender: TObject);
//Заполнение шаблона
var
   i:integer;
begin
  FindAndReplace('#ИНСПЕКЦИЯ&',Edit1.Text);
  FindAndReplace('#ОРГАНИЗАЦИЯ&',Edit2.Text);
  for i:=1 to 12  do
    FindAndReplace('И'+inttostr(i) + '&',Edit4.Text[i]);
  for i:=1 to 9 do
    FindAndReplace('К'+inttostr(i) + '&', Edit5.Text[i]);
  for i:=1 to 15  do
    FindAndReplace('C'+inttostr(i)+ '&', (Edit3.Text+'        ')[i]);
  for i:=1 to 2 do
    FindAndReplace('Д'+inttostr(i)+'&',Edit6.Text[i]);
  for i:=1 to 2 do
    FindAndReplace('М'+inttostr(i)+'&',Edit6.Text[i+3]);
  for i:=1 to 4 do
    FindAndReplace('Г'+inttostr(i)+'&',Edit6.Text[i+6]);
end;

    Результат выполнения представленных процедур, заполняющих шаблон документа для формы налоговой декларации, показан на рисунке 3.


Рис.3. Заполненная форма налоговой декларации

    Вот полный текст приложения.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComObj, Spin;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    Edit1: TEdit;
    Label2: TLabel;
    Edit2: TEdit;
    Label3: TLabel;
    Edit3: TEdit;
    Label4: TLabel;
    Edit4: TEdit;
    Label5: TLabel;
    Edit5: TEdit;
    Label6: TLabel;
    Edit6: TEdit;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
var
  E:variant;

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
//Создание объекта Excel и отображение окна
begin
  E:=CreateOleObject('Excel.Application');
  E.Visible:=True;
end;

procedure TForm1.Button2Click(Sender: TObject);
//Создание документа по шаблону
begin
  E.WorkBooks.Add(ExtractFileDir(application.ExeName)+
         '\Декларация НДС.xlt');
end;

function FindAndReplace(f,r:string):boolean;
var
  range:variant;
begin
  FindAndReplace:=False;
  if  f<>''   then
  begin
    try
      range:=E.Range['A1:EL230'].
         Replace(What:=f,Replacement:=r);
      FindAndReplace:=True;
    except
      FindAndReplace:=False;
    end;
  end;
end;

procedure TForm1.Button3Click(Sender: TObject);
//Заполнение шаблона
var
   i:integer;
begin
  FindAndReplace('#ИНСПЕКЦИЯ&',Edit1.Text);
  FindAndReplace('#ОРГАНИЗАЦИЯ&',Edit2.Text);
  for i:=1 to 12  do
    FindAndReplace('И'+inttostr(i) + '&',Edit4.Text[i]);
  for i:=1 to 9 do
    FindAndReplace('К'+inttostr(i) + '&', Edit5.Text[i]);
  for i:=1 to 15  do
    FindAndReplace('C'+inttostr(i)+ '&', (Edit3.Text+'        ')[i]);
  for i:=1 to 2 do
    FindAndReplace('Д'+inttostr(i)+'&',Edit6.Text[i]);
  for i:=1 to 2 do
    FindAndReplace('М'+inttostr(i)+'&',Edit6.Text[i+3]);
  for i:=1 to 4 do
    FindAndReplace('Г'+inttostr(i)+'&',Edit6.Text[i+6]);
end;

end.
Текст этого приложения вместе с шаблоном можно взять здесь (2,9 Кб).

    Со следующего шага мы начнем рассматривать работу с объектами в книге Excel.




Предыдущий шаг Содержание Следующий шаг