PDA

Ver la Versión Completa : Unir archivos Excel


cmfab
17-07-2013, 00:08:16
Hola a todos, he estado revisando pero no encuentro respuesta de como hacer lo siguiente: Tengo 5 archivos de excel por separados y necesito unirlos en uno solo, osea algo como esto: generar un nuevo archivo que sea igual que el archivo 1, y de ahi en adelante crear 4 hojas mas en este nuevo archivo que van a contener cada hoja 1 de los restantes 4 archivos. Existe esta posibilidad ?, cabe resaltar que la estructura de los archivos es igual y cada uno de ellos solo contiene una hoja de datos

Gracias de antemano

Casimiro Notevi
17-07-2013, 00:54:59
¿Pero desde delphi?

cmfab
17-07-2013, 00:59:07
Si, no se si es posible pero lo necesitaria desde Delphi

saludos y gracias por el interés

Casimiro Notevi
17-07-2013, 01:38:20
Haz una búsqueda por los foros, creo recordar varios temas similares.

cmfab
17-07-2013, 01:46:36
Gracias nuevamente, encontre esta página en la web http://analisisydecision.es/truco-sas-unir-todos-los-excel-en-uno-solo/

mas abajo viene un codigo que quise transformar a Delphi, me quedo de esta forma


XL := CreateOleObject('Excel.Application');
XL.Workbooks.Open('prueba.xls');
XL.ActiveWorkbook.SaveAs('TodasJuntas.xls', -4143);
XL.Workbooks.Open('prueba1.xls');
XL.Workbooks('prueba1.xls').Sheets('prueba1').Copy (XL.Workbooks('TodasJuntas.xls').Sheets(1)) ;
XL.Workbooks('prueba1.xls').Close;
XL.Workbooks('TodasJuntas.xls').sheets(2).activate;
XL.Workbooks('TodasJuntas.xls').Save;
XL.Quit;


pero me da error y solo me graba el pruimer archivo prueba.xls, no se si adapté algo mal en el código

saludos

nlsgarcia
17-07-2013, 11:30:08
cmfab,


...Tengo 5 archivos de Excel por separados y necesito unirlos en uno solo...


Revisa este código:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComObj;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

// Consolida Hojas de Cálculo en un solo Libro de Trabajo
procedure TForm1.Button1Click(Sender: TObject);

const
// Formato Open XML Workbook
xlOpenXMLWorkbook = 51;

// Arreglo de Hojas de Cálculo a Consolidar
FileExcel : Array[1..6] of String = ('TestCopy-1.xls', 'TestCopy-2.xls',
'TestCopy-3.xls', 'TestCopy-4.xls',
'TestCopy-5.xls', 'TestCopy-6.xls');
var
Excel, WrkS : OleVariant;
Sheet, Range : OleVariant;
FileExcelInput : String;
FileExcelOutput : String;
i : Integer;

begin

// Ruta del Libro de Trabajo Consolidado
FileExcelOutput := ExtractFilePath(Application.ExeName) + 'TestCopyAll.xlsx';

try

// Borra la versión previa del Libro de Trabajo Consolidado
if FileExists(FileExcelOutput) then
DeleteFile(FileExcelOutput);

// Crea una instancia de Automatización de Excel
Excel := CreateOleObject('Excel.Application');

// Configura parámetros de ejecución de Excel
Excel.DisplayAlerts := False;
Excel.Visible := False;

// Crea el Libro de Trabajo Consolidado
Excel.Workbooks.Add(-4167);
WrkS := Excel.Worksheets[1];
WrkS.Name := 'None';
WrkS.SaveAs(FileExcelOutput,xlOpenXMLWorkbook);

// Consolida las hojas de cálculo del arreglo FileExcel en un solo Libro de Trabajo
for i := High(FileExcel) downto Low(FileExcel) do
begin

// Abre el Libro de Trabajo Consolidado
Excel.Workbooks.Open(FileExcelOutput);

// Adiciona una hoja de cálculo vacía
WrkS := Excel.Worksheets.Add();

// Asigna un nombre a la hoja de cálculo
WrkS.Name := 'Sheet-' + IntToStr(i);

// Asigna una hoja de cálculo a consolidar como Input
FileExcelInput := ExtractFilePath(Application.ExeName) + FileExcel;

// Abre la hoja de Input
Sheet := Excel.Workbooks.Open(FileExcelInput);

// Copia todo el contenido de la hoja de Input (Solo la primera hoja de cálculo a efectos de este ejemplo)
Range := Sheet.Worksheets[1].UsedRange.Copy;

// Adiciona la hoja de Input en el Workbook de Output
WrkS.Range['A1'].PasteSpecial(Range);

// Salva WrkS Consolidado
WrkS.SaveAs(FileExcelOutput,xlOpenXMLWorkbook);

end;

MessageDlg('Consolidado de Hojas de Cálculo de Excel Creado Satisfactoriamente', mtinformation, [mbok], 0);

finally

// Finaliza la automatización de Excel y libera recursos
Excel.Quit;
Excel := Unassigned;
WrkS := Unassigned;
Sheet := Unassigned;

end;

end;

end.

El código anterior [I]genera un Libro de Trabajo Consolidado en Excel con la información de 6 hojas de cálculo (La primera hoja de cada una sin importar su estructura) por medio de Automatización de Excel con Delphi 7 y Excel 2010.

Espero sea útil :)

Nelson.

cmfab
17-07-2013, 15:11:19
Excelente, mil gracias es justo lo que necesitaba
Un saludo grande a todos

nlsgarcia
18-07-2013, 05:44:11
cmfab,


...justo lo que necesitaba...


Revisa este código:

// Consolida Hojas de Cálculo en un solo Libro de Trabajo (Versión 2)
procedure TForm1.Button1Click(Sender: TObject);
const
// Formato Open XML Workbook
xlOpenXMLWorkbook = 51;

// Arreglo de Hojas de Cálculo a Consolidar
FileExcel : Array[1..6] of String = ('TestCopy-1.xls', 'TestCopy-2.xls',
'TestCopy-3.xls', 'TestCopy-4.xls',
'TestCopy-5.xls', 'TestCopy-6.xls');
var
Excel, WrkS : OleVariant;
Sheet, Range : OleVariant;
FileExcelInput : String;
FileExcelOutput : String;
i : Integer;

begin

// Ruta del Libro de Trabajo Consolidado
FileExcelOutput := ExtractFilePath(Application.ExeName) + 'TestCopyAll.xlsx';

try

// Borra la versión previa del Libro de Trabajo Consolidado
if FileExists(FileExcelOutput) then
DeleteFile(FileExcelOutput);

// Crea una instancia de Automatización de Excel
Excel := CreateOleObject('Excel.Application');

// Configura parámetros de ejecución de Excel
Excel.DisplayAlerts := False;
Excel.Visible := False;

// Crea el Libro de Trabajo Consolidado
Excel.Workbooks.Add(-4167);
WrkS := Excel.Worksheets[1];
WrkS.Activate;
WrkS.Name := 'None';

// Consolida las hojas de cálculo del arreglo FileExcel en un solo Libro de Trabajo
for i := High(FileExcel) downto Low(FileExcel) do
begin

// Adiciona una hoja de cálculo vacía
WrkS := Excel.Worksheets.Add();

// Asigna un nombre a la hoja de cálculo
WrkS.Name := 'Sheet-' + IntToStr(i);

// Asigna una hoja de cálculo a consolidar como Input
FileExcelInput := ExtractFilePath(Application.ExeName) + FileExcel;

// Abre la hoja de Input
Sheet := Excel.Workbooks.Open(FileExcelInput);

// Copia todo el contenido de la hoja de Input (Solo la primera hoja de cálculo a efectos de este ejemplo)
Range := Sheet.Worksheets[1].UsedRange.Copy;

// Adiciona la hoja de Input en el Workbook de Output
WrkS.Range['A1'].PasteSpecial(Range);

// Cierra la hoja de Input
Sheet.Close;

end;

// Remueve la hoja de cálculo de creación inicial del WorkBook
Excel.WorkSheets['None'].Activate;
Excel.WorkSheets['None'].Delete;

// Posiciona el WorkBook en el primera Sheet
Excel.Worksheets[1].Activate;

// Salva WrkS Consolidado
WrkS.SaveAs(FileExcelOutput,xlOpenXMLWorkbook);

MessageDlg('Consolidado de Hojas de Cálculo de Excel Creado Satisfactoriamente', mtinformation, [mbok], 0);

finally

// Finaliza la automatización de Excel y libera recursos
Excel.Quit;
Excel := Unassigned;
WrkS := Unassigned;
Sheet := Unassigned;

end;

end;

El código anterior [I]es una variante más optimizada del código sugerido en el Msg #6 (Mejora el I/O y consumo de recursos de Excel).

Espero sea útil :)

Nelson.