PDA

Ver la Versión Completa : sumar columna en excel


edgar_prospero
12-07-2012, 20:18:37
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

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


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