Конференция "Начинающим" » Отчет в Excel по шаблону [D6]
 
  • Nurjanov (15.09.10 10:43) [0]
    Здравствуйте всем почитал
    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 © (16.09.10 12:59) [1]
    А какой вопрос?
  • 12 © (17.09.10 09:03) [2]

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

    ты, дядь Толь, реально что-то понял? :)
  • Anatoly Podgoretsky © (17.09.10 10:10) [3]
    Я понял что не задан вопрос.
 
Конференция "Начинающим" » Отчет в Excel по шаблону [D6]
Есть новые Нет новых   [134433   +22][b:0][p:0]