PDA

Ver la Versión Completa : Como importar datos desde Excel?


axlrafael
24-04-2008, 21:33:51
Hola que tal amigos, miren tengo un problema, necesito que en mi aplicación se pueda cargar datos desde hojas de excel a campos de tipo "Edit", pero no se ni como empezar. Por favor con que componentes se puede hacer esto? ya he estado buscando en varios foros pero la mayoria son para guardar hojas de Excel.

Miren la cuestión es esta, tengo un control de articulos de inventario en excel donde van separadas por grupo y por mes de esta forma:

gpo || ENE || FEB || MAR || ABR || MAY ||.....|| DIC|| || TOT ||

1 'EDIT1' 'EDIT2' 'EDIT3' 'EDIT4' .......... 'EDITX' 'EDITXX'
2 'EDITX' 'EDITX' 'EDITX' 'EDITX' ......... 'EDITX' 'EDITXX'
3 'EDIT1' 'EDIT2' 'EDIT3' 'EDIT4' .......... 'EDITX' 'EDITXX'
4 'EDIT1' 'EDIT2' 'EDIT3' 'EDIT4' .......... 'EDITX' 'EDITXX'
..
..
10 'EDIT1' 'EDIT2' 'EDIT3' 'EDIT4' .......... 'EDITX' 'EDITXX'


En mi aplicación esta forma de igual manera, entonces quiero buscar un archivo, recoger la ruta en otro edit y con otro botón iniciar la transferencia de los datos colocados exactamente en los "edits" correspondientes.
Bueno esa es mi idea, si ustedes usan otra manera para hacer algo similar por favor ayudame compartiendola y diciendome que componentes usar.

De antemano gracias por su atención y les deseo suerte en sus proyectos ;).

BlueSteel
24-04-2008, 22:17:44
Hola que tal amigos, miren tengo un problema, necesito que en mi aplicación se pueda cargar datos desde hojas de excel a campos de tipo "Edit", pero no se ni como empezar. Por favor con que componentes se puede hacer esto? ya he estado buscando en varios foros pero la mayoria son para guardar hojas de Excel.

Miren la cuestión es esta, tengo un control de articulos de inventario en excel donde van separadas por grupo y por mes de esta forma:

gpo || ENE || FEB || MAR || ABR || MAY ||.....|| DIC|| || TOT ||

1 'EDIT1' 'EDIT2' 'EDIT3' 'EDIT4' .......... 'EDITX' 'EDITXX'
2 'EDITX' 'EDITX' 'EDITX' 'EDITX' ......... 'EDITX' 'EDITXX'
3 'EDIT1' 'EDIT2' 'EDIT3' 'EDIT4' .......... 'EDITX' 'EDITXX'
4 'EDIT1' 'EDIT2' 'EDIT3' 'EDIT4' .......... 'EDITX' 'EDITXX'
..
..
10 'EDIT1' 'EDIT2' 'EDIT3' 'EDIT4' .......... 'EDITX' 'EDITXX'


En mi aplicación esta forma de igual manera, entonces quiero buscar un archivo, recoger la ruta en otro edit y con otro botón iniciar la transferencia de los datos colocados exactamente en los "edits" correspondientes.
Bueno esa es mi idea, si ustedes usan otra manera para hacer algo similar por favor ayudame compartiendola y diciendome que componentes usar.

De antemano gracias por su atención y les deseo suerte en sus proyectos ;).

Hola axlrafael

Primero que nada Bienvenido al Club... te sugiero que te leas la guia de estilo (http://www.clubdelphi.com/foros/guiaestilo.php)

Para tu caso puedes utilizar lo sgte.. Utilizar un componente de tipo DataSet (en la Jedi encuentras el JvDataSet).. vincularlo al archivo de Excel.. y mostrar los datos en un DBGrid que este vinculado al DataSet... yo utilizo ese metodo para capturar los datos desde un archivo de texto con columnas fijas... y me va de maravillas

Mira, este codigo es para activar el DataSet (DTexto)...

DTexto.Active := False;
DTexto.FileName := Concat(Label1.Caption,'\',Archivo.Text); //Obtengo la ruta de un DirectoryListBox y FileListBox..
DTexto.Active := True;


Edito; me falto mencionar que al DataSet le puedes crear la cantidad de columnas que necesites y asigna los campos... con el tamaño (ancho o largo) que quieras

Si necesitas más ayuda.. pregunta

Salu2:p:D

Caro
25-04-2008, 14:52:09
Hola axlrafael, también lo puedes hacer de esta forma.


const
xlCellTypeLastCell = $0000000B;
var
Excel, Sheet: OLEVariant;
CantRow, CantCol, i, j : Integer;
RangoMatriz: Variant;
begin
FileName := 'C:\Archivo.xls';
Excel := CreateOleObject('Excel.Application');
Excel.Workbooks.Open(FileName);

Sheet := Excel.Workbooks[ExtractFileName(FileName)].WorkSheets[1];
Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;

CantRow := Excel.ActiveCell.Row;
CantCol := Excel.ActiveCell.Column;

RangoMatriz := Excel.Range['A1', Excel.Cells.Item[CantRow,CantCol]].Value;

for i:=1 to CantRow do
begin
for j:=1 to CantCol do
begin
Showmessage(RangoMatriz[i,j]);
//haces todo lo que necesites hacer
end;
end;//for



Saluditos

axlrafael
26-04-2008, 23:41:44
Muchas gracias amigo, tratare de hacerlo ahorita como ustedes me dijeron, solo otra cosita por favor, cuales componentes debo utilizar para hacer esto??

gracias

BlueSteel
27-04-2008, 03:05:40
Muchas gracias amigo, tratare de hacerlo ahorita como ustedes me dijeron, solo otra cosita por favor, cuales componentes debo utilizar para hacer esto??

gracias


Hola, creo que en el ejemplo de caro, no tienes que usar ningun componente en especial...

en el mode de importar los datos desde excel que te dí yo, te describo que componentes se utilizan...

Para tu caso puedes utilizar lo sgte.. Utilizar un componente de tipo DataSet (en la Jedi encuentras el JvDataSet).. vincularlo al archivo de Excel.. y mostrar los datos en un DBGrid que este vinculado al DataSet... yo utilizo ese metodo para capturar los datos desde un archivo de texto con columnas fijas... y me va de maravillas

Salu2:p:D

axlrafael
28-04-2008, 21:08:20
Hola disculpen, se me olvido mencionar que trabajo con Delphi 6. Para mi amigo BlueSteel, perdoname pero no encuentro el componente DataSet ni tampoco la Jedi ni el JvDataSet :confused:.

roman
28-04-2008, 21:17:36
También puedes usar los componentes ADO. Aquí (http://www.clubdelphi.com/foros/showpost.php?p=10844&postcount=5) hay detalles de cómo usarlos para acceder a una hoja de Excel.

// Saludos

BlueSteel
28-04-2008, 21:18:04
Hola disculpen, se me olvido mencionar que trabajo con Delphi 6. Para mi amigo BlueSteel, perdoname pero no encuentro el componente DataSet ni tampoco la Jedi ni el JvDataSet :confused:.

Hola...

Para encontrar esos componentes, debes intalar el Pack de Jedi..JCV y JCVL... no se si estan aquí... pero en más de un foro se ha tratado

Salu2:p:D

Revisa este link (http://www.clubdelphi.com/foros/showpost.php?p=280275&postcount=9)... donde puedes descargar dicho componente

axlrafael
06-05-2008, 21:22:45
Muchisimas gracias Caro, me sirvio de mucho tu código, te debo una ;)

axlrafael
08-05-2008, 19:21:49
Hola Caro, quiero preguntarte ¿porque es que despues de utilizar el archivo de excel en mi aplicación ya no me deja abrirlo de nueva cuenta?, he notado que cuando jalo cualquier archivo Excel en la aplicación no me deja abrirlo, me lo abre de tipo solo lectura y por logica no me deja guardarlo si lo quiero modificar:confused:.

Tambien note que en el administrador de tareas me abre tantas veces intente abrir yo el mismo archivo que utilice en la aplicación un proceso que es el de Excel ("EXCEL.EXE") :confused:

Espero que me puedas ayudar de nuevacuenta.

Saludos y suerte :D

Caro
09-05-2008, 05:26:49
Hola axlrafael, lo que pasa es que en el codigo que te pase, no estamos cerrando la hoja de excel, aumenta lo siguiente:


FileName := 'C:\Archivo.xls';
try
Excel := CreateOleObject('Excel.Application');
Excel.Workbooks.Open(FileName);
...........
..........
for i:=1 to CantRow do
begin
for j:=1 to CantCol do
begin
Showmessage(RangoMatriz[i,j]);
end;
end;//for
finally
Excel.Quit; //Aquí cerramos la hoja de Excel
end;


Saluditos

axlrafael
09-05-2008, 20:36:23
:DGracias Caro, ya quedo resuelto mi problema:D.

Suerte ;)

faustino36
21-05-2008, 18:37:29
Que tal, he probado el codigo y funciona muy bien. Alguien sabe como listar las hojas que contiene el documento de excel; en el ejemplo se muestra utilizando la hoja, pero quisiera hacer dinamica esta parte y permitir que el usuario escoja la hoja que desee, alguien sabe como hacer esto?

roman
21-05-2008, 18:56:13
Por ejemplo:


var
Excel, Workbook, Worksheet: OleVariant;
I: Integer;

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

Workbook := Excel.Workbooks.Open('C:\ruta\al\documento.xls');
for I := 1 to Workbook.Worksheets.Count do
Memo1.Lines.Add(Workbook.Worksheets[I].Name);

Excel.Visible := true;
end;


Posteriormente puedes hacer referencia a una hoja ya sea con el índice numérico o con el nombre:


Workbook.Worksheets[2]
Workbook.Worksheets['Hoja2']


// Saludos

faustino36
21-05-2008, 21:02:30
Muchas gracias, era exactamente lo que buscaba, ya lo pude implementar, gracias de nuevo

felipe88
26-05-2008, 21:11:31
Hola compañeros del club... buscando otras alternativas para importar datos de excel (En mi caso para Firebird), encuentro generalmente este codigo que ustedes proponen, pero ultimamente tengo un problema con el mismo ya que de un momento a otro me salio el error "Out of memory" y no me completa la carga del archivo; por eso me gustaria saber si conocen de la posible causa de la aparicion de este error y una posible solucion... de antemano gracias

Saludos ;)...

roman
26-05-2008, 21:48:11
¿Es muy grande tu archivo? De ser así, quizá te funcione mejor usar ADO, tal como mencioné en el mensaje 7 (http://www.clubdelphi.com/foros/showpost.php?p=283063&postcount=7).

// Saludos

axlrafael
26-05-2008, 22:00:35
Hola amigos, disculpen otra pregunta, ¿como puedo elegir el rango de F13:Q39 con el código que nos proporciono Caro?.

Es decir, tengo un formato de excel ya estandarizado pero los datos que necesito estan en este rango:

F G H I J K L M N Ñ O P Q
13
14
15
..
...
...
39

En el código aparece esto:


RangoMatriz := Excel.Range['A1', Excel.Cells.Item[CantRow,CantCol]].Value;

Ahi pongo según yo el rango que necesito, pero a la hora de probar me marca error.

Saludos a todos.

felipe88
27-05-2008, 14:33:40
¿Es muy grande tu archivo? De ser así, quizá te funcione mejor usar ADO, tal como mencioné en el mensaje 7 (http://www.clubdelphi.com/foros/showpost.php?p=283063&postcount=7).

// Saludos

Vaya!!! no me habia dado cuenta de que el ave fenix habia revivido de sus cenizas :D... o hace mucho que no volvia ?... Bueno roman, la verdad el archivo maneja unos casi 40.000 registros, normalmente esta carga al StringGrid que uso me tomaba menos de un minuto... de aqui solo es cuestion de pasarlo a la BD (Uso DBExpress) y para serte sincero no quisiera recurrir a ADO como la primera solucion aunque sea la mas efectiva, pues nunca lo he usado y no quisiera gastar en aprenderlo en este momento... ademas, cuales serian las dll's o bpl's que necesitaria en instalador en caso de que me decida :D...

felipe88
27-05-2008, 16:41:19
Bueno estuve probando ADO y logre esto:

ADOConnection1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + QuotedStr(Edit1.Text) +';Extended Properties=Excel 8.0;Persist Security Info=False';
ADODataSet1.Open;


Aqui le paso al ADOConnection1 el archivo de excel que necesite por medio de un Edit... y luego solo lo abro, hasta funciona mas rapido :); la pregunta del millon sigue siendo, una vez tenga este problema solucionado que dll y bpl necesito para el instalador...

Por cierto gracias por el codigo...;)





PD: Aca usamos caritas para todo :confused::eek::mad::rolleyes::cool::p;):D

Caro
28-05-2008, 15:15:28
Hola axlrafael, si necesitas desde el rango F13:Q39, en Range le dices que comience en F13 y cambias en tu ciclos for la cantidad de columnas y filas.


RangoMatriz := Excel.Range['F13', Excel.Cells.Item[CantRow,CantCol]].Value;

for i:=1 to CantRow-12 do
begin
for j:=1 to CantCol-5 do
begin
Showmessage(RangoMatriz[i,j]);
//haces todo lo que necesites hacer
end;
end;//for


Saluditos

Caro
28-05-2008, 15:26:57
la pregunta del millon sigue siendo, una vez tenga este problema solucionado que dll y bpl necesito para el instalador...


Hola Felipe88, ADO utiliza MDAC, que viene instalado en el sistema operativo (Windows XP, Millenium, 2000....). Pero si tu aplicación estara instalada en Windows 95 o 98, si necesitas redistribuir e instalar MDAC.

Mas caritas ;):p:D

Saluditos

felipe88
28-05-2008, 15:30:03
Hola Felipe88, ADO utiliza MDAC, que viene instalado en el sistema operativo (Windows XP, Millenium, 2000), pero si es Windows 95 y 98, si necesitas redistribuir e instalar MDAC.

Mas caritas ;):p:D

Saluditos

Gracias Caro, eso me tranquiliza mas...:):rolleyes::p;):D

Caro
28-05-2008, 16:48:11
Hola a todos, estoy leyendo todas las hojas de mi documento de excel, pero si encuentra una hoja vacía me sale un Access Violation al intentar leer la primera celda, como puedo verificar si una hoja esta vacía y asi no leerla, muchísimas gracias por adelantado.

Axrafael, para que no sea muy estatico, puedes obtener también las filas y columnas de tu rango y quedaria asi.


var
.....
CantRowRango, CantColRango, i, j : Integer;
RangoMatriz: Variant;
Rango : OleVariant;
begin
......................

CantRow := Excel.ActiveCell.Row;
CantCol := Excel.ActiveCell.Column;

Rango := Excel.Range['F13', 'Q39'];

RangoMatriz := Rango.Value;

CantRowRango := Rango.Rows.Row;
CantColRango := Rango.Columns.Column;

for i:=1 to (CantRow-CantRowRango)+1 do
begin
for j:=1 to (CantCol-CantColRango)+1 do
begin
//
end;
end;//for


Saluditos

roman
28-05-2008, 17:31:23
Hola a todos, estoy leyendo todas las hojas de mi documento de excel, pero si encuentra una hoja vacía me sale un Access Violation al intentar leer la primera celda, como puedo verificar si una hoja esta vacía y asi no leerla, muchísimas gracias por adelantado.


Es raro. Con este código


var
ExcelApp, Workbook: OleVariant;
I: Integer;

begin
ExcelApp := ComObj.CreateOleObject('Excel.Application');
Workbook := ExcelApp.Workbooks.Open('C:\ruta\al\documento.xls');

for I := 1 to WorkBook.Worksheets.Count do
Memo1.Lines.Add(Workbook.Worksheets[I].Cells[1, 1]);

ExcelApp.Visible := true;
end;


puedo acceder a la primera celda de cada hoja aun estando vacías.

// Saludos

Caro
28-05-2008, 18:19:42
Hola amiguito Roman, ya me funciona utilizando Cells como me indicas, muchísimas gracias ;). Lo que pasaba es que yo accedía a la celda, como esta en mi codígo casi al principio de este hilo.

Saluditos

axlrafael
29-05-2008, 00:09:14
De nueva cuenta muchisisimas gracias Caro, no sabes como me has ayudado en todo este tiempo, te lo agradesco de corazón, ya te debo miles :D.

Sobre tu otro código, voy a checarlo, porque con el anterior me sirve mucho, de todas maneras lo tomare en cuenta.

Saludos y suerte a todos con sus proyectos. ;)

Tachiquin
17-06-2008, 15:48:15
tengo que abrir archivos de word y de excel y mostrar la informacion en un programa en delphi, tambien guardar datos en archivos de word y excel, pueden decirme con que componentes, como se manejan parametros, estoy en delphi 7

ledesmarc
15-07-2008, 16:50:05
También puedes usar los componentes ADO. Aquí (http://www.clubdelphi.com/foros/showpost.php?p=10844&postcount=5) hay detalles de cómo usarlos para acceder a una hoja de Excel.

// Saludos

Roman muy buena tu info, pero tengo un problema cuando quiero importar desde el excel (usando Ado) lo hace bien cuando se trata de una columna que sean todos del mismo tipo para mi caso(son todos numeros) el tema es que cuando en la columna hay mesclados numeros y letras en una misma celda, la importacion se corta (osea importa hasta esa celda)y la verdad me he cansado de buscar pero no encuentro el porque.
Te agredecere cualquier sugerencia
Saludos.
Marcos

maxid
21-08-2008, 17:28:11
Usa un componente AdoConection y un ADODataSet, en la cadena de conexion pone todo esto y en source el archivo excel.

ADOConnection1.ConectionString:= Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=F:\Company\Solicitud\Solicitud.xls;Mode=Share Deny None;Extended Properties=Excel 8.0;Persist Security Info=False;Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password="";Jet OLEDB:Engine Type=35;Jet OLEDB:Database Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False


Tambien podes poner como una constante y con format(cte_cadenadeconxion,[farchivoexcel])
y trabajas como una tabla y grillas normal, incluso podes acceder a los campos con fieldbyname si sabes como se llaman de antemano.
Enlaza en el AdoConection con ADODataSet y en ADODataSet1.CommandText tenes las pestañas del archivo

ledesmarc
22-08-2008, 11:23:40
Muchas Gracias por la Data, ahora lo pruebo..

Saludos

Rancy
15-09-2008, 11:00:18
Hola :)
Tengo un problema con el código que escribió Caro en la primera pagina (era el siguiente):

const
xlCellTypeLastCell = $0000000B;
var
Excel, Sheet: OLEVariant;
CantRow, CantCol, i, j : Integer;
RangoMatriz: Variant;
begin
FileName := 'C:\Archivo.xls';
Excel := CreateOleObject('Excel.Application');
Excel.Workbooks.Open(FileName);

Sheet := Excel.Workbooks[ExtractFileName(FileName)].WorkSheets[1];
Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;

CantRow := Excel.ActiveCell.Row;
CantCol := Excel.ActiveCell.Column;

RangoMatriz := Excel.Range['A1', Excel.Cells.Item[CantRow,CantCol]].Value;

for i:=1 to CantRow do
begin
for j:=1 to CantCol do
begin
Showmessage(RangoMatriz[i,j]);
//haces todo lo que necesites hacer
end;
end;//for


Concretamente mi problema esta en esta línea:
Excel := CreateOleObject('Excel.Application');

El error es Undeclared identifier 'CreateOleObject'

Además, a intervalos regulares me aparece el mensage de error:
Unable to cast object of type 'Borland.Delphi.VariantType' to type 'Borland.Delphi.Unit'

Y no se como solucionar ninguna de las dos cosas. Tal vez sea algo muy básico, ya que a los demas que han probado el código les ha funcionado perfectamente. Alguna idea de por dónde puede ir el error?

Mi intención es leer el documento excel para luego ir guardando la información listada. Uso delphi 2007, por si es de utilidad saberlo.
Sinceramente estoy bastante perdido.

Gracias por adelantado. :)

Rancy
15-09-2008, 11:31:03
Ok, ya suponía que estaba cometiendo un error muy básico :D

Me faltaba completar los "uses"! Vaya noob estoy hecho.

Aunque el error:
Unable to cast object of type 'Borland.Delphi.VariantType' to type 'Borland.Delphi.Unit'

Sigue apareciendo... Es bastante molesto, aunque el código se compila sin problemas.

Si alguien sabe como puedo solucionarlo, se lo agradecería.

jejo1984
09-01-2012, 22:49:37
Hola que tal amigos espero que me puedan ayudar con lo siguiente:
Bueno quiero abrir un archivo excel en un stringgrid con Lazarus IDE encontre algo similar en este foro pero me marca un error les enseño el codigo:


unit cf_acceso;

{$mode objfpc}{$H+}

interface

uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Grids,
Buttons,comobj,variants;
........
procedure TForm1.BitBtn1Click(Sender: TObject);
const
xlCellTypeLastCell = $0000000B;
var
Excel, Sheet,Book: OLEVariant;
CantRow, CantCol, i, j : Integer;
RangoMatriz: Variant;
FileName:String;

begin
FileName:='C:\SISTEMAPLANILLAS\Libro2.xlsx';
try
Excel := CreateOleObject('Excel.Application');
Excel.Workbooks.Open(FileName);
ShowMessage(FileName);
Sheet := Excel.Workbooks[ExtractFileName(FileName)].WorkSheets[1];
Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;

CantRow := Excel.ActiveCell.Row;
CantCol := Excel.ActiveCell.Column;

RangoMatriz := Excel.Range['A1',Excel.Cells.Item[CantRow,CantCol]].Value;

for i:=1 to CantRow do
begin
for j:=1 to CantCol do
begin
Showmessage(RangoMatriz[i,j]);
//haces todo lo que necesites hacer
end;
end;//for
finally
Excel.Quit; //Aquí cerramos la hoja de Excel
end;
end;


Bien es en estas líneas de codigo en las que me aparece el error:


Sheet := Excel.Workbooks[ExtractFileName(FileName)].WorkSheets[1];


Error: Incompatible types: got "AnsiString" expected "LongInt"


Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;
RangoMatriz := Excel.Range['A1',Excel.Cells.Item[CantRow,CantCol]].Value;


Error: Incompatible types: got "Constant String" expected "LongInt"



Bueno intente esto:


Sheet := Excel.Workbooks[StrToInt(ExtractFileName(FileName))].WorkSheets[1];
Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;
RangoMatriz:=Excel.Range[StrToInt('A1'),Excel.Cells.Item[CantRow,CantCol]].Value;


Ejecuta normal pero al dar click en el boton aparece el mensaje:
El proyecto a lanzado una excepcion 'EOLeExceptionEOLeException' con el mensaje:
no se encontro "??????x.xlsx" Comprube ortografia y verificar si la ubicación es correcta.

La ruta es totalmente correcta pero no se lo que pasa por favor si me pueden ayudar con esto.
Gracias

Casimiro Notevi
09-01-2012, 23:10:31
Bienvenido a clubdelphi, ¿ya leiste nuestra guía de estilo (http://www.clubdelphi.com/foros/guiaestilo.php)?, gracias por tu colaboración.

http://neftali.clubdelphi.com/images/UtilizarTAGs.png

jejo1984
10-01-2012, 12:51:04
Ok Casimiro ya esta dame una sugerencia pues en que estoy fallando estoy usando Lazarus IDE

Casimiro Notevi
10-01-2012, 12:57:20
Mira si te sirve alguno de los enlaces de abajo de esta página, justo al final.

jejo1984
10-01-2012, 13:06:29
Lo estoy trabajando en lazarus IDE - windows xp y solo aparece esos errores y la verdad no logro solucionarlo =(

Casimiro Notevi
10-01-2012, 13:39:45
no se encontro "??????x.xlsx" Comprube ortografia y verificar si la ubicación es correcta.

Puede que la ruta que le has indicado no sea tan correcta.

jejo1984
10-01-2012, 13:51:31
La ruta es correcta la comprobe creo que el error marca por que le puse esto:
StrToInt(ExtractFileName(FileName))
Pero si quito StrToInt me marca lo siguiente:
Error: Incompatible types: got "AnsiString" expected "LongInt"

Casimiro Notevi
10-01-2012, 14:01:39
Evidentemente, no puedes convertir a integer un cadena de texto.

¿Y exactamente en qué línea es eso?, ¿has seguido el programa con del depurador?

jejo1984
10-01-2012, 15:21:43
Claro que si voy a pegar nuevamente el código y de color rojo las líneas donde aparece el error:
procedure TForm1.BitBtn1Click(Sender: TObject);
const
xlCellTypeLastCell = $0000000B;
var
Excel, Sheet,Book: OLEVariant;
CantRow, CantCol, i, j : Integer;
RangoMatriz: Variant;
FileName:String;

begin
FileName:='C:\SISTEMAPLANILLAS\Libro2.xlsx';
try
Excel := CreateOleObject('Excel.Application');
Excel.Workbooks.Open(FileName);
ShowMessage(FileName);
Sheet := Excel.Workbooks[ExtractFileName(FileName)].WorkSheets[1];
Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;

CantRow := Excel.ActiveCell.Row;
CantCol := Excel.ActiveCell.Column;

RangoMatriz := Excel.Range['A1',Excel.Cells.Item[CantRow,CantCol]].Value;

for i:=1 to CantRow do
begin
for j:=1 to CantCol do
begin
Showmessage(RangoMatriz[i,j]);
//haces todo lo que necesites hacer
end;
end;//for
finally
Excel.Quit; //Aquí cerramos la hoja de Excel
end;
end;

Como comente le agregue StrToInt funca normal pero ya se perdería pues por que ya pasa a integer.
Como podre solucionarlo...

jejo1984
10-01-2012, 15:29:03
Las variables que utilizo:
const
xlCellTypeLastCell = $0000000B;
var
Excel, Sheet,Book: OLEVariant;
CantRow, CantCol, i, j : Integer;
RangoMatriz: Variant;
FileName:String;

La primera línea en que me marca lo siguiente:
Sheet := Excel.Workbooks[ExtractFileName(FileName)].WorkSheets[1];
Error: Incompatible types: got "AnsiString" expected "LongInt"

La segunda igual:
RangoMatriz := Excel.Range['A1',Excel.Cells.Item[CantRow,CantCol]].Value;
Error: Incompatible types: got "Constant String" expected "LongInt"


Pienso que el error es por:
ExtractFileName(FileName) y 'A1'

jejo1984
16-01-2012, 13:58:36
Hola de nuevo alguien que me pueda decir en que estoy errando no quiero usar otro componente por que la verdad se que se puedo hacer lo que quiero yo

roman
16-01-2012, 18:25:00
Quizá no seas tú quien yerre sino Lázarus o FP. Un código similar al que pones corre sin problemas en Delphi, pero parece que FPC no acepta que los índices sean cadenas de caracteres.

El primer error podrías solventarlo usando un índice numérico en lugar del nombre para obtener una referencia al libro:


Sheet := Excel.Workbooks[1].WorkSheets[1];


El segundo error no veo como pues no habría un equivalente numérico al índice 'A1'. Pero puedes intentar poniendo:


var
Celda: OleVariant;
...

begin
...
Celda := 'A1';
RangoMatriz := Excel.Range[Celda, Excel.Cells.Item[CantRow,CantCol]].Value;


Digo, no sé si funcione, pero nada se pierde con intentar.

// Saludos

jejo1984
16-01-2012, 18:50:53
Roman usted si que es bueno =)
ahora me aparece un error en esta línea:
var
Excel,celda,Sheet: OLEVariant;
CantRow, CantCol, i, j : Integer;
RangoMatriz,FileName: Variant;
//FileName:String;

begin
FileName:='C:\SISTEMAPLANILLAS\Libro2.xlsx';
try
Excel := CreateOleObject('Excel.Application');
Excel.Workbooks.Open(FileName);
ShowMessage(FileName);
Sheet := Excel.Workbooks[1].WorkSheets[1];

y marca este error:
Invalid argument:Dispatch

jejo1984
16-01-2012, 18:52:07
El error dice:
Invalid argument: Dispatch
y señala a esta línea:
Sheet := Excel.Workbooks[1].WorkSheets[1];

roman
17-01-2012, 18:35:42
Hola,

Tal parece que esto es una falla de FPC (http://bugs.freepascal.org/view.php?id=20778). En este mismo enlace mencionan que el problema se ha resuelto con versiones posteriores, pero parece que no es tan sencillo hacer que la última versión estable de Lázarus trabaje con otra versión de FPC que no sea la 2.4.x. Sin embargo, ahí mismo menciona una versión "snapshot" (http://www.hu.freepascal.org/lazarus/) de Lázarus que utiliza la versión 2.5.1 de FPC.

Instalando esa, he podido ejecutar correctamente un código similar:


const
xlCellTypeLastCell = $0000000B;

var
Excel, Hoja, Rango: OleVariant;
NumFilas, NumColumnas: Integer;

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

try
Excel.Workbooks.Open('c:\ruta\al\archivo.xlsx');
Hoja := Excel.Workbooks[1].Worksheets[1];
Hoja.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;
NumFilas := Excel.ActiveCell.Row;
NumColumnas := Excel.ActiveCell.Column;
Rango := Excel.Range['A1', Excel.Cells.Item[NumFilas, NumColumnas]].Value;

Showmessage(Rango[1, 1]);
finally
Excel.Quit;
end;
end;


// Saludos

Chaja
12-03-2012, 05:33:57
Roman: Hola... te escribo por que estaba buscadno un tema con referencia a la importacion de datos desde excel, y me encuentro con un tema. Usa la forma de hacerlos con los ADO comp. uso como se ha explicado en el foro y todo eso y se hace bien. todo bien, hasta que me sucede lo siguiente. No se por que algunos valors de la tabla de excel me los trae vacios, concretamenete los que son valores enteros, como controlo eso? la hoja de excel es:
5588/1 Pelota Futbol CLUB 42.00
5589/1 Pelota Futbol Master 42.00
5589/2 Pelota Master Color 42.00
11 Pelota Fox Nº 4 52.00
17 Arco Futbol 1.83 x 1.22 x.60 149.00
17/A Arco Futbol 2.40 x 1.52 x 0.90 239.00
17/B Arco Futbol 3.02 x 2.07 x 1.18 349.00
18 Pelota Futsala Pro cosida 54.00
20 Silbato fox 40 striker 9.90
21 Collarines x 12 Unidades 18.90
22 Silbato fox 40 dolfin 18.90
23 Silbato Fox Micro C/C 24.90
24 Silbato Fox 40 classic 21.90
24D Silbato Fox 40 clasicc color surt x12 262.00
25 Silbato Fox 40 Pearl 11.90
26 Silbato Fox 40 con cronometro 139.00
27 Silbato fox Shark c/collarin 29.90
28 Collarin Fox x12 69.00

por ejemplo los codigo 11 17 24 25 26 27 28 no me levanta los datos , si el resto pero esos valores no. Para que lo haga debo ir al excel y editar uno por uno para que sea un texto. si son poco no pasa nada, pero como debo importar mas de 1000 lineas se complica.
Alguna sugerencia?

Gracias

Luis Roldan
Mar del Plata
Argentina

Jetzuvely21
18-05-2012, 16:55:58
Hola Jejo, ¿Pudiste solucionar tu problema?. Al parecer solo tienes que indicar la ruta del archivo, el nombre del archivo no.Por eso es que te marca que la ruta está mal. Posteriormente luego seleccionas tu archivo y lo abres.Bueno a mi me resultó asi.

Saludos!

Anel Hernandez
18-10-2012, 13:38:14
Hola,

he tratado de correr el ejemplo de Caro y me da error en la linea:
Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;

el error dice 'Error en el metodo Activate de la clase range'.

Si quito la linea, entonces CantRow y CantCol me dan 1 y 1 respectivamente. Que debo hacer?

gracias