Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   sumar columna en excel (https://www.clubdelphi.com/foros/showthread.php?t=79509)

edgar_prospero 12-07-2012 20:18:37

sumar columna en excel
 
que hay tengo un problemilla, haber quien mepuede echar la mano estoy exportando una informacion a excel pero no se como hacerle para que me sume una columna ya que no siempre es el mismo rango varia dependiendo la consulta acontinuacion pongo mi codigo para ver donde puedo agregar para que me sume una columna

Código Delphi [-]
procedure TForm5.BitBtn6Click(Sender: TObject);
var Excel : Variant;
var Libro : Variant;
var i:integer;
var j:integer;
begin

Excel := CreateOleObject ('Excel.Application');


Excel.Visible := True;

Excel.WorkBooks.Add (-4167);

Excel.WorkBooks[1].WorkSheets[1].Name := 'Reporte';

Libro := Excel.WorkBooks[1].WorkSheets['Reporte'];
excel.worksheets[1].Range['B1','B1'].ColumnWidth :=45;
excel.worksheets[1].Range['C1','C1'].ColumnWidth :=13;
excel.worksheets[1].Range['D1','E1'].ColumnWidth :=15;
excel.worksheets[1].Range['F1','F1'].ColumnWidth :=16;
excel.worksheets[1].Range['G1','H1'].ColumnWidth :=9;
excel.worksheets[1].Range['I1','I1'].ColumnWidth :=14;
Libro.Cells.Item[1,1].Font.Bold:=True;
Libro.Cells.Item[1,1].font.size:=16;

Libro.Cells.Item[2,1]:= ' Inventario en proceso del departamento: '+dep2.Text + '  A  ' +dep3.Text;
Libro.Cells.Item[2,1].Font.Bold:=True;

Libro.Cells.Item[3,1].Font.Bold:=True;
Libro.Cells.Item[3,2].Font.Bold:=True;
Libro.Cells.Item[3,3].Font.Bold:=True;
Libro.Cells.Item[3,4].Font.Bold:=True;
Libro.Cells.Item[3,5].Font.Bold:=True;
Libro.Cells.Item[3,6].Font.Bold:=True;
Libro.Cells.Item[3,7].Font.Bold:=True;
Libro.Cells.Item[3,8].Font.Bold:=True;
Libro.Cells.Item[3,9].Font.Bold:=True;



Query.Open;
i:=2;

query.SQL.Clear;
query.SQL.Add('SELECT * FROM arm0062 WHERE departamento>=:inidep and departamento<=:findep and tipo_material>=:inimat and tipo_material<=:finmat order by  codigo asc ');

query.ParamByName('inidep').Asstring:=inidep.Text;
query.ParamByName('findep').Asstring:=findep.Text;
query.ParamByName('inimat').Asstring:=inimat.Text;
query.ParamByName('finmat').Asstring:=finmat.Text;
query.Open;

while not Query.EOF do
begin

Libro.Cells [1,1] := 'CLASIC AND BASIC SA DE CV';
Libro.Cells [3,1] := 'codigo';
Libro.Cells [3,2] := 'Nombre';
Libro.Cells [3,3] := 'departamento';
Libro.Cells [3,4] := 'tipo de material';
Libro.Cells [3,5] := 'cantidad piezas';
Libro.Cells [3,6] := 'cantidad material';
Libro.Cells [3,7] := 'unidad';
Libro.Cells [3,8] := 'costo';
Libro.Cells [3,9] := 'total';


i :=i+1;
Libro.Cells [i,1] := Query.FieldByName ('codigo').AsString;
Libro.Cells [i,2] := Query.FieldByName ('nombre').AsString;
Libro.Cells [i,3] := Query.FieldByName ('departamento').AsString;
Libro.Cells [i,4] := Query.FieldByName ('tipo_material').AsString;
Libro.Cells [i,5] := Query.FieldByName ('cant_piezas').AsString;
Libro.Cells [i,6] := Query.FieldByName ('cant_material').AsString;
Libro.Cells [i,7] := Query.FieldByName ('unidad').AsString;
Libro.Cells [i,8] := Query.FieldByName ('costo').AsString;
Libro.Cells [i,9] := Query.FieldByName ('total').AsString;

Query.Next;

end;

Query.Close;
end;

oscarac 12-07-2012 21:18:04

Yo hice algo similar a lo que tu mencionas de la siguiente manera

Código Delphi [-]
 
Procedure TfrmBalanceGasto.ExportarToExcel(fName: string);
const
  xlWBATworksheet = -4167;
var
  Excel, WorkBook, WorkSheet: OleVariant;
  I, J, _FilaIni, _quiebre, _FilaTitulos: Integer;
  _Campo :String;
  _f, _c :Integer;
  _posiciones :array [1..10] of Integer;
  const _letras :array [1..13] of string = ('C','D','E','F','G','H','I','J','K','L','M','N','O');
begin
  _FilaTitulos := 6;
  _Campo := '';
  Excel := CreateOleObject('Excel.Application');
  Excel.DisplayAlerts := False;
  WorkBook := Excel.Workbooks.Add(xlWBATWorksheet);
  WorkSheet := WorkBook.WorkSheets[1];
  WorkSheet.Name := 'Hoja1';
  WorkSheet.Cells[1,1].font.Bold := True;
  WorkSheet.Cells[1,1] := dmGlobal.g_NombreEmpresa;
  WorkSheet.Cells[2,1] := 'R.U.C. : ' + dmGlobal.g_RUCEmpresa;
  WorkSheet.Cells[3,1].font.Bold := True;
  WorkSheet.Cells[3,1] := 'Consolidado Anual de Gastos';
  WorkSheet.Cells[4,1] := iif (rgRango.ItemIndex = 0, 'Mensual del mes de ','Acumulado al mes de ') +  NombreMes(StrToInt(dmGlobal.g_Mes));
  WorkSheet.Cells[5,1] := 'Cuenta 9' + edtDigito.Text;
  worksheet.range['A3:O5'].HorizontalAlignment := xlHAlignCenterAcrossSelection;
  WorkSheet.cells[_FilaTitulos,1] := 'Cuenta';
  WorkSheet.cells[_FilaTitulos,3] := 'Enero';
  WorkSheet.cells[_FilaTitulos,4] := 'Febrero';
  WorkSheet.cells[_FilaTitulos,5] := 'Marzo';
  WorkSheet.cells[_FilaTitulos,6] := 'Abril';
  WorkSheet.cells[_FilaTitulos,7] := 'Mayo';
  WorkSheet.cells[_FilaTitulos,8] := 'Junio';
  WorkSheet.cells[_FilaTitulos,9] := 'Julio';
  WorkSheet.cells[_FilaTitulos,10] := 'Agosto';
  WorkSheet.cells[_FilaTitulos,11] := 'Setiembre';
  WorkSheet.cells[_FilaTitulos,12] := 'Octubre';
  WorkSheet.cells[_FilaTitulos,13] := 'Noviembre';
  WorkSheet.cells[_FilaTitulos,14] := 'Diciembre';
  WorkSheet.cells[_FilaTitulos,15] := 'Total';
  worksheet.range['A5:O5'].HorizontalAlignment := xlHAlignCenter;
  i:= _FilaTitulos + 1;
  _FilaIni := i;
  _quiebre := 0;
  DBGrid1.DataSource.DataSet.First;
  _Campo := Izquierda(DBGrid1.Fields[0].AsString, StrToInt(edtDigito.Text));
  while not DBGrid1.DataSource.DataSet.Eof do
  begin
    for J := 0 to DBGrid1.FieldCount -1 do
      case DBGrid1.Fields[J].DataType of
        ftAutoInc, ftBytes, ftInteger, ftSmallint, ftWord: // Auto o Numérico
          WorkSheet.Cells[I, J +1] := DBGrid1.Fields[J].AsInteger;
        ftBCD, ftFloat, ftCurrency: // Numérico con decimales
          WorkSheet.Cells[I, J +1] := DBGrid1.Fields[J].AsFloat;
        ftDateTime, ftDate, ftTime: // Fecha y Hora
          WorkSheet.Cells[I, J +1] := DBGrid1.Fields[J].AsDateTime;
        else // Todo lo demas caracteres
          WorkSheet.Cells[I, J +1] := DBGrid1.Fields[J].AsString;
      end;
      inc (i);
      ProgressBarXls.Position := ProgressBarXls.Position +1;
      DBGrid1.DataSource.DataSet.Next;
      if edtDigito.Text <> Derecha(dmGlobal.g_NivelCuenta,1) then
        begin
          if (_Campo <> Izquierda(DBGrid1.Fields[0].AsString, StrToInt(edtDigito.Text))) or (DBGrid1.DataSource.DataSet.Eof) Then
            begin
              _Campo := Izquierda(DBGrid1.Fields[0].AsString, StrToInt(edtDigito.Text));
              WorkSheet.cells[i,3] := '=Sum(C' + IntToStr(_Filaini) + ':C' + IntToStr(i-1) + ')';
              WorkSheet.cells[i,4] := '=Sum(D' + IntToStr(_Filaini) + ':D' + IntToStr(i-1) + ')';
              WorkSheet.cells[i,5] := '=Sum(E' + IntToStr(_Filaini) + ':E' + IntToStr(i-1) + ')';
              WorkSheet.cells[i,6] := '=Sum(F' + IntToStr(_Filaini) + ':F' + IntToStr(i-1) + ')';
              WorkSheet.cells[i,7] := '=Sum(G' + IntToStr(_Filaini) + ':G' + IntToStr(i-1) + ')';
              WorkSheet.cells[i,8] := '=Sum(H' + IntToStr(_Filaini) + ':H' + IntToStr(i-1) + ')';
              WorkSheet.cells[i,9] := '=Sum(I' + IntToStr(_Filaini) + ':I' + IntToStr(i-1) + ')';
              WorkSheet.cells[i,10] := '=Sum(J' + IntToStr(_Filaini) + ':J' + IntToStr(i-1) + ')';
              WorkSheet.cells[i,11] := '=Sum(K' + IntToStr(_Filaini) + ':K' + IntToStr(i-1) + ')';
              WorkSheet.cells[i,12] := '=Sum(L' + IntToStr(_Filaini) + ':L' + IntToStr(i-1) + ')';
              WorkSheet.cells[i,13] := '=Sum(M' + IntToStr(_Filaini) + ':M' + IntToStr(i-1) + ')';
              WorkSheet.cells[i,14] := '=Sum(N' + IntToStr(_Filaini) + ':N' + IntToStr(i-1) + ')';
              WorkSheet.cells[i,15] := '=Sum(O' + IntToStr(_Filaini) + ':O' + IntToStr(i-1) + ')';
              Inc(_quiebre);
              _posiciones [_quiebre] := i;
              Inc(i);
              _FilaIni := i;
            end;
        end;
  end;
  if _posiciones[1] <> 0 then
    Begin
      for _c := 1 to 13 do
        Begin
        _Campo := '';
        for _f := 1 to 10 do
          if _posiciones [_f] <> 0 then
            _Campo := _campo + '+' + _letras[_C]  + IntToStr(_posiciones[_f]);
            WorkSheet.cells [i,2 + _c] := '= Sum( ' + _Campo + ')';
        End;
    End;
  WorkSheet.Cells.Columns.AutoFit;
  WorkBook.SaveAs(fname);
  WorkBook.Close(fName);
  Excel.Quit;
end;


lo que si debes tener cuidado es en la version del excel que tengas.. he visto algunos casos en que se debe colocar =SUMA... en lugar de =SUM


La franja horaria es GMT +2. Ahora son las 22:44:33.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi