PDA

Ver la Versión Completa : Stringrid a Excel


darkerbyte
21-02-2005, 23:38:27
Hola a todos.

Soy algo nuevo en delphi, asì que Espero que alguien me pueda ayudar con este problema:

Quiero exportar los datos de un StringGrid a un archivo de excel, he encontrado metodos para hacerlo pero lo hacen desde un Ttable o utilizando hojas de base de datos, pero lo unico que quiero es guardar los datos de mi string grid en un archivo de excel, no quiero mandar ni formato ni tipo ni nada, simplemente los datos en texto plano. Tambien me he dado cuenta que para ello tu versiòn de excel debe coincidir con la del server del programa, es cierto? de que manera se puede arreglar?

Alguien me puede dar alguna idea de como hacerlo o si tienen algun ejemplo sean tan amables de enviarmelo. Gracias de antemano.

Neftali [Germán.Estévez]
22-02-2005, 10:22:41
Creo que lo más fácil es que exportes el contenido del StringGrid a CSV (archivo separado por comas); Éstos ficheros se abren directamente desde Excel sin problemas (independientemente de la versión).

Ésta código guarda el contenido del StringGrid en el portapapeles, pero cambiando la última línea (1)/(2) se puede hacer que lo guarde en un fichero .CSV


var
i, j:Integer;
Str:String;
TS:TStrings;
begin
// Inicializamos
Str := '';
// Para cada línea de las selecciondas
for i := (StringGrid1.Selection.Top) to (StringGrid1.Selection.Bottom) do begin
// Si no es la 1ª linea, añadimos un salto de línea
if (i <> StringGrid1.Selection.Top) then begin
Str := Str + #13#10;
end;
// Para cada elemento dentro de la línea (celdas)
for j := 0 to (StringGrid1.Rows[i].Count - 1) do begin
// Si no es la primera celda, añadimos un separados
if (j <> 0) then begin
Str := Str + #9;
end;
// Construimos la cadena
Str := Str + StringGrid1.Rows[i].Strings[j];
end;

// (1) La guardamos en el clipboard (como texto)
Clipboard.AsText := Str
// (2) Para guardarloa fichero...
TS := TStringList.CReate()
TS.Text := Str;
TS.SAveToFile('c:\salida.csv');
TS.Free;
end;

darkerbyte
22-02-2005, 16:13:44
Gracias Neftalí por el ejemplo, lo probaré enseguida.

JefeNet
26-02-2005, 20:25:17
si, efectivamente pero debo aclarar que no es por coma (,) si no por punto y coma (;). Puedes crear un archivo txt conde cada columna este separada por ;
y luego le cambias la extencion a csv.

seria algo asi


1;2;3;4
5;6;7;8

en exel quedaria

1 2 3 4
5 6 7 8


suerte

roman
27-02-2005, 02:31:37
Para leerlo en Excel, además del punto y coma yo encerraría cada valor entre comillas dobles.

// Saludos

darkerbyte
16-03-2005, 02:28:52
Ya me habia dado cuenta que el formato CSV guardandolo con comas algunas veces se abria correctamente en Excel y algunas veces aparecian todos los datos en una sola columna :confused: , pero no pensè que fuera por eso. :D , ahora corregiré el probema.

Una vez mas agradezco a ustedes por su ayuda y sus consejos.

fmonte
22-03-2005, 23:09:13
Creo que lo más fácil es que exportes el contenido del StringGrid a CSV (archivo separado por comas); Éstos ficheros se abren directamente desde Excel sin problemas (independientemente de la versión).

Ésta código guarda el contenido del StringGrid en el portapapeles, pero cambiando la última línea (1)/(2) se puede hacer que lo guarde en un fichero .CSV


var
i, j:Integer;
Str:String;
TS:TStrings;
begin
// Inicializamos
Str := '';
// Para cada línea de las selecciondas
for i := (StringGrid1.Selection.Top) to (StringGrid1.Selection.Bottom) do begin
// Si no es la 1ª linea, añadimos un salto de línea
if (i <> StringGrid1.Selection.Top) then begin
Str := Str + #13#10;
end;
// Para cada elemento dentro de la línea (celdas)
for j := 0 to (StringGrid1.Rows[i].Count - 1) do begin
// Si no es la primera celda, añadimos un separados
if (j <> 0) then begin
Str := Str + #9;
end;
// Construimos la cadena
Str := Str + StringGrid1.Rows[i].Strings[j];
end;

// (1) La guardamos en el clipboard (como texto)
Clipboard.AsText := Str
// (2) Para guardarloa fichero...
TS := TStringList.CReate()
TS.Text := Str;
TS.SAveToFile('c:\salida.csv');
TS.Free;
end;

excelente codigo, justo lo q estaba buscando! muchisimas gracias!

sebamora
29-11-2006, 01:41:27
aqui hay un codigo q pasa de un stringgrid a excel xo necesita tener el excel instalado, aunque ni cuenta te das q lo usa :D

procedure tform1.guardar(archivo:string);
var
celi,celj:integer;
begin
try
try
ExcelSave.Connect;
ExcelWB2.ConnectTo(ExcelSave.Workbooks.Add(EmptyParam,0));
ExcelWS2.ConnectTo(ExcelWB2.Worksheets[1] as _Worksheet);
stringgrid1.Visible:=false;
progressbar1.Visible:=true;
progressbar1.Min:=1;
progressbar1.Position:=1;
progressbar1.Max:=stringgrid1.ColCount*stringgrid1.RowCount;
for celi:=1 to stringgrid1.ColCount do
begin
for celj:=1 to stringgrid1.RowCount do
begin
progressbar1.Position:=progressbar1.Position+1;
ExcelWS2.Cells.Item[celj,celi].NumberFormat:='@';// formato de texto
ExcelWS2.Cells.Item[celj,celi].value:=stringgrid1.Cells[celi, celj];
end;
end;
ExcelWB2.SaveAs(archivo, //nombre para guardar (string)
xlNormal,'','',
EmptyParam,EmptyParam,0, EmptyParam, EmptyParam, EmptyParam,EmptyParam,
EmptyParam,0);
stringgrid1.Visible:=true;
progressbar1.Visible:=false;
except
Application.MessageBox('Error al guardar el archivo','Alerta',MB_ICONWARNING);
end;
Finally
ExcelWB2.Close;
ExcelSave.Quit;
ExcelWS2.Disconnect;
ExcelWB2.Disconnect;
ExcelSave.Disconnect;
end;
end;


donde insertamos los sgtes componentes en el form:

ExcelSave: TExcelApplication;
ExcelWB2: TExcelWorkbook;
ExcelWS2: TExcelWorksheet;
ProgressBar1: TProgressBar;
StringGrid1: TStringGrid;

Neftali [Germán.Estévez]
29-11-2006, 11:26:32
sebamora, utiliza TAG's (http://neftali.clubdelphi.com/images/ResaltarSintaxisDelphi.png) cuando escribas código Delphi, Verás como mejora bastante.
Puedes editar tu mensaje anterior y probarlo.

sebamora
29-11-2006, 19:56:23
hola neftali perodon por no poner tags, no tenia idea, aqui va el mismo ejemplo con tags para ver como sale. sds


procedure tform1.guardar(archivo:string);
var
celi,celj:integer;
begin
try
try
ExcelSave.Connect;
ExcelWB2.ConnectTo(ExcelSave.Workbooks.Add(EmptyParam,0));
ExcelWS2.ConnectTo(ExcelWB2.Worksheets[1] as _Worksheet);
stringgrid1.Visible:=false;
progressbar1.Visible:=true;
progressbar1.Min:=1;
progressbar1.Position:=1;
progressbar1.Max:=stringgrid1.ColCount*stringgrid1.RowCount;
for celi:=1 to stringgrid1.ColCount do
begin
for celj:=1 to stringgrid1.RowCount do
begin
progressbar1.Position:=progressbar1.Position+1;
ExcelWS2.Cells.Item[celj,celi].NumberFormat:='@';// formato de texto
ExcelWS2.Cells.Item[celj,celi].value:=stringgrid1.Cells[celi, celj];
end;
end;
ExcelWB2.SaveAs(archivo, //nombre para guardar (string)
xlNormal,'','',
EmptyParam,EmptyParam,0, EmptyParam, EmptyParam, EmptyParam,EmptyParam,
EmptyParam,0);
stringgrid1.Visible:=true;
progressbar1.Visible:=false;
except
Application.MessageBox('Error al guardar el archivo','Alerta',MB_ICONWARNING);
end;
Finally
ExcelWB2.Close;
ExcelSave.Quit;
ExcelWS2.Disconnect;
ExcelWB2.Disconnect;
ExcelSave.Disconnect;
end;
end;





donde insertamos los sgtes componentes en el form:


ExcelSave: TExcelApplication;
ExcelWB2: TExcelWorkbook;
ExcelWS2: TExcelWorksheet;
ProgressBar1: TProgressBar;
StringGrid1: TStringGrid;


P\D: si necesitan codigo para cargar desde excel a un stringgrid tambien tengo, solo avisen

abaigorria
02-01-2007, 16:29:59
"P\D: si necesitan codigo para cargar desde excel a un stringgrid tambien tengo, solo avisen"

Podrias postear este codigo, de cargar en un stringgrid un exel, disculp La molestias.

BlueSteel
25-09-2007, 16:58:39
Creo que lo más fácil es que exportes el contenido del StringGrid a CSV (archivo separado por comas); Éstos ficheros se abren directamente desde Excel sin problemas (independientemente de la versión).

Ésta código guarda el contenido del StringGrid en el portapapeles, pero cambiando la última línea (1)/(2) se puede hacer que lo guarde en un fichero .CSV




Hola Neftali. estaba revisando este codigo, funciona bien, pero tengo un pequeño inconveniente.. Mi StringGrid posee 3 filas y solo me almaceno 1 en el archivo .csv

tienes alguna idea de que pueda ser.. lo único que hice fue cambiar a la funcion en nombre de StringGrid1 por Grilla.... lo demás lo tengo todo igual...

Neftali [Germán.Estévez]
25-09-2007, 18:01:43
Mi StringGrid posee 3 filas y solo me almaceno 1 en el archivo .csv
tienes alguna idea de que pueda ser.. lo único que hice fue cambiar a la funcion en nombre de StringGrid1 por Grilla.... lo demás lo tengo todo igual...

Efectivamente.
Si te fijas el bucle for tiene lo siguiente:


for i := (StringGrid1.Selection.Top) to (StringGrid1.Selection.Bottom) do begin


Trabaja con las líneas seleccionadas. Haz la prueba seleccionando con el ratón las tres filas.
Si deseas que siempre exporte todo, utiliza la propiedad RowCount para recorrerlas todas.

BlueSteel
25-09-2007, 18:27:52
ya lo solucione...

tube que cambiar esto
for i := (StringGrid1.Selection.Top) to (StringGrid1.Selection.Bottom) do


por esto otro

For i := 0 to Grilla.RowCount-1 do

BlueSteel
25-09-2007, 18:30:23
Neftali

no me habia fijado que habias respondido.. y se me habia ocurrido cambiar esas lineas...

cual es el comando para que las columnas en vez de separarlas por espacio las separe por coma "," o por punto y coma... ";"

ando buscando las equivalencias.. por que supongo que el #9 equivale al espacio

ahh.. y se me olvidava.. estoy tratando de abrir el archivo en notepad desde delphi.. con el shellexecute.. pero como le digo que archivo es ?

tengo esto

Shellexecute(0, 'open', pchar('D:\Sistemas\BCI\Internet.csv'), '', '' , SW_Shownormal);
pero quiero decir que esto me lo abra por el Notepad y no por el Excel...

BlueSteel
25-09-2007, 22:29:02
ya pude abrir el archivo con el notepad...

lo hice así


Shellexecute(0, 'open', pchar('Notepad.exe'), pchar(' D:\Sistemas\BCI\Internet.csv'), '' , SW_Shownormal);


solo me falta saber como le pongo que en el archivo, las columnas sean separadas por punto y como ";"..

gracias

Neftali [Germán.Estévez]
26-09-2007, 10:54:37
solo me falta saber como le pongo que en el archivo, las columnas sean separadas por punto y como ";"

Creo que ese cambio es más sencillo que el anterior. Cambia lo que hay en rojo por el caracter que quieras utilizar como separador.


// Si no es la primera celda, añadimos un separados
if (j <> 0) then begin
Str := Str + CARACTER;
end;

BlueSteel
26-09-2007, 16:59:41
gracias.. ya lo habia intentado y me funciono bien... :p

Amneris
22-10-2007, 17:11:41
Hola!

Alguien tiene alguna solucion para editar y enviar datos a OpenOffice Calc. Sin q se requiera guardar el archivo.

Gracias.