Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Leer hoja excel (https://www.clubdelphi.com/foros/showthread.php?t=96323)

Angel.Matilla 02-08-2023 11:47:36

Leer hoja excel
 
Gracias por la ayuda que me habéis dado en el hilo Abrir hoja/libro excel. Ahora me está ocurriendo una cosa muy curiosa.
Código:

TStringList *slExcel = new TStringList();
TStringList *slHoja  = new TStringList();

Variant Excel = CreateOleObject("Excel.Application");
ADOConnection->Close();
ADOConnection->Mode = cmRead;
ADOConnection->ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;User ID=admin; ...";
ADOConnection->Open();
slExcel->Sorted = true;
ADOConnection->GetTableNames(slExcel, false);

Esto me lo hace bien y me carga las hojas del libro en orden alfabético:
Cita:

slExcel->Text = "ABENOJAR$\r\nAGUDO$\r\n etc."
De hecho, si no pongo Sorted = true, hace la carga a su manera:
Cita:

slExcel->Text = "ALDEA DEL REY$\r\nCAMPO DE CRIPTANA$\r\nCIUDAD REAL$\r\n etc."
Sin embargo cada una de las hojas del libro tiene más o menos la misma estructura:
Cita:

Circunscripción | Codmun | Municipio | Mesa | Censo | Certif. Alta | Certif. Correc. | Censo total | Votos Electores | Votos Interventores | Votos Totales | Votos Nulos | Votos Blancos etc.
Con | he señalado las columnas. Para leerlas hago esto:
Código:

for (nItem = 0; nItem < slExcel->Count; nItem ++)
{
    slHoja->Sorted = false;
    fMenu->cGesElec->GetFieldNames(slExcel->Strings[nItem], slHoja);
    [...]
}

Y a pesar del Sorted = false, siempre me carga el TStringList en orden alfabético:
Cita:

Censo\r\nCenso total\r\nCertif. Alta\r\n etc.
Y por lo tanto luego, al leer las filas para alimentar la BB.DD. es un lío. ¿No hay forma de evitar que se ordenen las columnas?

Casimiro Notevi 02-08-2023 12:24:10

Ni idea, pero saca "slHoja->Sorted = false;" del bucle, ponlo antes.

Angel.Matilla 02-08-2023 12:30:53

Cita:

Empezado por Casimiro Notevi (Mensaje 552233)
Ni idea, pero saca "slHoja->Sorted = false;" del bucle, ponlo antes.

Da lo mismo.

Casimiro Notevi 02-08-2023 12:54:12

Hombre, lo mismo, lo mismo... no es, aunque el resultado pueda ser igual.
A lo mejor te interesa order=true, así al menos todos vendrán igual de ordenados.

Angel.Matilla 02-08-2023 13:40:39

El problema es que no todas las hojas tienen las mismas columnas. Las primeras, que son las que puse antes, sí son iguales para todas pero a partir de ahí varían de una hoja a otra. Seguiré dando vueltas, perola sugerencia de Sorted = true no se me había ocurrido.

Neftali [Germán.Estévez] 02-08-2023 14:37:03

Si los obtienes accediendo a la definición de los campos de la tabla, si que los obtienes en el orden en que están.

Código Delphi [-]
  ADOTable1.Close;
  ADOTable1.TableName := '[' + ListBox1.Items[ListBox1.ItemIndex] + ']';
  ADOTable1.Open;

  Memo2.Lines.Add('------------------------------------');

  for var I:integer := 0 to (ADOTable1.Fields.Count - 1) do
     Memo2.Lines.Add(ADOTable1.Fields[i].FieldName);
Es este código ListBox1.Items[ListBox1.ItemIndex] me da uno de los nombre de las tablas.






Los de arriba son con GetFieldNames y los segundos, recorriendo los Fields con el código anterior.

Angel.Matilla 03-08-2023 09:57:04

Gracias. Lo probaré.

Angel.Matilla 03-08-2023 10:25:27

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 552237)
Si los obtienes accediendo a la definición de los campos de la tabla, si que los obtienes en el orden en que están.

Código Delphi [-]
  ADOTable1.Close;
  ADOTable1.TableName := '[' + ListBox1.Items[ListBox1.ItemIndex] + ']';
  ADOTable1.Open;

  Memo2.Lines.Add('------------------------------------');

  for var I:integer := 0 to (ADOTable1.Fields.Count - 1) do
     Memo2.Lines.Add(ADOTable1.Fields[i].FieldName);

¡Perfecto! Muchas gracias. Lo que me ha llamado la atención es lo de los corchetes en el nombre de la tabla.

Neftali [Germán.Estévez] 03-08-2023 13:04:43

Cita:

Empezado por Angel.Matilla (Mensaje 552243)
¡Perfecto! Muchas gracias. Lo que me ha llamado la atención es lo de los corchetes en el nombre de la tabla.


Lo probé porque sino la mayoría de nombres de tablas daban error.
Probé con corchetes o comillas dobles y funcionó así.


Prueba y error vamos... :p:p


La franja horaria es GMT +2. Ahora son las 03:17:51.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi