05 diciembre 2008

Creando una hoja de cálculo desde Delphi

Al igual que en el artículo anterior vimos como leer datos de una hoja de cálculo de Microsoft Excel hoy vamos a ver como crearla, rellenarla con datos y fórmulas para luego guardarla en disco.

Para ello utilizaremos el mismo componente: TExcelApplication. Le pondremos igualmente en su propiedad Name el nombre Excel. Mi objetivo es crear esta hoja de cálculo:


Esta hoja contiene 4 columnas con las unidades, el nombre del artículo, el precio y total línea. La columna del total debe contener una fórmula que multiplique las unidades por el precio.

Vamos a ver paso a paso como crear esta hoja de cálculo:

1º Declaramos la variable Hoja de tipo _WorkSheet para que apunte a la hoja de cálculo con la que estamos trabajando:

var
Hoja: _WorkSheet;

2º Ejecutamos una instancia de Excel y creamos un nuevo libro (Workbook):

// Abrimos excel
Excel.Connect;

// Creamos un nuevo libro con tres hojas (predeterminado)
Excel.Workbooks.Add( NULL, 0 );

3º A la primera hoja del libro la llamamos Presupuesto:

// Apuntamos a la primera hoja y le cambiamos el nombre
Hoja := Excel.Worksheets.Item[1] as _WorkSheet;
Hoja.Name := 'Presupuesto';

4º Creamos los títulos de las columnas:

// Títulos de los datos
Hoja.Range['A1','A1'].Value2 := 'UNIDADES';
Hoja.Range['B1','B1'].Value2 := 'ARTICULO';
Hoja.Range['B1','B1'].ColumnWidth := 30;
Hoja.Range['C1','C1'].Value2 := 'PRECIO';
Hoja.Range['D1','D1'].Value2 := 'TOTAL';
Hoja.Range['A1','D1'].Font.Bold := True;

Aparte de introducir los títulos he utilizado las propiedades ColumnWidth y Font.Bold para ensanchar la columna del artículo y para poner todos los títulos en negrita.

5º Introducimos los datos dentro de las columnas:

// Datos
Hoja.Range['A2','A2'].Value2 := 3;
Hoja.Range['B2','B2'].Value2 := 'BOLIGRAFOS';
Hoja.Range['C2','C2'].Value2 := 1.25;
Hoja.Range['A3','A3'].Value2 := 2;
Hoja.Range['B3','B3'].Value2 := 'LIBRETAS';
Hoja.Range['C3','C3'].Value2 := 2.4;
Hoja.Range['A4','A4'].Value2 := 5;
Hoja.Range['B4','B4'].Value2 := 'LAPICES';
Hoja.Range['C4','C4'].Value2 := 0.45;

Al ser la propiedad Value2 de tipo Variant podemos introducir datos de todo tipo sin necesidad de realizar conversiones.

6º En la última columna vamos a introducir una fórmula para multiplicar unidades por precio:

// Fórmulas
Hoja.Range['D2','D2'].Formula := '=A2*C2';
Hoja.Range['D3','D3'].Formula := '=A3*C3';
Hoja.Range['D4','D4'].Formula := '=A4*C4';

7º Damos formato decimal a las columnas del precio y los totales y para ésta última columna le cambiamos los colores:

// Formato decimal
Hoja.Range['C2','D4'].NumberFormat := '0,00';

// Damos formato a los totales
Hoja.Range['D2','D4'].Font.Bold := True; // fuente negrita
Hoja.Range['D2','D4'].Font.Color := clBlue; // fuente azul
Hoja.Range['D2','D4'].Borders.Color := clRed; // borde rojo
Hoja.Range['D2','D4'].Interior.Color := clYellow; // fondo amarrillo

8º Por último guardamos la hoja de cálculo y desconectamos de Excel:

// Lo primero que hacemos es guardarlo
Excel.ActiveWorkbook.SaveAs( ExtractFilePath( Application.ExeName ) + 'Nueva.xls',
EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, xlNoChange,
EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, 0);

Excel.Quit;
Excel.Disconnect;

La hoja de cálculo la hemos guardado con el nombre Nueva.xls dentro de mismo directorio donde se ejecuta nuestra aplicación.

Y es que no hay nada mejor que sacarle partido a Microsoft Office para que nos haga el trabajo sucio.

Pruebas realizadas en RAD Studio 2007.

25 comentarios:

Unknown dijo...

Excel-ente, muchas gracias !!!

Anónimo dijo...

¿Necesito tener Excel instalado?

Administrador dijo...

Si lo necesitas, ya que los componentes Servers de Delphi llaman a los objetos ActiveX de Office para trabajar con ellos.

Como mínimo necesitas el Office XP.

Alejandro dijo...

como siempre muy bueno. Gracias

Alejandro dijo...

como siempre muy bueno. Gracias

Anónimo dijo...

Gracias por su valioso aporte a los que sabemos menos

Horacio - Mexico dijo...

Gracias amigo... Excelente

Anónimo dijo...

¿Hay alguna forma de crear una hoja de Excel desde delphi sin tener instalado ningún ofice en la PC?

Donde trabajo no usan ofice pero si abren documento excel y necesitan crear documentos excel para otras empresas que si usan ofice.

Administrador dijo...

Eso es imposible. Ten en cuenta que lo que hace este componente es abrir realmente Excel y darle instrucciones.

Saludos.

Roger Bermudez dijo...

Me gustaria poder crear o mejor dicho modificar el encabezado y pie de la página.

Roger Bermudez dijo...

Ya esta no lo busques:

with WorkSheet.PageSetup Do
Begin
LeftHeaderPicture.Filename := 'C:\logo.bmp';
LeftHeader := '&G';
LeftHeaderPicture.Width :=80;
LeftHeaderPicture.Height:=50;
TopMargin := 1.5;
BottomMargin := 1.5;
Orientation := 1;
End;

Administrador dijo...

Gracias por la información. Al final lo has resuelto tu sólo.

Saludos.

Oscar_dex dijo...

Me sale un error en office 2007 al abrir el archivo generado, alguna idea para solucinarlo desde ya muchas gracias.

Administrador dijo...

Tengo entendido que solo funciona bien hasta la versión de Office XP. Para poder utilizar las últimas versiones de Office habrá que utilizar las últimas versiones de Delphi, como puede ser RAD Studio 2010.

De todas formas no lo he probado. Si alguien lo la probado que diga a ver si chuta o no.

Saludos.

El Zorro dijo...

El TExcelapplication no aparece en mi DELPHI 2009. ¿Cómo hago para activarlo? Gracias

Administrador dijo...

Mira en la opción Component -> Install Packages porque muchas veces están desactivados los componentes del Office.

Saludos.

aaaaaaaaaaaaaaa dijo...

Se puede crear un archivo de excel sin tener excel instalado. En PHP se hace continuamente (google: php excel)

En Delphi tenéis un ejemplo aquí:
http://cc.embarcadero.com/item/13462

Administrador dijo...

Gracias por la información.

Seferus Niebla dijo...

Puedo abrir un libro de excel ya creado? es decir, un archivo ya con formato

edgar dijo...

com puedo ajustar la escala de la pagina para que al ponerle envista previa ya aparezca al 60 o el porcentaje que yo necesite

Unknown dijo...

Para usar Suma utilizar SUM

Blogdelphimagic dijo...

Aqui tienes muy buenos ejemplos de funciones para trabajar con excel usando delphi
http://delphimagic.blogspot.com.es/2013/03/trabajar-con-graficos-en-excel-con.html
http://delphimagic.blogspot.com.es/2013/03/funciones-excel.html

Jhonatan dijo...

Excelente hermano

Unknown dijo...

Hola excelente trabajo, solo una pregunta, como cambias el font de una celda?

Cristian dijo...

Muchas gracias... aun con Delphi7 en estos años

Publicidad