Здравствуйте всем почитал
Excel ЧАВО III
http://delphikingdom.com/asp/viewitem.asp?catalogid=1274#25Как скопировать форматы и формулы из строки в нижележащую область (AutoFill)?
Там дается пример заполнение 5 строк..
[Code]
// КОНЕЦ ШАБЛОНА
// Начало работы с шаблоном
// Добавим 4 строки для занесения данных (итого уже 5 строк для данных)
// Неудобство при использовании Cells в Range - обязательное
// дублирование Cells во втором параметре
ASheet.Range[
ASheet.Cells.Item[ASheet.Range['DataRange', EmptyParam].Row + 1, 1],
ASheet.Cells.Item[ASheet.Range['DataRange', EmptyParam].Row + 4, 1]
].EntireRow.Insert(xlShiftDown, EmptyParam);
[/Code]
А если заполнять вместо пять одну строку тогда как решить?
Сделал так но
[Code]
procedure TfrmCMPMain.Button9Click(Sender: TObject);
var
i,r :integer;
ASheet: _WorkSheet;
ArrData: Variant;
begin
XL := TExcelApplication.Create(nil);
try
XL.ConnectKind := ckNewInstance;
XL.Connect;
XL.Workbooks.add(EmptyParam,lcid);
ASheet:=XL.ActiveWorkbook.ActiveSheet as _Worksheet;
// НАЧАЛО ШАБЛОНА
// шапка
ASheet.Range['A1', EmptyParam].Formula := 'Шапка';
// таблица
ASheet.Range['A2', EmptyParam].Formula := '#';
ASheet.Range['B2', EmptyParam].Formula := 'Имя';
ASheet.Range['C2', EmptyParam].Formula := 'Кол-во';
ASheet.Range['D2', EmptyParam].Formula := 'Цена';
ASheet.Range['E2', EmptyParam].Formula := 'Сумма';
ASheet.Range['A2:E2', EmptyParam].BorderAround(
xlContinuous,
xlHairline,
xlColorIndexAutomatic,
EmptyParam
);
// сделаем вид, что у нас уже готова строка шаблона данных
// и зададим форматы и формулы
ASheet.Range['A3', EmptyParam].Font.Bold := True;
ASheet.Range['C3', EmptyParam].Formula := '=10';
ASheet.Range['D3', EmptyParam].Formula := '=100';
// в случаях формул удобно использовать стил R1C1
ASheet.Range['E3', EmptyParam].FormulaR1C1 := '=sum(RC[-1]*RC[-2],2)';
ASheet.Range['E3', EmptyParam].NumberFormat := '#,##0.00';
// пустая строка для того, чтоб сумма считалась автоматом
ASheet.Range['A4', EmptyParam].EntireRow.Hidden := True;
// добавим итоговую сумму (с пустой строкой)
ASheet.Range['E5', EmptyParam].FormulaR1C1 := '=sum(R[-1]C:R[-2]C)';
ASheet.Range['E5', EmptyParam].Font.Bold := True;
ASheet.Range['A5:E5', EmptyParam].Borders[xlEdgeTop].LineStyle :=
xlContinuous;
ASheet.Range['A5:E5', EmptyParam].Borders[xlEdgeTop].Weight := xlMedium;
// области данных присвоим имя
(ASheet.Parent as ExcelWorkbook).Names.Add(
'DataRange', // Name,
ASheet.Range['A3:E3', EmptyParam], // RefersTo: OleVariant;
True, // Visible: OleVariant;
EmptyParam, // MacroType: OleVariant;
EmptyParam, // ShortcutKey: OleVariant;
EmptyParam, // Category: OleVariant;
EmptyParam, // NameLocal: OleVariant;
EmptyParam, // RefersToLocal: OleVariant;
EmptyParam, // CategoryLocal: OleVariant;
EmptyParam, // RefersToR1C1: OleVariant;
EmptyParam // RefersToR1C1Local: OleVariant
);
ASheet.Range['DataRange', EmptyParam].Borders[xlEdgeBottom].LineStyle :=
xlContinuous;
ASheet.Range['DataRange', EmptyParam].Borders[xlEdgeBottom].Weight := xlHairline;
// КОНЕЦ ШАБЛОНА
// Начало работы с шаблоном
// Добавим 4 строки для занесения данных (итого уже 5 строк для данных)
// Неудобство при использовании Cells в Range - обязательное
// дублирование Cells во втором параметре
ASheet.Range[
ASheet.Cells.Item[ASheet.Range['DataRange', EmptyParam].Row+1, 1],
ASheet.Cells.Item[ASheet.Range['DataRange', EmptyParam].Row+0, 1]
].EntireRow.Insert(xlShiftDown);
// теперь заполним область форматированием, захватив (ОБЯЗАТЕЛЬНО)
// и область-шаблон "DataRange"
ASheet.Range['DataRange', EmptyParam].AutoFill(
ASheet.Range[
// захватим область источника
ASheet.Cells.Item[ASheet.Range['DataRange', EmptyParam].Row, 1],
ASheet.Cells.Item[ASheet.Range['DataRange', EmptyParam].Row+1,
ASheet.Range['DataRange', EmptyParam].Columns.Count]
],
xlFillCopy
);
// заносим данные из массива (номер и имя) - 5 строк, 2 столбца
arrData := VarArrayCreate([1, 1, 1, 2], varVariant);
for i := 1 to 1 do begin
arrData[i, 1] := i;
arrData[i, 2] := Format('Имя %d', [i]);
end;
ASheet.Range[
ASheet.Cells.Item[ASheet.Range['DataRange', EmptyParam].Row, 1],
ASheet.Cells.Item[ASheet.Range['DataRange', EmptyParam].Row+1,1]
].Formula := arrData;
XL.Visible[lcid] := True;
finally
XL.UserControl := True;
XL.Interactive[lcid] := True;
XL.Disconnect;
FreeAndNil(XL);
end;
end;
[/Code]
Резултать две пустой строки выходит
Шапка
# Имя Кол-во Цена Сумма
1 10 100 1,002.00
2,004.00
Я эту код переделал для датасета..
У меня датасете разные количество записи..
если два то нормально а если в датасете один запись то в отчете выходить как резултать две пустих строк
Заранее благодаре