Для того, чтобы получить отчет в формате 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.
Наверх
|