易于在C / C ++中进行报告

如果您正在使用C / C ++开发用于医院,商店,陀螺踏板车租赁服务,手机维修服务的操作员(管理员)的任何软件,则您可能面临创建报告以将其打印在打印机上或至少以PDF格式打印的任务。 Embarcadero RAD Studio有许多第三方程序包,您可以通过它们执行此操作。 例如FastReport,QuickReport,Crystal Reports等。 但是我认为,所有这些软件包都需要对它们的机制和接口有深刻的理解。 研究它们需要花费很多时间,最重要的是,即使是最简单的报告,也要生成的代码将由大量的行组成。 当我第一次遇到用C / C ++生成报告的任务时,我从FastReport开始,意识到我绝对不喜欢这个工具。

此时此刻,我想到了一个奇妙的想法:制作一个简单的EXCEL文件,向其中添加静态信息并对其进行格式设置以满足您的需求将是多么酷。 该程序只会打开该文件,将其填充动态数据,然后保存或发送至打印! 这是我研究使用Embarcadero RAD Studio开发的程序处理MS Office文件的OLE机制的起点。

在我的活动过程中,我设法深入探讨了该主题,现在我可以自信地说MS Office和OLE提供的所有工具都可以满足我的所有报告需求。 好吧,如果是这样,那么对于其他开发人员来说,它可能是一个自给自足,简单易用的工具。 因此,决定编写一个DLL,并将在创建Excel文档期间遇到的所有常用MS Excel函数的列表打包到其中。 这非常方便,因为为了创建报告,您无需学习一堆手册或OLE。 只需加载DLL及其功能即可。 好吧,许多人都可以使用DLL。

这是项目本身的站点

在项目站点上,对使用DLL的机制进行了足够详细的描述;其中包含所有功能的示例和说明。

DLL没有头文件,也没有静态LIB库。 因此,必须使用LoadLibrary函数动态连接DLL。 该库的ZIP归档文件包含以下文件:

  • light_report.dll ”-DLL库本身;
  • DLLTest.cpp ”-使用该库的示例;
  • LPDLL.h ”-使用该库的示例的头文件(这不是DLL的头文件);
  • Report.xlsx ”-使用该库的示例的MS EXCEL文档。

LPDLL.h库用法示例的头文件包含以下声明:

  • 用作DLL函数参数的枚举;
  • DLL函数的类型;
  • DLL函数实例
  • DLL下载描述符(“ HINSTANCE DLL_Handle; ”);
  • LoadLightReportDLL函数,可动态加载DLL及其所有函数;
  • FreeLightReportDLL函数可卸载DLL。

LPDLL.h文件已经包含使用DLL及其功能所需的所有内容。 但是,您也可以对其进行编辑或仅采用项目中最需要的内容。

想象一下,您刚刚将头文件“ LPDLL.h”连接到了项目。

然后,在项目本身中,您只需要:

1)为您的报告声明一个变量句柄:

Variant report; 

2)动态加载DLL及其所有功能:

 if(!LoadLightReportDLL("C:\\LightReport\\light_report.dll"))return; 

3)接下来,在try-catch构造中,打开准备的报告模板(MS Excel文件):

 report=OpenReport("C:\\LightReport\\Report.xlsx",0); 

4)在报表中添加一些数据:

 WriteCell(report, "Sheet1", 9, 1, "Hello world!"); 

...
5)保存文件或打印:

 Save(report); SaveAs(report, "C:\\LightReport\\Report copy.xlsx"); ExportToPDF(report, "C:\\LightReport\\Report.pdf", false); PrintOut(report); 

6)关闭文件:

 CloseReport(report); 

7)卸载DLL库:

 FreeLightReportDLL(); 

就是这样! 绝对没有更多! 只有一个警告,但即使如此,它仅在调试期间出现。 在正常工作的应用程序中,一切都会正常运行。 我的意思是处理报告时出现某种错误的情况。 事实是,用于处理文档的OLE机制仅在发生错误时才引发异常。 这就是为什么在使用DLL函数时必须使用try-catch构造的原因。 在catch块中,必须关闭报告而不保存:

 catch(...){CloseReport(report);} 

调试时,如果发生错误,则可以停止程序。 在这种情况下,MS Excel进程将保持运行状态,并且只能通过任务管理器将其关闭。 因此,在多次调试应用程序时,可能会启动MS Excel进程的多个实例,具体取决于发生错误时挂起程序的频率,而无需等待代码执行。 必须对此进行监视。

在该版本中,如果发生错误,则catch块中指定的代码肯定会起作用,报告将关闭,并且MS Excel过程将完成。 不会观察到系统中挂起的MS Excel进程。 但是他们仍然尝试编写无错误的代码,因此希望您在正在运行的应用程序中不要遇到这种情况。

最后,您需要添加:

  1. DLL使用与平台无关的数据类型,例如unsigned shortunsigned longchar 。 这是可以理解的原因。
  2. 该示例是在Embarcadero Builder C ++ 10环境中编写的,因此,所有代码都与此环境相对应,也许您需要对示例代码进行一些更改才能使所有代码在您的环境中正常工作。
  3. 此DLL的瓶颈是使用Variant格式的报告文件描述符。 这是一种相当具体的格式,我怀疑在Embarcadero RAD Studio外部使用该库可能会很困难。 老实说,我没有检查。

因此,将来计划将所有功能打包到一个类中,并将此Variant格式隐藏在该类内,以便仅向用户提供普遍接受的C / C ++格式。 我从没尝试过将类打包到DLL中,我读到必然会遇到困难。 尽管如此,我们会明白的! 同时,感谢您的关注,如果本文和DLL帮助您,我将非常高兴。

链接到项目

Source: https://habr.com/ru/post/zh-CN456102/


All Articles