TStrings como parâmetro
Boa tarde,
Vi aqui no fórum uma procedure criada pelo usuário Web_Junior para fazer a exportação dos dados de um dataset para o excel. Os parâmetros da função são:
ParaExcel(DataSet1: TDataSet; Campos: TStrings; NomPlan: String; NovaPasta: Boolean);
Ao chamar a procedure conforme descrito abaixo, a planilha é gerada mas somente o primeiro campo do dataset é exportado. Fazendo o debug percebi que a procedure chama sempre o mesmo campo mesmo que contador esteja funcionando.
ParaExcel(Query1,lista,´teste3´,False);
onde lista é uma TStringlist.
Segue abaixo a procedure criada pelo Web_Junior:
procedure ParaExcel(DataSet1: TDataSet; Campos: TStrings; NomPlan: String; NovaPasta: Boolean);
var
i, x, j: integer;
XLApp: variant;
Workbook: variant;
WorkSheet: variant;
ContPlan: integer;
begin
{Se a planilha não tiver um nome, será criado um padrão}
if (NomPlan = ´´) then
NomPlan := ´Plan´;
if VarIsEmpty(XLApp) then
{cria um acesso ao Excel, ou uma nova aplicação Excel}
XLApp:= CreateOleObject(´Excel.Application´);
{não há nenhuma pasta ou deseja criar uma nova }
if (XLApp.Workbooks.Count = 0) or NovaPasta then
begin
{cria uma nova pasta com uma planilha}
WorkBook := XLApp.Workbooks.Add(xlWBatWorkSheet);
{definicao da planilha}
WorkSheet := Workbook.WorkSheets[1];
end
else
WorkSheet :=
Workbook.Worksheets.Add(,Workbook.WorkSheets[Workbook.WorkSheets.Count],
1,xlWorkSheet);
Inc(ContPlan);
WorkSheet.Name := NomPlan + IntToStr(ContPlan);
{torna o Excel visivel}
XLApp.Visible := True;
{insere um cabecalho na planilha}
[color=red:e1a4641515]for x := 0 to Campos.Count - 1 do[/color:e1a4641515]
begin
[color=red:e1a4641515]j := integer(Campos.Objects[x]);[/color:e1a4641515]
WorkSheet.Cells[1, x + 1].Font.Bold := True; {coloca o cabecalho em negrito}
WorkSheet.Cells[1, x + 1] := DataSet1.Fields[j].DisplayName;
if Length(DataSet1.Fields[j].DisplayName) < DataSet1.Fields[j].DisplayWidth then
WorkSheet.Columns[x + 1].ColumnWidth := DataSet1.Fields[j].DisplayWidth
else
WorkSheet.Columns[x + 1].ColumnWidth := Length(DataSet1.Fields[j].DisplayName);
end;
i := 1;
DataSet1.First;
{insere dados da tabela para a planilha}
while not DataSet1.Eof do
begin
Inc(i);
for x := 0 to Campos.Count - 1 do
begin
j := integer(Campos.Objects[x]);
WorkSheet.Cells[i, x + 1] := DataSet1.Fields[j].AsString;
end;
DataSet1.Next;
end;
end;
Alguém sabe o que pode estar errado, é a chamada da procedure?
Obrigado
Airton
Vi aqui no fórum uma procedure criada pelo usuário Web_Junior para fazer a exportação dos dados de um dataset para o excel. Os parâmetros da função são:
ParaExcel(DataSet1: TDataSet; Campos: TStrings; NomPlan: String; NovaPasta: Boolean);
Ao chamar a procedure conforme descrito abaixo, a planilha é gerada mas somente o primeiro campo do dataset é exportado. Fazendo o debug percebi que a procedure chama sempre o mesmo campo mesmo que contador esteja funcionando.
ParaExcel(Query1,lista,´teste3´,False);
onde lista é uma TStringlist.
Segue abaixo a procedure criada pelo Web_Junior:
procedure ParaExcel(DataSet1: TDataSet; Campos: TStrings; NomPlan: String; NovaPasta: Boolean);
var
i, x, j: integer;
XLApp: variant;
Workbook: variant;
WorkSheet: variant;
ContPlan: integer;
begin
{Se a planilha não tiver um nome, será criado um padrão}
if (NomPlan = ´´) then
NomPlan := ´Plan´;
if VarIsEmpty(XLApp) then
{cria um acesso ao Excel, ou uma nova aplicação Excel}
XLApp:= CreateOleObject(´Excel.Application´);
{não há nenhuma pasta ou deseja criar uma nova }
if (XLApp.Workbooks.Count = 0) or NovaPasta then
begin
{cria uma nova pasta com uma planilha}
WorkBook := XLApp.Workbooks.Add(xlWBatWorkSheet);
{definicao da planilha}
WorkSheet := Workbook.WorkSheets[1];
end
else
WorkSheet :=
Workbook.Worksheets.Add(,Workbook.WorkSheets[Workbook.WorkSheets.Count],
1,xlWorkSheet);
Inc(ContPlan);
WorkSheet.Name := NomPlan + IntToStr(ContPlan);
{torna o Excel visivel}
XLApp.Visible := True;
{insere um cabecalho na planilha}
[color=red:e1a4641515]for x := 0 to Campos.Count - 1 do[/color:e1a4641515]
begin
[color=red:e1a4641515]j := integer(Campos.Objects[x]);[/color:e1a4641515]
WorkSheet.Cells[1, x + 1].Font.Bold := True; {coloca o cabecalho em negrito}
WorkSheet.Cells[1, x + 1] := DataSet1.Fields[j].DisplayName;
if Length(DataSet1.Fields[j].DisplayName) < DataSet1.Fields[j].DisplayWidth then
WorkSheet.Columns[x + 1].ColumnWidth := DataSet1.Fields[j].DisplayWidth
else
WorkSheet.Columns[x + 1].ColumnWidth := Length(DataSet1.Fields[j].DisplayName);
end;
i := 1;
DataSet1.First;
{insere dados da tabela para a planilha}
while not DataSet1.Eof do
begin
Inc(i);
for x := 0 to Campos.Count - 1 do
begin
j := integer(Campos.Objects[x]);
WorkSheet.Cells[i, x + 1] := DataSet1.Fields[j].AsString;
end;
DataSet1.Next;
end;
end;
Alguém sabe o que pode estar errado, é a chamada da procedure?
Obrigado
Airton
Airoosp
Curtidas 0
Respostas
Delphi32
06/12/2006
olhando rapidamente me parece correto...
como você está passando esse parâmetro. Campo é uma lista com os campos que você quer exportar, ou seja:
procedure Button1Click(Sender: TObject);
var s:TStrings;
begin
s := TStringList.Create;
s.Add(´MATRICULA´);
s.Add(´NOME´);
s.Add(´TELEFONE´);
ParaExcel(tblCadastro, s, ´Planilha´, True);
FreeAndNil(s);
end;
dá uma olhada aí...
t+!
como você está passando esse parâmetro. Campo é uma lista com os campos que você quer exportar, ou seja:
procedure Button1Click(Sender: TObject);
var s:TStrings;
begin
s := TStringList.Create;
s.Add(´MATRICULA´);
s.Add(´NOME´);
s.Add(´TELEFONE´);
ParaExcel(tblCadastro, s, ´Planilha´, True);
FreeAndNil(s);
end;
dá uma olhada aí...
t+!
GOSTEI 0
Emerson Nascimento
06/12/2006
não sei porque o uso do Objetcs do stringlist, mas de qualquer forma, teste essa versão:
procedure ParaExcel(DataSet1: TDataSet; Campos: TStrings; NomPlan: String; NovaPasta: Boolean);
var
i, x, j: integer;
XLApp: variant;
Workbook: variant;
WorkSheet: variant;
ContPlan: integer;
Aux: string;
begin
{Se a planilha não tiver um nome, será criado um padrão}
if (NomPlan = ´´) then
NomPlan := ´Plan´;
if VarIsEmpty(XLApp) then
{cria um acesso ao Excel, ou uma nova aplicação Excel}
XLApp:= CreateOleObject(´Excel.Application´);
{não há nenhuma pasta ou deseja criar uma nova }
if (XLApp.Workbooks.Count = 0) or NovaPasta then
begin
{cria uma nova pasta com uma planilha}
WorkBook := XLApp.Workbooks.Add(xlWBatWorkSheet});
{definicao da planilha}
WorkSheet := Workbook.WorkSheets[Workbook.WorkSheets.Count-1];
end
else
WorkSheet :=
Workbook.Worksheets.Add(,Workbook.WorkSheets[Workbook.WorkSheets.Count],
1,xlWorkSheet);
Inc(ContPlan);
WorkSheet.Name := NomPlan + IntToStr(ContPlan);
{torna o Excel visivel}
XLApp.Visible := True;
{insere um cabecalho na planilha}
for x := 0 to Campos.Count - 1 do
begin
Aux := DataSet1.FieldByName( Campos[x] ).DisplayName;
j := DataSet1.FieldByName( Campos[x] ).DisplayWidth;
WorkSheet.Cells[1, x + 1].Font.Bold := True; {coloca o cabecalho em negrito}
WorkSheet.Cells[1, x + 1] := Aux;
if Length(Aux) < j then
WorkSheet.Columns[x + 1].ColumnWidth := j
else
WorkSheet.Columns[x + 1].ColumnWidth := Length(Aux);
end;
i := 1;
DataSet1.First;
{insere dados da tabela para a planilha}
while not DataSet1.Eof do
begin
Inc(i);
for x := 0 to Campos.Count - 1 do
WorkSheet.Cells[i, x + 1] := DataSet1.FieldByName( Campos[x] ).AsString;
DataSet1.Next;
end;
end;GOSTEI 0
Airoosp
06/12/2006
Bom dia,
Obrigado pela ajuda já consegui resolver o problema, com as dicas passadas por vocês.
Airton
Obrigado pela ajuda já consegui resolver o problema, com as dicas passadas por vocês.
Airton
GOSTEI 0