Se você estiver desenvolvendo em C / C ++ qualquer software para operadores (administradores) de hospitais, lojas, serviços de aluguel de scooter giroscópio, serviços de reparo de telefones celulares, provavelmente terá a tarefa de criar relatórios para imprimi-los em uma impressora ou, pelo menos, em PDF. Existem muitos pacotes de terceiros para o Embarcadero RAD Studio que permitem fazer isso. Como FastReport, QuickReport, Crystal Reports, etc. Mas, na minha opinião, todos esses pacotes exigem uma profunda compreensão de seus mecanismos e interfaces. Leva muito tempo para estudá-los e, o mais importante, o código para gerar até o relatório mais simples consistirá em um grande número de linhas. Quando encontrei a tarefa de gerar relatórios pela primeira vez em C / C ++, comecei com o FastReport e percebi que absolutamente não gostava dessa ferramenta.
Nesse exato momento, um pensamento maravilhoso veio à minha mente: como seria legal pegar um arquivo EXCEL simples, adicionar informações estáticas e formatá-lo para atender às suas necessidades. O programa abrirá apenas esse arquivo, preenchê-lo com dados dinâmicos e salvar ou enviar para impressão! Isso serviu como ponto de partida para meu estudo do mecanismo OLE para trabalhar com arquivos do MS Office de programas desenvolvidos no Embarcadero RAD Studio.
No decorrer da minha atividade, consegui me aprofundar o suficiente no assunto e agora posso dizer com confiança que todas as ferramentas fornecidas pelo MS Office e OLE fornecem todas as minhas necessidades de relatórios. Bem, se sim, então provavelmente para outros desenvolvedores seria uma ferramenta auto-suficiente, simples e conveniente. Portanto, foi decidido escrever uma DLL e incluir nela uma lista de todas as funções usadas no MS Excel que você encontra durante a criação dos documentos do Excel. Isso é muito conveniente, pois para criar um relatório, você não precisa estudar vários manuais ou OLE. Tudo o que é necessário é apenas carregar a DLL e suas funções. Bem, muitos são capazes de trabalhar com DLLs.
Aqui está o site do projeto em si .
No site do projeto, o mecanismo para trabalhar com DLLs é descrito em detalhes suficientes; há um exemplo e uma descrição de todas as funções.
A DLL vem sem um arquivo de cabeçalho e sem uma biblioteca LIB estática. Portanto, a DLL deve ser conectada dinamicamente usando a função LoadLibrary. O arquivo ZIP com a biblioteca inclui os seguintes arquivos:
- " light_report.dll " - a própria biblioteca de DLL;
- " DLLTest.cpp " - um exemplo de uso da biblioteca;
- " LPDLL.h " - o arquivo de cabeçalho para um exemplo de uso da biblioteca (este não é o arquivo de cabeçalho da DLL);
- " Report.xlsx " - documento do Microsoft Excel para um exemplo de uso da biblioteca.
O arquivo de cabeçalho para o exemplo de uso da biblioteca
LPDLL.h contém as seguintes declarações:
- enumerações usadas como argumentos para funções DLL;
- tipos de funções DLL;
- Instâncias de função DLL
- Descritor de download da DLL (" HINSTANCE DLL_Handle; ");
- função LoadLightReportDLL , que carrega dinamicamente a DLL e todas as suas funções;
- Função FreeLightReportDLL que descarrega a DLL.
O arquivo
LPDLL.h já contém tudo o que você precisa para trabalhar com a DLL e suas funções. Mas você também pode editá-lo ou levar apenas o mais necessário para o seu projeto.
Imagine que você acabou de conectar o arquivo de cabeçalho
“LPDLL.h” ao seu projeto.
Então, no próprio projeto, você só precisa:
1) Declare um identificador variável para o seu relatório:
Variant report;
2) Carregue dinamicamente a DLL e todas as suas funções:
if(!LoadLightReportDLL("C:\\LightReport\\light_report.dll"))return;
3) Em seguida, na construção try-catch, abra o modelo de relatório preparado (arquivo do MS Excel):
report=OpenReport("C:\\LightReport\\Report.xlsx",0);
4) Adicione alguns dados ao relatório:
WriteCell(report, "Sheet1", 9, 1, "Hello world!");
...
5) Salve o arquivo ou imprima:
Save(report); SaveAs(report, "C:\\LightReport\\Report copy.xlsx"); ExportToPDF(report, "C:\\LightReport\\Report.pdf", false); PrintOut(report);
6) Feche o arquivo:
CloseReport(report);
7) Descarregue a biblioteca DLL:
FreeLightReportDLL();
E é isso aí! Absolutamente nada mais! Há apenas uma ressalva, mas mesmo assim, ela aparece apenas durante a depuração. Em um aplicativo funcional, tudo funcionará bem. Quero dizer uma situação em que há algum tipo de erro ao trabalhar com um relatório. O fato é que o mecanismo OLE para trabalhar com documentos envolve apenas exceções quando ocorrem erros. É por isso que, ao trabalhar com funções DLL, você deve usar a construção try-catch. No bloco catch, você deve fechar o relatório sem salvar:
catch(...){CloseReport(report);}
.
Ao depurar, quando ocorre um erro, você pode parar o programa. Nesse caso, o processo do MS Excel permanecerá em execução e será possível fechá-lo apenas através do gerenciador de tarefas. Portanto, quando você depura repetidamente o aplicativo, várias instâncias do processo do MS Excel podem ser iniciadas, dependendo da frequência com que você pausa o programa quando ocorre um erro, sem aguardar a execução do código na captura. Isso deve ser monitorado.
Na versão, se ocorrer um erro, o código especificado no bloco catch definitivamente funcionará, o relatório será fechado e o processo do MS Excel será concluído. Nenhum processo do MS Excel suspenso no sistema será observado. Mas ainda assim eles tentam escrever código sem erros, então espero que você não tenha essa situação em um aplicativo em execução.
Por fim, você precisa adicionar:
- A DLL usa tipos de dados independentes de plataforma, como curto não assinado, longo não assinado e char . Isso é compreensível.
- O exemplo está escrito no ambiente do Embarcadero Builder C ++ 10. Portanto, todo o código corresponde a esse ambiente e, talvez, você precise fazer algumas alterações no código de exemplo para fazer tudo funcionar em seu ambiente.
- O gargalo desta DLL é o uso do descritor de arquivo de relatório no formato Variant . Esse é um formato bastante específico e suspeito que possa ser difícil usar a biblioteca fora do Embarcadero RAD Studio. Honestamente, eu não verifiquei.
Portanto, no futuro, está planejado empacotar toda a funcionalidade em uma classe e ocultar esse formato
Variant dentro da classe, para que apenas os formatos C / C ++ geralmente aceitos sejam fornecidos ao usuário. Eu nunca tentei empacotar classes em DLLs, li que as dificuldades necessariamente surgirão com isso. No entanto, vamos entender! Enquanto isso, obrigado por sua atenção, ficarei muito feliz se este artigo e a DLL ajudarem alguém.
Link para o projeto .