MaltReport2:基于 OpenDocument/OpenOfficeXML 的报表引擎

MaltReport 是我几年前写的开源单据、报表引擎,最近进行了较大的更新,尤其是几年来在生产项目中应用取得了非常好的效果,特别写篇介绍文字给大家分享一下。

首先先介绍几个名词:

  • OpenDocument:国际标准文档格式,开源办公软件 OpenOffice.org/LibreOffice 的 ODT/ODS 即为 OpenDocument 格式。
  • OpenOfficeXML:同样是国际标准文档格式,由 Microsoft 定义,MS-Office 的 DOCX/XLSX 等即为 OpenOfficeXML 格式。

简介

MaltReport 实际上是一个通用的模板文档生成系统,其用途不仅用于生成报表,也可以用来生成合同、预算报告、标书等等任何需要格式与数据相结合的文档,其中的 XLS/ODS 模板尤其适合大量数据导出的场合。

简单来说,MaltReport 是通过直接在内存中解析操作 OpenDocument 和 OpenOfficeXML 文件来实现报表和单据的生成,整个理念非常接近于 ASP.NET MVC 的 Razor 模板,只不过 Razor 生成 HTML 而 MaltReport 生成 ODT/ODS/DOC/XLS 文件。

MaltReport 的优点:

所见即所得

  1. 通过在 OpenDocument 或 OpenOfficeXML 文件里嵌入简单易学的 Velocity 模板语言来开发模板,实际上我们将 MS-Office 和 LibreOffice 作为我们的所见即所得的报表模板编辑器。
  2. 生成后的报表是通用的 XLS/DOC/ODT/ODS 文件,打印、格式转换等均不是问题。
  3. 简单易用的 API,三行代码实现报表生成。

性能与可靠性

直接在内存中操作 odt/ods/xls/doc 文件,采用 NVelocity 模板引擎进行内容的替换,生成报表不依赖 Libreoffice/MS-Office 等软件,适合服务器端运行。因为 Word/Excel 这些桌面软件不是为服务器长期运行设计的,之前有些 Word 文档生成工具之类需要通过 Word 的 COM 接口操作 docx 文件,数量一大很有可能耗尽服务器的内存。

MaltReport 报表引擎本身不负责报表的排版和显示,因此没有其他采用像素定位设计的报表工具所存在的中文换行、对齐等等布局问题,极大提高了报表生成的性能。经实际使用的经验显示,生成报表的速度仅受限于磁盘 IO 速度.

特性完整

  1. 可以利用 LibreOffice Calc 或 MS-Excel 电子表格的强大功能,进行二次汇总分析或绘制图表。
  2. 支持图像数据,可以在文档中嵌入用户提供的图像数据。

还有最后不能不提及的,免费开源,MIT 协议授权,可在商业产品中自由使用。

使用说明

下面以 Word 报表为例介绍 MaltReport 的使用。

第一步,在 nuget 中加入项目引用:

MaltReport 已发布到 nuget.org 中,可通过 nuget 引入您的项目,参考:

https://www.nuget.org/packages/MaltReport2

第二步,创建报表模板

新建一个 Word 文档,并另存为【Word 2003 XML】格式,然后把文件扩展名从 xml 改回 doc,然后使用 Word 重新打开。

在 Word 中创建模板,报表引擎通过特殊的超链接及 Velocity 模板标记来识别,一点简单的小介绍:

  1. $xxx 是模板的占位符,通过 RenderContext 提供的数据进行替换,也支持 $xxx.yyy.zzz 或 ${xxx.yyy.zzz}这样的格式。
  2. 若表达式太长可使用超链接,超链接使用 rtl://$xxx.yyy.zzz/ 或rtl://${xxx.yyy.zzz} 的格式。
  3. 支持 foreach 循环和 if-then-else 条件等,尤其是表格可以按行或按列循环。

实际例子可参考 Velocity 的 VTL 语言文档及本项目的演示。

当模板创建完成以后保存并关闭 Word。

第三步,在 C# 代码里加载、渲染并生成报表

 1 var dt = new DataTable("Employees");
 2
 3             //Fill the DataTable
 4             var connectionString = @"Version=3,uri=file://./Database/northwind.db";
 5             using (var connection = new SqliteConnection(connectionString))
 6             {
 7                 var sql = "SELECT FirstName, LastName, HireDate, BirthDate, Address FROM Employees";
 8                 var adapter = new SqliteDataAdapter();
 9                 adapter.SelectCommand = new SqliteCommand(sql, connection);
10                 adapter.FillSchema(dt, SchemaType.Source);
11                 adapter.Fill(dt);
12             }
13
14             var renderContext = new Dictionary<string, object>()
15             {
16                 //Plain old types
17                 {"title", "EMPLOYEES"},
18                 {"property1", "Property 1"},
19                 {"property2", "Property 2"},
20
21                 //Strong types
22                 {"orm_employees",
23                     new List<Employee>()
24                     {
25                         new Employee("Micheal Scott", "Address 1", 22),
26                         new Employee("Andy Bernard", "Address 3", 33),
27                         new Employee("Dwight Shurte", "Address 1", 22),
28                         new Employee("Jim Halpert", "Address 2", 27),
29                         new Employee("Pam Beesly", "Address 4", 19),
30                     }
31                 },
32
33                 {"employees", dt}, //DataTable is ok
34
35                 {"now", DateTime.Now}, //DateTime is ok too
36             };

上面的代码演示了 RenderContext 的概念用法,RenderContext 为模板中所包含的数据的容器,本身是一个 IDictionary<string, object> 类型,key 为变量名,value 为变量值,变量值支持原始类型、强类型类、结构、DataTable 等。

有了模板和要填充到模板中的数据我们只需加载模板、编译模板然后渲染模板即可,非常简单直观的 API:

 1 var template = new WordMLTemplate();
 2
 3 template.Load("template1.doc"); //第一步加载模板文件
 4
 5 template.Compile(); //第二步编译模板
 6
 7 //第三部渲染模板
 8 var resultDoc = template.Render(ctx);
 9
10 //第四步,保存生成的报表文件,也可保存到 MemoryStream
11 using (var resultFile3 = File.Open("result.doc", FileMode.Create, FileAccess.ReadWrite))
12 {
13     resultDoc.Save(resultFile3);
14 }

生成了名为“result.doc”的报表文件,试着用 Word 打开:

Voila! 全部搞定!

在项目的源代码里包含 Sandwych.Reporting.Demo 演示程序,里面包含生成 DOC/XLS/ODT/ODS 的全部样例。

项目地址及其他

联系我: oldrev AT gmail.com 也可加我 QQ: 55-43-1671

项目 github: https://github.com/oldrev/maltreport

项目 nuget:https://www.nuget.org/packages/MaltReport2

时间: 2024-08-08 09:28:01

MaltReport2:基于 OpenDocument/OpenOfficeXML 的报表引擎的相关文章

基于NPOI的报表引擎&mdash;&mdash;ExcelReport

前言 其实现在说ExcelReport是报表引擎还为时尚早,但该组件我既然要决心维护下去,这便算是初衷吧! 1.现在,ExcelReport能为你做什么呢? 如果,你有导出数据到Excel的需求,ExcelReport或许是一个不错的选择. 2.ExcelReport开源吗? 是的,该组件采用MIT许可.你可以在GitHub获取源码. 3.ExcelReport有使用教程吗? ExcelReport不论是使用还是实现都非常简单,往下看,不但有示例解析还有组件的源码解析哦! 目录 ExcelRep

atitit.报表最佳实践oae 与报表引擎选型

atitit.报表最佳实践oae 与报表引擎选型 1. 报表的主要的功能and结构 2 1.1. 查询设计器(配置化,metadata in html) ,anno 2 1.2. 查询引擎 2 1.3. 建立数据源 2 1.4. 输出显示 2 1.5. 格式化 2 1.6. 图表引擎(支持二维码,条形码) 2 1.7. 导出 excel,txt,csv,pdf,xml,html 2 1.8. 打印 2 2. 报表的选择根据 2 2.1. 开发快速 recomm  db report ( 2 2.

Stimulsoft Reports.Silverlight是一款强大的基于Silverlight平台的报表创建工具控件

Stimulsoft Reports.Silverlight是一款强大的基于Silverlight平台的报表创建工具控件.该产品有三个部分组成.第一部分是用于在Web浏览器中浏览和编辑的ASP.NET组件集.报表在服务器端渲染,在客户端进行显示和编辑报表.第二部分是基于Silverlight的功能齐全的报表工具,它只通过Silverlight来渲染,编辑,打印和导出报表.第三部分是一个用于WinForms平台的独立(独立的)的报表设计器.该部分是用于创建报表以及为能够进一步与其他组件一起使用 具

强大的报表引擎控件Stimulsoft Reports.Ultimate

Stimulsoft Reports.Ultimate 报表控件是一个综合全面的解决方案,被用于呈现.NET Framework 平台上的报表.该产品包括一套完整的可以在WinForms,ASP.NET 和 WPF 环境下创建报表的工具集.可以在设计时和运行时运行,其中包括一个独特的web报表设计器.Viewers 用来显示报表.此外,其强大的报表输出系统,能支持多种不同的报表格式.简单但功能强大的报表引擎.Stimulsoft Reports.Ultimate的一条基本使用原则是,用户可以用常

基于协同过滤的推荐引擎(实战部分)

基于协同过滤的推荐引擎(理论部分) 时隔十日,终于决心把它写出来.大多数实验都是3.29日做的,结合3.29日写的日记完成了这篇实战. 数据集准备 数据集使用上篇提到的Movielens电影评分数据里的ml-latest-small数据集,下载完成后有下面四个csv文件. 我们这里只需要ratings.csv就够了,打开以后会发现长这样: 是的,它果然和数据库里的没两样,上篇我们介绍的一般评分估计也好,神奇的SVD评分估计也好,前提都是有一个长成下面这样的物品-用户矩阵 然后提出其中的两列,传给

报表引擎API开发入门—简单程序数据集

小编最近接的项目是有关报表开发的,很想把这部分知识分享出来.希望大家能够支持我!不多说,马上进入我们今天的话题. API基本知识 小编最近项目所做的是关于一个报表软件-FineReport报表开发的一些事,也许有人接触过,知识相通,我今天就把我做的分享出来.FineReport设计器与服务器不可能满足所有的需求,某些个性化需求可能无法实现.我们可以深入的开发与控制API接口.想要了解我们内核结构及api的使用,首先我们必须掌握一些基本的概念,下图就是我们内核的最基本图示.图是网上找的,有点不清楚

《奥威Power-BI基于MySQL数据源制作报表》腾讯课程开课啦

前阵子奥威公开课讲过基于oracle数据源制作报表,有些宝宝就有小情绪了:简直就是不把我MySQL放在眼里嘛!oracle和MySQL一直以来被大家对比了很多次,同属于 Oracle 旗下产品,本是同根生,相煎何太急?这oracle和MySQL各有千秋,有着不同的侧重点和各自的小成就.为了我们的MySQL铁粉们,奥威软件决定这次就来讲一讲MySQL咯! 讲师介绍:李显斯 多年的甲方.乙方工作经验,熟悉企业的业务流程,主要从事数据库.BI开发,对ETL.数据仓库技术有着丰富的经验. 直播时间:20

报表引擎交叉表的报表设计示例

使用Delphi开发了一个报表引擎,以下是一个交叉表的示例: 报表引擎交叉表的报表设计示例

MyReport报表引擎2.1.0.1新功能

MyReport报表引擎(免Flex开发集成版)的使用场合适用于以传统html构建的系统,希望集成MyReport报表引擎的报表预览.打印和报表设计功能,而且不须要进行Flex相关的二次开发的用户.MyReport报表引擎(免Flex开发集成版)的集成方式採用通过超链接跳转,在新的浏览器窗口打开MyReport报表预览或MyReport报表设计页面的方式.MyReport报表引擎(免Flex开发集成版)的集成方法和使用说明请下载该版本号MyReport查看使用文档,以及參考下文介绍. MyRep