Ir al contenido


Foto

Combinar celdas en excel desde Delphi


  • Por favor identifícate para responder
5 respuestas en este tema

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 17 noviembre 2017 - 10:05

Amigos, yo tengo una plantilla en Excel y lo relleno de datos desde Delphi, todo bien, mi problema es que no sé cómo combinar celdas continuas donde los datos se repiten y  convertirlo en una sóla celda, ¿algunos de ustedes han podido hacerlo?, tengo el siguiente código que me funciona perfectamente:


delphi
  1. procedure TFValidaCR.CreaNominaExcel(ACarta: Integer);
  2. var ExcelApp, Libro: Variant;
  3. fila, i:integer;
  4. aPlantilla: String;
  5. begin
  6.  
  7. aPlantilla := InitSettings.getReportsPath + '\Plantillas\NominaCR.xls';
  8.  
  9. if not FileExists(aPlantilla) then begin
  10. MessageDLG('No existe la plantilla para preparar la nómina',mtWarning,[mbOk],0);
  11. Exit;
  12. end;
  13.  
  14. Reportes.QNominaCR.Close;
  15. try
  16. try
  17. Reportes.QNominaCR.Params[0].AsInteger := ACarta;
  18. try
  19. Reportes.QNominaCR.Open;
  20.  
  21. if not Reportes.QNominaCR.IsEmpty then begin
  22.  
  23. //svGuardar es un SaveDialog para poder especificar la ruta del archivo
  24. svGuardar.Title := 'Exportando Nómina a Excel';
  25. svGuardar.DefaultExt := '*.xls';
  26.  
  27. svGuardar.Filter := 'Archivos Excel (*.xls,*.xlsx)|*.xls;*.xlsx';
  28. svGuardar.FilterIndex := 1;
  29.  
  30. try
  31. svGuardar.Execute;
  32. if (svGuardar.FileName <> '') then
  33. begin
  34.  
  35. //Deshabilitamos los controles
  36. Reportes.QNominaCR.DisableControls;
  37.  
  38. //Creamos el archivo Excel
  39. ExcelApp := CreateOleObject('Excel.Application');
  40.  
  41. //Evitamos mostrar las alertas propias de Excel
  42. ExcelApp.DisplayAlerts := false;
  43.  
  44. // Colocamos el Nombre de la Hoja
  45. ExcelApp.WorkBooks.Open(aPlantilla,null,null,null,null,null,null,null,null,True,null,null,null,null,0);
  46.  
  47. // Activamos la hoja la cual trabajaremos
  48. Libro := ExcelApp.WorkBooks[1].ActiveSheet;
  49.  
  50. // Ahora cargaremos los datos
  51.  
  52. //Empezamos desde la cuarta fila
  53. //De la plantilla NominaCR
  54. fila := 4;
  55.  
  56. //Lo dejamos en Segundo Plano
  57. ExcelApp.Visible := False;
  58.  
  59. Libro.Cells[1,1].NumberFormat := RPad('0', '0', Length(Reportes.QNominaCR.FieldByName('CONS_NOMBRE').AsString));
  60. Libro.Cells[1,1] := Reportes.QNominaCR.FieldByName('CONS_NOMBRE').AsString;
  61.  
  62. Reportes.QNominaCR.First;
  63. while not Reportes.QNominaCR.eof do begin
  64. //Nombre del Empleado
  65. Libro.Cells[fila,2].NumberFormat := RPad('0', '0', Length(Reportes.QNominaCR.FieldByName('EMP_NOMBRE').AsString));
  66. Libro.Cells[fila,2] := Reportes.QNominaCR.FieldByName('EMP_NOMBRE').AsString;
  67.  
  68. //Cédula Empleado
  69. Libro.Cells[fila,3].NumberFormat := RPad('0', '0', Length(Reportes.QNominaCR.FieldByName('EMP_CEDULA').AsString));
  70. Libro.Cells[fila,3] := Reportes.QNominaCR.FieldByName('EMP_CEDULA').AsString;
  71.  
  72. //Cargo en nomina
  73. Libro.Cells[fila,4].NumberFormat := RPad('0', '0', Length(Reportes.QNominaCR.FieldByName('CARGO_NOMBRE').AsString));
  74. Libro.Cells[fila,4] := Reportes.QNominaCR.FieldByName('CARGO_NOMBRE').AsString;
  75.  
  76. //Provincia
  77. Libro.Cells[fila,5].NumberFormat := RPad('0', '0', Length(Reportes.QNominaCR.FieldByName('PROVINCIA_NOMBRE').AsString));
  78. Libro.Cells[fila,5] := Reportes.QNominaCR.FieldByName('PROVINCIA_NOMBRE').AsString;
  79.  
  80. //Tipo tarifa
  81. Libro.Cells[fila,6].NumberFormat := RPad('0', '0', Length(Reportes.QNominaCR.FieldByName('TIPO_TARIFA').AsString));
  82. Libro.Cells[fila,6] := Reportes.QNominaCR.FieldByName('TIPO_TARIFA').AsString;
  83.  
  84. //Fecha
  85. Libro.Cells[fila,7].NumberFormat := RPad('0', '0', Length(FormatDateTime('dd/MM/yyyy',Reportes.QNominaCR.FieldByName('CR_FECHA').AsDateTime)));
  86. Libro.Cells[fila,7] := FormatDateTime('dd/MM/yyyy',Reportes.QNominaCR.FieldByName('CR_FECHA').AsDateTime);
  87.  
  88. //Monto Tarifa
  89. Libro.Cells[fila,8].NumberFormat := '0.00';
  90. Libro.Cells[fila,8] := Reportes.QNominaCR.FieldByName('monto_tarifa').AsCurrency;
  91.  
  92. //Autofijamos las columnas
  93. //Libro.Cells.Columns.Autofit;
  94.  
  95. //Siguiente Fila
  96. Inc(Fila);
  97.  
  98. //AProgreso.Position := AProgreso.Position + 1;
  99.  
  100. Reportes.QNominaCR.Next;
  101. end;
  102.  
  103. Reportes.QNominaCR.EnableControls;
  104.  
  105. Libro.SaveAs(svGuardar.FileName);
  106.  
  107.  
  108. ExcelApp.Visible := True;
  109.  
  110.  
  111. end; //if svGuardar.FileName <> ''
  112. except
  113. ExcelApp.Quit;
  114. //AProgreso.Visible := False;
  115.  
  116. Showmessage('No se pudo crear el Archivo Excel.');
  117. raise;
  118. end;
  119. end; //if not is empty
  120. except
  121. on E:EFDDBEngineException do begin
  122. MostrarError('Verificación Carta de Ruta',E.ClassName,'¡Ocurrió un problema al intentar preparar la nómina!',E.Message,Usuario,Equipo);
  123. Exit;
  124. end;
  125. end;
  126. except
  127. on E:EFDDBEngineException do begin
  128. MostrarError('Verificación Carta de Ruta',E.ClassName,'¡Ocurrió un problema al intentar preparar la nómina!',E.Message,Usuario,Equipo);
  129. Exit;
  130. end;
  131. end;
  132. finally
  133. Reportes.QNominaCR.Close;
  134. end;
  135. end;

Saludos.


  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 17 noviembre 2017 - 11:15

Hola amigo
 
Algo así
 


delphi
  1. _Range = Sheet.get_Range(Sheet.Cells[1, 5], Sheet.Cells[2, 5]);
  2. _Range.Merge(true);

 
Saludos (y)


  • 0

#3 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 17 noviembre 2017 - 12:13

Gracias amigo, pero, ¿Cómo determino las celdas repetidas en el ciclo?, ahí está el detalle, mientras yo sepa las celdas que están repetidas de antemano no hay problemas, pero como no es así..


  • 0

#4 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 17 noviembre 2017 - 12:34

Gracias amigo, pero, ¿Cómo determino las celdas repetidas en el ciclo?, ahí está el detalle, mientras yo sepa las celdas que están repetidas de antemano no hay problemas, pero como no es así..

 

Bueno amigo, debe haber algún campo que agrupe el rango, por ejemplo, No de cotización, No. Factura, etc. 

 

Saludos


  • 0

#5 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 17 noviembre 2017 - 12:36

Pues son varios campos que se agrupan y se repiten..


  • 0

#6 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 17 noviembre 2017 - 04:04

Gracias a Egostar, finalmente pude hacerlo de la siguiente manera:


delphi
  1. vat EmpIni,EmpFin: Integer;
  2. EmpNombre: String;
  3. begin
  4. ...
  5. ...
  6. //El inicio y Final siempre será donde empieza la fila
  7. EmpIni := 4;
  8. EmpFin := 4;
  9.  
  10. DataSet.First;
  11.  
  12. EmpNombre := DataSet.FieldByName('EMP_NOMBRE').AsString;
  13. while not DataSet.eof do begin
  14. ...
  15. ...
  16.  
  17. Inc(fila);
  18.  
  19. DataSet.Next;
  20.  
  21. //Hacemos algunos merges
  22. if DataSet.FieldByName('EMP_NOMBRE').AsString = EmpNombre then begin
  23. EmpFin := fila; //La Fila Actual
  24. end else begin
  25. EmpIni := fila; //Empezamos desde la fila actual
  26. EmpFin := fila; //Terminamos en la fila actual
  27. EmpNombre := Reportes.QNominaCR.FieldByName('EMP_NOMBRE').AsString;
  28. end;
  29.  
  30. //'B' es la columna de la celda
  31. Libro.range['B' + IntToSTr(EmpIni),'B' + IntToStr(EmpFin)].MergeCells := True;
  32. Libro.range['B' + IntToSTr(EmpIni),'B' + IntToStr(EmpFin)].VerticalAlignment := -4108;
  33. end;

Ya con eso hacemos el merge en las celdas que estén repetidas y continuas.

 

Saludos.


  • 1




IP.Board spam blocked by CleanTalk.