SeeYou Logo   SeeYou Baneer
(Delphi + Excel) - макросы
 
На главную
 
Delphi + Excel
Введение
Константы
 
 
 
 
 
 

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

Наименование продукта
Приход
Расход
Дорожные велосипеды
121
11
Спортивные велосипеды
75
55
Всего:
196
66

Обратите внимание, что все строчки в таблице центрированы, а самая верхняя написана "жирным" шрифтом. В таблице так же содержатся ячейки в которых подсчитываются суммы по приходу и расходу. Ширина для колонок - 187, 94, 70 пиксель.

1. Установим ширину колонок:

//Выбираем каждую колонку целиком
Sheet.Columns['1:1'].ColumnWidth := 121;
Sheet.Columns['2:2'].ColumnWidth := 94;
Sheet.Columns['3:3'].ColumnWidth := 70;

2. Аналогичным образом можно было бы поступить для центрирования текста. Но представте себе, что в дальнейшем к данной таблице добавится что-то справа или снизу, а центрирование строк текста нежелательно. Поступим иначе. В Excel запишем макрос (выделим интересующие нас ячейки и зададим соответствующий стиль - "центрирование"). В результате получим примерно следующее:

Range("A1:C4").Select
With Selection
    HorizontalAlignment = xlCenter
    VerticalAlignment = xlBottom
    WrapText = False
    .Orientation = 0
    .AddIndent = False
    .ShrinkToFit = False
    .MergeCells = False
End With

В полученном макросе нас интересуют только первая и третья строка. Вот так они будут выглядеть в Delphi:

//Выбираем диапазон ячеек "A1:C4"
Sheet.Range['A1:C4'].Select;
//Задаем центрирование текста для выбранных ячеек
exl.Selection.HorizontalAlignment := xlCenter;

Обратите внимание на различие в синтаксисе. Во-первых, двойные кавычки заменились одинарными, во-вторых, круглые скобки - на квадратные, в-третьих знак "=" поменялся на ":=". Т.е. получающийся код должен удовлетворять требованиям синтаксиса того языка, на котором пишется программа.


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

//Выбираем диапазон ячеек "A1:С1"
Sheet.Range['A1:C1'].Select;
exl.Selection.Font.Bold := True;

4. Подставляем значения:

Sheet.Cells(1,1) := 'Наименование продукта';
Sheet.Cells(1,2) := 'Приход';
Sheet.Cells(1,3) := 'Расход';
Sheet.Cells(2,1) := 'Дорожные велосипеды';
Sheet.Cells(2,2) := 121;
Sheet.Cells(2,3) := 11;
Sheet.Cells(3,1) := 'Спортивные велосипеды';
Sheet.Cells(2,2) := 75;
Sheet.Cells(2,3) := 55;
Sheet.Cells(3,1) := 'Итого:';

5. Для итоговых сумм опять воспользуемся макросом. Запишем макрос для подсчета суммы по приходу товара (ячейка B4):

Range("B4").Select
ActiveCell.FormulaR1C1 = "=SUM(R[-2]C:R[-1]C)"

Обратим внимание еще на одну особенность. В строке для редактирования Excel формула выглядит иначе:
=СУММ(B2:B3) (для Русской версии Excel).

Итак, следующие строки программы могут выглядеть так:

Sheet.Range['B4'].Select;
exl.ActiveCell.FormulaR1C1 := '=SUM(R[-2]C:R[-1]C)';
Sheet.Range['C4'].Select;
exl.ActiveCell.FormulaR1C1 := '=SUM(R[-2]C:R[-1]C)';

Существует еще несколько вариантов подстановки формулы в ячейки. Например, скопировав формулу в одной ячейке, мы могли бы ее вставить в другую(гие). Можно применить и следующий код:

Sheet.Cells(3,2) := '=SUM(R[-2]C:R[-1]C)';
Sheet.Cells(3,3) := '=SUM(R[-2]C:R[-1]C)';

6. И в заключение обведем ячейки таблицы одной толстой рамкой. Посмотрим как будет выглядеть макрос:

Range("A1:C4").Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
  .LineStyle = xlContinuous
  .Weight = xlMedium
  .ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeTop)
  .LineStyle = xlContinuous
  .Weight = xlMedium
  .ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeBottom)
  .LineStyle = xlContinuous
  .Weight = xlMedium
  .ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeRight)
  .LineStyle = xlContinuous
  .Weight = xlMedium
  .ColorIndex = xlAutomatic
End With
Selection.Borders(xlInsideVertical).LineStyle = xlNone
Selection.Borders(xlInsideHorizontal).LineStyle = xlNone

Выберем интересующие нас строки и добавим следующий программный код:

Sheet.Range['A1:C4'].Select;
exl.Selection.Borders[хlEdgeLeft].LineStyle := xlContinuous;
exl.Selection.Borders[хlEdgeLeft].Weight := xlMedium;
exl.Selection.Borders[xlEdgeTop].LineStyle := xlContinuous;
exl.Selection.Borders[xlEdgeTop].Weight := xlMedium;
exl.Selection.Borders[xlEdgeBottom].LineStyle := xlContinuous;
exl.Selection.Borders[xlEdgeBottom].Weight := xlMedium;
exl.Selection.Borders[xlEdgeRight].LineStyle := xlContinuous;
exl.Selection.Borders[xlEdgeRight].Weight := xlMedium;

И опять обратим внимание, что синтаксис изменился.


А теперь попробуем объединить все программные строки в одной процедуре по созданию Excel-таблицы, приведенной выше:

procedure OutSampleTable;
const
  xlCenter = $FFFFFFF4;
  хlEdgeLeft = $00000007;
  xlEdgeTop = $00000008;
  xlEdgeBottom = $00000009;
  xlEdgeRight = $0000000A;
  xlMedium = $FFFFFFD6;
  xlContinuous = $00000001;
var
  exl: OleVariant;
  WorkBook, Sheet: Variant;
  fileName: String;
begin
  try
    fileName:= ExtractFilePath(Application.EXEName)
      +'SampleTable.xls';
    exl := CreateOleObject('Excel.Application');
    WorkBook := exl.Application.WorkBooks.Add;
    Sheet := WorkBook.WorkSheets[1];
    //Устанавливаем ширину колонок
    Sheet.Columns['1:1'].ColumnWidth := 121;
    Sheet.Columns['2:2'].ColumnWidth := 94;
    Sheet.Columns['3:3'].ColumnWidth := 70;
    //Форматирование таблицы
    Sheet.Range['A1:C4'].Select;
    exl.Selection.HorizontalAlignment := xlCenter;
    Sheet.Range['A1:C1'].Select;
    exl.Selection.Font.Bold := True;
   //Подстановка значений
    Sheet.Cells(1,1) := 'Наименование продукта';
    Sheet.Cells(1,2) := 'Приход';
    Sheet.Cells(1,3) := 'Расход';
    Sheet.Cells(2,1) := 'Дорожные велосипеды';
    Sheet.Cells(2,2) := 121;
    Sheet.Cells(2,3) := 11;
    Sheet.Cells(3,1) := 'Спортивные велосипеды';
    Sheet.Cells(2,2) := 75;
    Sheet.Cells(2,3) := 55;
    Sheet.Cells(3,1) := 'Итого:';
   //Подстановка формул
    Sheet.Cells(3,2) := '=SUM(R[-2]C:R[-1]C)';
    Sheet.Cells(3,3) := '=SUM(R[-2]C:R[-1]C)';
   //Обводка рамкой
    Sheet.Range['A1:C4'].Select;
    exl.Selection.Borders[хlEdgeLeft].LineStyle := 
        xlContinuous;
    exl.Selection.Borders[хlEdgeLeft].Weight := xlMedium;
    exl.Selection.Borders[xlEdgeTop].LineStyle := 
        xlContinuous;
    exl.Selection.Borders[xlEdgeTop].Weight := xlMedium;
    exl.Selection.Borders[xlEdgeBottom].LineStyle := 
        xlContinuous;
    exl.Selection.Borders[xlEdgeBottom].Weight := xlMedium;
    exl.Selection.Borders[xlEdgeRight].LineStyle := 
        xlContinuous;
    exl.Selection.Borders[xlEdgeRight].Weight := xlMedium;
    exl.Application.ActiveWorkBook.Saveas(fileName);
  finally
    exl.Application.Quit;
  end;
end;

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

 
Свои пожелания и замечания по содержимому страницы отсылайте по адресу: northteam@mailru.com
 
Hosted by uCoz