Contato próximo entre Delphi e Excel [Wang Anpeng ([email protected]) 2002/4/14] Como um excelente RAD, a poderosa função de banco de dados do Delphi é um de seus recursos mais importantes, mas o controle QuickReport difícil de operar muitas vezes não consegue satisfazer as necessidades de relatórios do banco de dados. Se o seu relatório for muito complexo ou exigir flexibilidade nas alterações de formato, usar o Excel como servidor de relatório é uma boa opção. O componente Excel fornecido pelo Delphi a partir da versão 5 simplifica bastante a aplicação da tecnologia de automação OLE. Entretanto, a falta de arquivos de ajuda sempre foi o aspecto mais criticado do Delphi, e esses novos componentes não são exceção. Este artigo tenta apresentar isso com mais detalhes. O modelo de objeto do Excel é uma estrutura hierárquica em forma de árvore. A raiz é o próprio aplicativo WorkBook é o objeto de atributo do objeto raiz. detalhes, consulte o arquivo de ajuda do MSOffice VBA. Para controlar o Excel no Delphi, você deve primeiro estabelecer uma conexão com o programa servidor, abrir a pasta de trabalho, depois trocar dados com a planilha de destino e, por fim, desconectar. Abra a pasta de trabalho do Excel Nosso exemplo começa com um formulário principal com um TStringGrid (é claro que alguns dados precisam ser preenchidos) e dois botões Arraste um controle TExcelapplication da aba Servidores do painel de controle e coloque-o no formulário. Primeiro, defina ConnectKind como ckRunningOrNew, o que significa que se a instância do Excel em execução puder ser detectada, estabeleça contato com ela, caso contrário, inicie o Excel. Além disso, se desejar que o programa estabeleça contato com o programa servidor assim que for executado, você pode definir a propriedade AutoConnect como True. Para estabelecer contato com o Excel basta uma instrução: Excel Connect Talvez você tenha notado que existem vários outros controles do Excel na aba Servidores. Esses controles podem ser vinculados ao Excel anterior através do método ConnectTo: ExcelWorkbook1.ConnectTo(. Excel .ActiveWorkbook1.ConnectTo(Excel . ActiveSheet como _Worksheet2.ConnectTo(Excel . Worksheets.Item['Sheet2'] como); _Worksheet); Deve-se observar que a pasta de trabalho ou planilha correspondente deve ser aberta antes de usar o método ConnectTo. Além disso, esses controles não trarão conveniência adicional na maioria dos casos, por isso é melhor usar apenas um TExcelApplication. Uma vez estabelecido o contato com o servidor Excel, uma nova pasta de trabalho pode ser criada: var wkBook : _WorkBook : Integer; função O primeiro parâmetro é usado para definir o modelo usado para a nova pasta de trabalho. Você pode usar xlWBATChart, xlWBATEXcel4IntlMacroSheet, xlWBATExcel4MacroSheet ou xlWBATWorksheet constante, ou pode ser o nome de um arquivo xls existente. O EmptyParam aqui é a unidade Variants e a variável definida, o que significa usar o modelo universal padrão para criar uma nova pasta de trabalho. Se você abrir um documento xls existente, você deve passar o nome do arquivo a ser aberto como o primeiro parâmetro para a função Open: wkBook:=Excel.WorkBooks.Open(edtDesFile.text,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam , VazioParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,LCID); Você deve saber que todas as operações de dados são principalmente para a planilha ativa. Se você souber o nome da planilha, o número do índice pode ser substituído pelo nome da planilha: wkSheet:=wkBook.Sheets[1] as _WorkSheet Após concluir a troca de dados, você precisa salvar a pasta de trabalho: Excel.ActiveWorkBook.SaveAs; ('MyOutput', VazioParam, VazioParam, VazioParam, VazioParam, VazioParam, VazioParam, VazioParam, VazioParam, EmptyParam, EmptyParam, LCID); ou: Excel.ActiveWorkBook.Save(LCID); Por fim, feche a pasta de trabalho e desconecte do Excel: wkBook.Close(True, SaveAsName, EmptyParam, LCID); ; O método Close aqui contém a função salvar. O primeiro parâmetro indica se as modificações devem ser salvas antes de fechar a pasta de trabalho. O segundo parâmetro fornece o nome do arquivo a ser salvo. A segunda linha pede para encerrar o Excel. Troca de dados com a planilha Os dados de entrada são realizados em uma determinada célula ou intervalo da planilha ativa. O intervalo e as células são propriedades do objeto da planilha. Células é uma coleção de células. Se nenhum local específico for especificado, ela poderá representar todas as células da planilha inteira. No entanto, geralmente é usada para se referir a uma célula específica. representa a célula mais recente A1 no canto superior esquerdo. Observe que Item é a propriedade padrão de Células no VBA e pode ser omitida, mas não existe tal conveniência no Delphi. Para atribuir um valor a uma célula, você deve consultar sua propriedade Value. Nem é preciso dizer que esta propriedade é uma variável Variant, por exemplo: wkSheet.Cells.Item[1, 1].Value := 'Address Book'; Claro, você também pode atribuir um valor a uma célula. Especifique a fórmula: var AFormula:String …… AFormula:='=Rand()'; wkSheet.Range['F3','G6'].Value:=AFormula; O método acima é muito direto e simples, mas é muito lento e não adequado para relatórios grandes. Então, todos os dados podem ser transferidos para o Excel em sequência? Podemos usar Range. Este objeto representa uma área na planilha À medida que arrastamos com o mouse, geralmente é uma área retangular. Basta fornecer as posições de suas células no canto superior esquerdo e no canto inferior direito, como Range[ 'C3. ','J42']. Há um pequeno problema aqui, porque se os dados excederem 26 colunas (por exemplo, há 100 colunas) ou se o intervalo da área de destino precisar ser determinado rapidamente, será mais problemático usar nomes de caracteres para marcar células. Lembre-se de que como "C3" é o rótulo da célula, é claro que também podemos usar Células, como Range[Cells.Item[1,1], Cells.Item[100,100]]. É concebível que o valor de Range seja um array, mas você não deve usar Array no Delphi para atribuir um valor a ele! Lembre-se que no Delphi o valor de um objeto Excel é sempre do tipo Variant. var Dados: Variante Ir, ic: Inteiro …… Dados:= varArrayCreate([1,ir,1,ic],varVariant); elementos da matriz aqui com wkSheet do Range[cells.Item[3,1],cells.Item[ir+2,ic]].Value:=Datas; Deve-se observar que tanto a planilha quanto o Range possuem a propriedade Cells. Para maior clareza, a instrução with é usada aqui. Além disso, Range é direcional. Uma matriz unidimensional criada com VarArrayCreate só pode ser atribuída a um Range de linha única. Se você deseja definir um valor para um Range de coluna única, deve usar uma matriz bidimensional, por exemplo. exemplo: Datas:=VarArrayCreate([1,100,1 ,1], varVariant); A propósito, Cells.Item[] na verdade retorna um objeto Range. A recuperação de dados da planilha é basicamente o processo inverso de gravação de dados. O que precisa ser observado é como determinar o intervalo de dados da planilha: var ir, ic : Integer …… wkSheet.Cells.SpecialCells(xlCellTypeLastCell,EmptyParam; ).Ativar; ir := Excel.ActiveCell.Row ic := Excel.ActiveCell.Column; A função especial de célula SpecialCells é habilmente usada aqui para obter a última célula contendo dados. Edição de dados Abaixo estão dois exemplos de edição de dados. var DestRange: OleVariant; start DestRange := Excel.Range['C1', 'D4']; Excel.Range['A1', 'B4'].Copy(DestRange); Se você passar um parâmetro vazio para a função Copiar, os dados nesta área serão copiados para a área de transferência e poderão ser colados em outros locais usando o método Colar posteriormente. var WS: _Worksheet; …… Excel.Range['A1', 'B4'].Copy(EmptyParam); //Copia os dados de uma planilha para a área de transferência WS := Excel.Activesheet as _Worksheet; .Range['C1', 'D4'].Select;WS.Paste(EmptyParam, VazioParam, lcid); //Colar o conteúdo da área de transferência em uma nova planilha Configurações de formato Escolha Excel como servidor de relatório principalmente por causa de seus poderosos recursos de formatação. Primeiro mesclamos as células com o título "Catálogo de endereços" e o exibimos no centro e, em seguida, alteramos a fonte para "script oficial" de 18 pontos em negrito: com wkSheet.Range['A1','D1'],Font comece Merge(True ); //Mesclar células HorizontalAlignment:= xlCenter; Size:=18; Se o conteúdo da célula for longo, parte do conteúdo não será exibida. A abordagem usual é clicar duas vezes na borda direita da área selecionada para que a largura de cada coluna se adapte automaticamente ao comprimento do conteúdo. No Delphi, a largura da coluna e a altura da linha adaptativas também podem ser obtidas por meio do método AutoFit. Deve-se observar que este método só pode ser usado para a linha inteira e a coluna inteira, caso contrário, um erro de recusa de execução do método OLE será solicitado: wkSheet.Columns.EntireColumn.AutoFit; Os relatórios de estilo chinês geralmente exigem linhas de tabela com limite superior e inferior e você pode usar a propriedade da coleção Borders. Deve-se observar que os objetos de coleção no VBA geralmente possuem uma propriedade Item padrão, que não pode ser omitida no Delphi. A propriedade Peso é usada para definir a espessura das linhas da tabela: com Aname.RefersToRange,Borders começam HorizontalAlignment:= xlRight Item[xlInsideHorizontal]; .Peso: =xlFino; item[xlInsideVertical].Weight:=xlThin; A configuração da página e a configuração da página de impressão são definidas através da propriedade do objeto PageSetUp da planilha. Existem mais de 40 constantes de papel predefinidas no Excel VBA. Deve-se observar que algumas impressoras suportam apenas alguns tipos de papel. O atributo Orientação é utilizado para controlar a direção da impressão, e a constante paisagem = 2 indica impressão horizontal. As propriedades booleanas CenterHorizontally e CenterVertical são usadas para determinar se o conteúdo impresso está centralizado horizontal e verticalmente. com wkSheet.PageSetUp comece PaperSize:=xlPaperA4; //Tipo de papel A4 PRintTitleRows := 'A1:D1' //Repita esta linha/página LeftMargin:=18; 0,25" variará entre impressoras TopMargin:=36; //0,5" BottomMargin:=36; //0.5" CenterHorizontally:=True; Orientation:=1; //Impressão horizontal (paisagem)=2, retrato=1 end; Para imprimir um relatório, você pode chamar o método PrintOut da planilha. Este método definido pelo VBA tem um total de 8 parâmetros opcionais, os dois primeiros são usados para especificar as páginas inicial e final e o número de cópias a serem impressas no terceiro formato. No entanto, no Delphi, um parâmetro LCID é adicionado no final e EmptyParam. não pode ser usado para este parâmetro. Da mesma forma, o método de visualização de impressão PrintPreview não possui parâmetros no VBA, mas requer dois parâmetros quando chamado no Delphi. // wkBook.PrintPreview(True,LCID); //para visualizar wkSheet.PrintOut(EmptyParam,EmptyParam,1, EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,LCID); mais complexo, uma abordagem melhor é nomear intervalos de tabelas específicos e depois referenciá-los por nome. Names é uma propriedade de objeto de coleção de WorkBook, que possui um método Add que pode fazer esse trabalho. Var Aname: Excel2000.Name; VazioParam,VazioParam); O primeiro parâmetro da função Adicionar é o nome definido e o segundo parâmetro é o intervalo de células representado pelo nome. Deve-se observar que o tipo do nome do intervalo deve utilizar um qualificador. Se for utilizada uma biblioteca de tipos (D4), o qualificador é Excel_TLB. Além disso, o intervalo nomeado deve utilizar referência absoluta, ou seja, adicionar o símbolo “$”. Depois de nomear um intervalo, você pode referenciá-lo por esse nome. A linha de código a seguir faz com que o conteúdo do catálogo de endereços apareça em negrito: AName.RefersToRange.Font.Bold:=True Mas talvez o mais surpreendente seja que você pode dinamicamente; modifique programas de macro do Excel em Delphi! O código a seguir cria uma macro para nossa pasta de trabalho que registra a hora do último acesso ao fechar a pasta de trabalho: var LineNo: inteiro CM: CodeModule:String start CM := WkBook.VBProject.VBComponents.Item( 'ThisWorkbook'). Codemodule;LineNo := CM.CreateEventProc('BeforeClose', 'Pasta de trabalho'); SDate:='Data do último acesso:'+DateToStr(Date()); CM.InsertLines(LineNo + 1, ' Range("B2").Value = "'+sDate+''"'); a macro Adicione uma unidade à seção de usos anterior: VBIDE2000 Se uma biblioteca de tipos for usada, a unidade correspondente é VBIDE_TLB. A chave para este código é o objeto CodeModule Infelizmente, não há nenhum vestígio deste objeto no documento de ajuda do Excel VBA, portanto, só podemos pesquisar no MSDN. Delphi4 e versões anteriores Delphi4 não fornece o objeto TExcelApplication e uma biblioteca de tipos precisa ser introduzida para usar a tecnologia de automação OLE. A biblioteca de tipos do Excel97 é Excel8.olb. A principal diferença entre esses dois métodos é o método de estabelecer uma conexão com o programa servidor. A seguir está a estrutura do programa para controlar o Excel através da biblioteca de tipos: usa Windows, ComObj, ActiveX, Excel_TLB: _Application; ;Desconhecido:IUnknown; Resultado: HResult começar LCID := LOCALE_USER_DEFAULT := GetActiveObject(CLASS_Application, nil, Unknown); //Tenta capturar a instância do programa em execução if (Result = MK_E_UNAVAILABLE) then Excel := CoApplication.Create //Iniciar uma nova instância do programa senão começar {Verificar erros durante a chamada do método GetActiveObject} OleCheck(Result); (Unknown.QueryInterface(_Application, Excel)); end …… //Executa o processamento dos dados Excel.Visible[LCID] := True; // Excel.DisplayAlerts[LCID] := False; //Exibir caixa de diálogo de prompt Excel.Quit; o custo A velocidade de execução da parte exceto. Deve-se observar que a função que acompanha CoApplication e alguns nomes de constantes gerados por diferentes versões do Delphi podem ser diferentes, portanto, você deve verificar a biblioteca de tipos correspondente. Antes de chamar o método Quit, certifique-se de liberar todas as variáveis da pasta de trabalho e da planilha criadas no programa, caso contrário o Excel poderá residir na memória e ser executado (você pode pressionar Ctrl+Alt+Del para visualizar). Há um pequeno problema ao chamar GetActiveObject para capturar a instância do programa. Se o Excel estiver em um estado de execução minimizado, somente o quadro principal do programa poderá ser exibido e a área do usuário não estará visível. Além disso, se você não quiser introduzir uma biblioteca de tipos, também poderá usar a ligação lenta, mas é muito mais lenta. O exemplo a seguir declara uma variável Variant para representar o aplicativo Excel: var Excel: Variant; ... try Excel := GetActiveOleObject('Excel.Application'); .Visível := Verdadeiro; Ao usar a ligação lenta, o compilador não verifica o método do objeto Excel chamado, mas deixa essas tarefas para o programa do servidor concluir durante a execução. Dessa forma, um grande número de parâmetros padrão definidos pelo VBA (geralmente mais de uma dúzia) são. usados como deveriam funcionar, portanto, esse método tem um benefício inesperado - o código é conciso: var WBk, WS, SheetName: OleVariant; ') ;WS := WBk.Worksheets.Item['SheetName']; WS.Activate …… WBk.Close(SaveChanges := True); , apenas Você só pode fazer isso sozinho: const xlWBATWorksheet = -4167; Por fim, não esqueça de liberar as variáveis após fechar o Excel: Excel := Unassigned A seguir está o código fonte utilizado no exemplo deste artigo, passado em Delphi6+MSOffice2000; unidade Unit1; interface usa Windows, Mensagens, SysUtils, Variantes, Classes, Gráficos, Controles, Formulários, Diálogos, OleServer, Excel2000, Grids, StdCtrls; tipo TForm1 = class(TForm) Button1: TButton1: TStringGrid; procedimento FormActivate(Remetente: procedimento TObject); Button1Click (Sender: TObject); private { Declarações privadas } procedimento Write2Xls; procedimento procedimento CloseExl; procedimento NameSheet; ; implementação {$R *.dfm} usa VBIDE2000; wkSheet:_WorkSheet; Rows[1].CommaText:='Zhang San, masculino, 25.010-33775566'; Rows[2].CommaText:='Li Si, masculino, 47.012-6574906'; ,18.061-7557381'; Linhas[4].CommaText:='Sun Tao, feminino, 31,3324559'; fim do procedimento TForm1.OpenExl; , LCID); wkSheet:=wkBook.Sheets[1] como _WorkSheet fim; TForm1.Write2Xls; var Dados:Variante i,j:Integer; começar ir:=StringGrid1.RowCount; :=1 para ir fazer para j:=1 para ic fazer Datas[i,j]:=StringGrid1.Cells[j-1,i-1]; com wkSheet começa Activate(LCID); .Item[3,1],células.Item[ir+2,ic]].Value:=Dados; // Excel.Visible[LCID]:=True; Datas:=Procedimento final não atribuído TForm1.Retrieve; var Datas:Variant;Integer; =Excel.ActiveCell.Coluna; Datas:=Range[Cells.Item[1,1],Cells.Item[ir,ic]].Value; com StringGrid1 start ColCount:=ic; para ir-1 do for j:=0 para ic-1 do Cells[j,i]:=Datas[i+1,j+1]; Dados:=Não atribuído; fim do procedimento TForm1.CloseExl; const SaveAsName='test.xls'; Folha de Nome; começar AName:=wkBook.Names.Add('Livro de Endereços','=Planilha1!$A$3:$D$7',EmptyParam,EmptyParam, VazioParam,EmptyParam,EmptyParam,EmptyParam, VazioParam,EmptyParam,EmptyParam fim do procedimento TForm1); .AddFormula; var AFormula:String; AFormula:='=Rand()'; wkSheet.Range['F3','G6'].Value:=AFormula end; procedimento TForm1.Formats; Fonte do início Merge(True); //Mesclar células HorizontalAlignment:= xlCenter; Size:=18; FontStyle:=Negrito final wkSheet.Columns.EntireColumn.AutoFit; com Aname.RefersToRange,Borders start HorizontalAlignment:= xlRight; Item[xlInsideHorizontal].Peso:=xlThin; item[xlInsideVertical].Peso:=xlThin; início do procedimento TFOrm1.AddMacro; VBComponents.Item('ThisWorkbook').Codemodule LineNo; := CM.CreateEventProc('BeforeClose', 'Workbook'); SDate:='Data do último acesso:'+DateToStr(Date()); "'+sDate+'"'); end; procedimento TForm1.Printit; comece com wkSheet.PageSetUp comece PaperSize:=xlPaperA4; //Tipo de papel A4 PrintTitleRows := 'A1:D1'; //Repita esta linha/página LeftMargin:=18; TopMargin:=36; //0,5" BottomMargin:=36; //0,5" CentroHorizontalmente:=True; Orientação:=1; //Paisagem=2, retrato=1 end; ; comece a tentar OpenExl; NameSheet; PrintIt; AddMacro 2002/4/14] Delphi como uma excelente função de banco de dados; um de seus recursos mais importantes, mas o controle QuickReport, difícil de operar, muitas vezes não consegue atender às necessidades de relatórios de banco de dados. Se o seu relatório for muito complexo ou exigir flexibilidade nas alterações de formato, usar o Excel como servidor de relatório é uma boa opção. O componente Excel fornecido pelo Delphi a partir da versão 5 simplifica bastante a aplicação da tecnologia de automação OLE. Entretanto, a falta de arquivos de ajuda sempre foi o aspecto mais criticado do Delphi, e esses novos componentes não são exceção. Este artigo tenta apresentar isso com mais detalhes. O modelo de objeto do Excel é uma estrutura hierárquica em forma de árvore. A raiz é o próprio aplicativo WorkBook é o objeto de atributo do objeto raiz. detalhes, consulte o arquivo de ajuda do MSOffice VBA. Para controlar o Excel no Delphi, você deve primeiro estabelecer uma conexão com o programa servidor, abrir a pasta de trabalho, depois trocar dados com a planilha de destino e, por fim, desconectar. Abra a pasta de trabalho do Excel Nosso exemplo começa com um formulário principal com um TStringGrid (é claro que alguns dados precisam ser preenchidos) e dois botões Arraste um controle TExcelApplication da aba Servidores do painel de controle e coloque-o no formulário. Primeiro, defina ConnectKind como ckRunningOrNew, o que significa que se a instância do Excel em execução puder ser detectada, estabeleça contato com ela, caso contrário, inicie o Excel. Além disso, se desejar que o programa estabeleça contato com o programa servidor assim que for executado, você pode definir a propriedade AutoConnect como True. Para estabelecer contato com o Excel basta uma instrução: Excel Connect Talvez você tenha notado que existem vários outros controles do Excel na aba Servidores. Esses controles podem ser vinculados ao Excel anterior através do método ConnectTo: ExcelWorkbook1.ConnectTo(. Excel .ActiveWorkbook1.ConnectTo(Excel . ActiveSheet como _Worksheet2.ConnectTo(Excel . Worksheets.Item['Sheet2'] como); _Worksheet); Deve-se observar que a pasta de trabalho ou planilha correspondente deve ser aberta antes de usar o método ConnectTo. Além disso, esses controles não trarão conveniência adicional na maioria dos casos, por isso é melhor usar apenas um TExcelApplication. Uma vez estabelecido o contato com o servidor Excel, uma nova pasta de trabalho pode ser criada: var wkBook : _WorkBook : Integer; função O primeiro parâmetro é usado para definir o modelo usado para a nova pasta de trabalho. Você pode usar xlWBATChart, xlWBATEXcel4IntlMacroSheet, xlWBATExcel4MacroSheet ou xlWBATWorksheet constante, ou pode ser o nome de um arquivo xls existente. O EmptyParam aqui é a unidade Variants e a variável definida, o que significa usar o modelo universal padrão para criar uma nova pasta de trabalho. Se você abrir um documento xls existente, você deve passar o nome do arquivo a ser aberto como o primeiro parâmetro para a função Open: wkBook:=Excel.WorkBooks.Open(edtDesFile.text,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam , VazioParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,LCID); Você deve saber que todas as operações de dados são principalmente para a planilha ativa. Se você souber o nome da planilha, o número do índice pode ser substituído pelo nome da planilha: wkSheet:=wkBook.Sheets[1] as _WorkSheet Após concluir a troca de dados, você precisa salvar a pasta de trabalho: Excel.ActiveWorkBook.SaveAs; ('MyOutput', VazioParam, VazioParam, VazioParam, VazioParam, VazioParam, VazioParam, VazioParam, VazioParam, VazioParam, VazioParam, LCID); ou: Excel.ActiveWorkBook.Save(LCID); Por fim, feche a pasta de trabalho e desconecte do Excel: wkBook.Close(True, SaveAsName, VazioParam, LCID); ; O método Close aqui contém a função salvar. O primeiro parâmetro indica se as modificações devem ser salvas antes de fechar a pasta de trabalho. O segundo parâmetro fornece o nome do arquivo a ser salvo. A segunda linha pede para encerrar o Excel. Troca de dados com a planilha Os dados de entrada são realizados em uma determinada célula ou intervalo da planilha ativa. O intervalo e as células são propriedades do objeto da planilha. Células é uma coleção de células. Se nenhum local específico for especificado, ela poderá representar todas as células da planilha inteira. No entanto, geralmente é usada para se referir a uma célula específica. representa a célula mais recente A1 no canto superior esquerdo. Observe que Item é a propriedade padrão de Células no VBA e pode ser omitida, mas não existe tal conveniência no Delphi. Para atribuir um valor a uma célula, você deve consultar sua propriedade Value. Nem é preciso dizer que esta propriedade é uma variável Variant, por exemplo: wkSheet.Cells.Item[1, 1].Value := 'Address Book'; Claro, você também pode atribuir um valor a uma célula. Especifique a fórmula: var AFormula:String …… AFormula:='=Rand()'; wkSheet.Range['F3','G6'].Value:=AFormula; O método acima é muito direto e simples, mas é muito lento e não adequado para relatórios grandes. Então, todos os dados podem ser transferidos para o Excel em sequência? Podemos usar Range. Este objeto representa uma área na planilha À medida que arrastamos com o mouse, geralmente é uma área retangular. Basta fornecer as posições de suas células no canto superior esquerdo e no canto inferior direito, como Range[ 'C3. ','J42']. Há um pequeno problema aqui, porque se os dados excederem 26 colunas (por exemplo, há 100 colunas) ou se o intervalo da área de destino precisar ser determinado rapidamente, será mais problemático usar nomes de caracteres para marcar células. Lembre-se de que como "C3" é o rótulo da célula, é claro que também podemos usar Células, como Range[Cells.Item[1,1], Cells.Item[100,100]]. É concebível que o valor de Range seja um array, mas você não deve usar Array no Delphi para atribuir um valor a ele! Lembre-se que no Delphi o valor de um objeto Excel é sempre do tipo Variant. var Dados: Variante Ir, ic: Inteiro …… Dados:= varArrayCreate([1,ir,1,ic],varVariant); elementos da matriz aqui com wkSheet do Range[cells.Item[3,1],cells.Item[ir+2,ic]].Value:=Datas; Deve-se observar que tanto a planilha quanto o Range possuem a propriedade Cells. Para maior clareza, a instrução with é usada aqui. Além disso, Range é direcional. Uma matriz unidimensional criada com VarArrayCreate só pode ser atribuída a um Range de linha única. Se você deseja definir um valor para um Range de coluna única, deve usar uma matriz bidimensional, por exemplo. exemplo: Datas:=VarArrayCreate([1,100,1 ,1], varVariant); A propósito, Cells.Item[] na verdade retorna um objeto Range. A recuperação de dados da planilha é basicamente o processo inverso de gravação de dados. O que precisa ser observado é como determinar o intervalo de dados da planilha: var ir, ic : Integer …… wkSheet.Cells.SpecialCells(xlCellTypeLastCell,EmptyParam; ).Ativar ; ir := Excel.ActiveCell.Row ic := Excel.ActiveCell.Column; A função especial de célula SpecialCells é habilmente usada aqui para obter a última célula contendo dados. Edição de dados Abaixo estão dois exemplos de edição de dados. var DestRange: OleVariant; start DestRange := Excel.Range['C1', 'D4']; Excel.Range['A1', 'B4'].Copy(DestRange); Se você passar um parâmetro vazio para a função Copiar, os dados nesta área serão copiados para a área de transferência e poderão ser colados em outros locais usando o método Colar posteriormente. var WS: _Worksheet; …… Excel.Range['A1', 'B4'].Copy(EmptyParam); //Copia os dados de uma planilha para a área de transferência WS := Excel.Activesheet as _Worksheet; .Range['C1', 'D4'].Select;WS.Paste(EmptyParam, VazioParam, lcid); //Colar o conteúdo da área de transferência em uma nova planilha Configurações de formato Escolha Excel como servidor de relatório principalmente por causa de seus poderosos recursos de formatação. Primeiro mesclamos as células com o título "Catálogo de endereços" e o exibimos no centro e, em seguida, alteramos a fonte para "script oficial" de 18 pontos em negrito: com wkSheet.Range['A1','D1'],Font comece Merge(True ); //Mesclar células HorizontalAlignment:= xlCenter; Name:='script oficial'; Se o conteúdo da célula for longo, parte do conteúdo não será exibida. A abordagem usual é clicar duas vezes na borda direita da área selecionada para que a largura de cada coluna se adapte automaticamente ao comprimento do conteúdo. No Delphi, a largura da coluna e a altura da linha adaptativas também podem ser obtidas por meio do método AutoFit. Deve-se observar que este método só pode ser usado para a linha inteira e a coluna inteira, caso contrário, um erro de recusa de execução do método OLE será solicitado: wkSheet.Columns.EntireColumn.AutoFit; Os relatórios de estilo chinês geralmente exigem linhas de tabela com limite superior e inferior e você pode usar a propriedade da coleção Borders. Deve-se observar que os objetos de coleção no VBA geralmente possuem uma propriedade Item padrão, que não pode ser omitida no Delphi. A propriedade Peso é usada para definir a espessura das linhas da tabela: com Aname.RefersToRange,Borders começam HorizontalAlignment:= xlRight Item[xlInsideHorizontal]; .Peso: =xlFino; item[xlInsideVertical].Weight:=xlThin; A configuração da página e a configuração da página de impressão são definidas através da propriedade do objeto PageSetUp da planilha. Existem mais de 40 constantes de papel predefinidas no Excel VBA. Deve-se observar que algumas impressoras suportam apenas alguns tipos de papel. O atributo Orientação é utilizado para controlar a direção da impressão, e a constante paisagem = 2 indica impressão horizontal. As propriedades booleanas CenterHorizontally e CenterVertical são usadas para determinar se o conteúdo impresso está centralizado horizontal e verticalmente. com wkSheet.PageSetUp comece PaperSize:=xlPaperA4; //Tipo de papel A4 PrintTitleRows := 'A1:D1' //Repita esta linha/página LeftMargin:=18; 0,25" variará entre impressoras TopMargin:=36; //0,5" BottomMargin:=36; CenterHorizontally:=True; Orientation:=1; //Impressão horizontal (paisagem)=2, retrato=1 end; parâmetros opcionais, os dois primeiros são usados para especificar as páginas inicial e final e o número de cópias impressas no terceiro formato. No entanto, no Delphi, um parâmetro LCID é adicionado no final e EmptyParam não pode ser usado para este parâmetro. . Da mesma forma, o método de visualização de impressão PrintPreview não possui parâmetros no VBA, mas requer dois parâmetros quando chamado no Delphi. // wkbook.printpreview (true, LCID); Mais complexo, uma abordagem melhor é nomear intervalos de tabela específicos e depois referenciá -los pelo nome. Nomes é uma propriedade de objeto de coleção da pasta de trabalho, que possui um método Add que pode fazer esse trabalho. Var aname: excel2000.name; EsvaziPPARAM, vazio); O primeiro parâmetro da função Add é o nome definido e o segundo parâmetro é o intervalo de células representado pelo nome. Deve -se notar que o tipo de nome do intervalo deve usar um qualificador. Além disso, o intervalo nomeado deve usar referência absoluta, ou seja, adicione o símbolo "$". Depois de nomear um intervalo, você pode fazer referência a esse nome. Modificar programas de macro do Excel em Delphi! O código a seguir cria uma macro para a nossa pasta de trabalho que registra o último tempo de acesso ao fechar a pasta de trabalho: VAR Lineno: Inteiro; Codemodule; Sdate: = Última data de acesso: '+datetostr (date ()); A macro Adicionar uma unidade à seção de usos anteriores: VBIDE2000. A chave para este código é o objeto CodEmodule. Delphi4 e versões anteriores Delphi4 não fornecem o objeto TexcelApplication, e uma biblioteca de tipos precisa ser introduzida para usar a tecnologia de automação OLE. A principal diferença entre esses dois métodos é o método de estabelecer uma conexão com o programa do servidor Desconhecido: Iunknown; Desconhecido); (Desconhecido.QueryInterface (_Application, Excel)); Verdadeiro; O custo da velocidade de execução da parte, exceto. Deve -se notar que a função que acompanha a coaplicação e alguns nomes constantes gerados por diferentes versões Delphi podem ser diferentes; portanto, você deve verificar a biblioteca de tipos correspondente. Antes de ligar para o método de saída, certifique -se de liberar todas as variáveis de pasta de trabalho e planilhas criadas no programa, caso contrário, o Excel pode residir na memória e executar (você pode pressionar Ctrl+Alt+Del para visualizar). Há um pequeno problema em chamar o FetActiveObject para capturar a instância do programa. Além disso, se você não deseja introduzir uma biblioteca de tipos, também pode usar a ligação atrasada, mas é muito mais lenta. O exemplo a seguir declara uma variável variante para representar o Excel Application: var Excel: Variant; .Visible: = true; Ao usar a ligação atrasada, o compilador não verifica o método do objeto Excel chamado, mas deixa essas tarefas para o programa de servidor para concluir durante a execução. Usados como deveriam. '); Ws : = Wbk.worksheets.item ['SheetName']; , apenas você pode fazer isso sozinho: const xlwbatworksheet = -4167; Por fim, não se esqueça de liberar as variáveis após o fechamento do Excel: Excel: = não atribuído; unidade de unidade1; Procedimento FormActivate (remetente: TOBJECT); Button1Click (Declarações implementação {$ r *.dfm} usa vbide2000; wksheet: _worksheet; Linhas [1] .Commatext: = 'Zhang San, masculino, 25.010-33375566'; , 18.061-7557381 '; Linhas [4] , LCID); TForm1.Write2xls; : = 1 para ir para j: = 1 para ic do Dados [i, j]: = StringGrid1.Cells [J-1, i-1]; .Item [3,1], Cells.item [IR+2, IC]. Dados: = Excel.activeCell.column; Dados: = intervalo [Cells.item [1,1], Cells.item [IR, IC] para IR-1 para J: = 0 a IC-1 DO células [j, i]: = dados [i+1, j+1]; Data: Nomeação; Aname: = wkbook.names.add ('Livro de endereços', 'Sheet1! $ A $ 3: $ D $ 7', esvaziamento, esvaziamento, esvaziamento, esvaziamento, esvaziamento, esvaziamento, esvaziamento, esvaziamento, esvaziamento, esvaziamento, esvaziamento, esvaziamento, esvaziamento); .Addformula; Aformula: = 'Rand ()'; Fonte Iniciar a mesclagem (verdadeira); FONTSTYLE: = BOLD; Item [XLIMIDADE VBComponents.item ('thisworkbook'). Codemodule; : = Cm.createventproc ('beforeClose', 'livro de trabalho'); "'+sdate+'" '); Pappersize: = xlpapera4; TopMargin: = 36; Orientação: = 1; Comece a tentar OpenExl; Nomeado;