Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Отчет в Excel по шаблону [D6]


Nurjanov ©   (2010-09-15 10:43:00) 

Здравствуйте всем почитал
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

Я эту код переделал для датасета..
У меня датасете разные количество записи..
если два то нормально а если в датасете один запись то в отчете выходить как резултать две пустих строк
Заранее благодаре


Anatoly Podgoretsky   (2010-09-17 10:10:00) [1]

Я понял что не задан вопрос.


12   (2010-09-17 09:03:00) [2]


> Anatoly Podgoretsky ©   (16.09.10 12:59) [1]

ты, дядь Толь, реально что-то понял? :)


Anatoly Podgoretsky   (2010-09-16 12:59:00) [3]

А какой вопрос?


Наверх

Титульная страница Поиск, карта сайта Написать письмо