背景

项目为WinForm + WCF 的应用,按照给定格式生成Report,显示在WinForm窗体上并可以导出为PDF和Excel文件。

分析

之前用过DevExpress For WinForm的报表控件,其包含了导出为PDF和Excel的功能,该项目没有相关软件授权,需要寻找其他解决方案。

在得到Report结构和样式后,第一时间想到了HTML,网页可以实现丰富的样式(颜色、字号、单元格合并与拆分等),开发效率也高。基于 HTML Template,生成WinForm Report 和PDF Report不再是难题,这两个报表的实现是比较顺利的。

接下来的Report都是在WCF中生成,以服务形式提供。

实现

创建HTML Template(示意图)

实现WinForm Report

使用HtmlAgilityPack填充HTML Template,生成的HTML Report可以通过WebBrowser显示在Winform中。

实现PDF Report

利用NReco.PdfGenerator可以将HTML Report转存为PDF格式文件。

实现Excel Report

这个部分的的实现比较纠结,兜兜转转的,我们一起Happy一下。

1. 尝试将 HTML转存为 Excel。 失 败

参考:https://www.watch-life.net/programming-notes/html-table-2-excel.html

限制:每次打开都会显示 "文件可能损坏或不安全,除非信任来源" 弹窗。

2. 尝试将 PDF转存为 Excel。 失 败

1)参考:Online2PDF.comhttps://online2pdf.com/

限制:1. 需要上传数据,不安全 2. 只能在线访问,我需要离线使用。

2)参考:GemBox.Spreadsheet Free Versionhttps://www.gemboxsoftware.com/spreadsheet/free-version

限制:该SDK免费版有数量限制(sheets per workbook <= 5,rows per sheet <= 150),我需要导出的行数大于150。

3. 尝试免费版 XLSX SDK。 失 败

参考:Templaterhttp://templater.info/

限制:UNLICENSED (FREE) VERSION必须保留"Unlicensed version"提示,不得移除。我需要移除这个提示。

插曲:关于"Unlicensed version"的提示,技术上移除掉没有难度,在跟SDK开发商咨询后,明确了该提示信息不得以任何方式移除,尊重版权,继续另寻他法。

2. GRANT OF LICENSE http://templater.info/eula 
2.1 UNLICENSED (FREE) VERSION of SOFTWARE. 
LICENSEE is allowed to use SOFTWARE in unlimited number of computers, for any
purpose, including use in commercial applications. However, LICENSEE is
required to: a) honor and conform to usage limitations of free version and b)
acknowledge usage of free version of the SOFTWARE in their application. Format,
formulation and placement of acknowledgement are arbitrary, as long as it
mentions LICENSOR. 
LICENSEE may not remove INFO MESSAGE specific for unlicensed version. 
LICENSOR does not have responsibility to provide any technical or any other
support to the users of the free version of the SOFTWARE.

4. 尝试开源OpenXML
SDK。 退 缩
参考:SpreadsheetLighthttp://spreadsheetlight.com/
限制:手工计算并填充每一个单元格,代码逻辑复杂,我更恐惧这种方式的效率和工作量。

5. 使用 XML
Spreadsheet 2003 (*.xml) 模板。 成 功

优势

1) 可视化方式创建Excel
Template,与 HTML Template异曲同工。

2) 代码复用性高,与其他Report共用数据结构。

3) 数据填充效率高,生成速度快。

不足

不支持某些高级特性(可能是宏,引用等,暂未用到)。

实现

1) 新建Excel
文档,设置占位符。

2) 另存为 XML
Spreadsheet 2003 (*.xml) 格式。

3) 加载 xml
模板文本,使用HtmlAgilityPack替换字符串的方式填充数据,转存为xlsx格式文件。

4) 使用 FreeSpire.XLS 控件将 XML 模板转换为 Excel 文件。
https://www.nuget.org/packages/FreeSpire.XLS

在 .Net 项目中生成Report小记的更多相关文章

  1. (转载)Log4Net 在多层项目中的使用小记

    (原创)Log4Net 在多层项目中的使用小记 这几天刚好在调整一个项目,把一些自己不是很清楚的东西先试验一下,这篇文章主要是对我在项目中需要使用Log4Net的一些记录.网上有很多相关的教程,但是各 ...

  2. C# 动态创建SQL数据库(二) 在.net core web项目中生成二维码 后台Post/Get 请求接口 方式 WebForm 页面ajax 请求后台页面 方法 实现输入框小数多 自动进位展示,编辑时实际值不变 快速掌握Gif动态图实现代码 C#处理和对接HTTP接口请求

    C# 动态创建SQL数据库(二) 使用Entity Framework  创建数据库与表 前面文章有说到使用SQL语句动态创建数据库与数据表,这次直接使用Entriy Framwork 的ORM对象关 ...

  3. Log4Net 在多层项目中的使用小记

    原文地址:http://www.cnblogs.com/zdh8675/p/3645556.html 这几天刚好在调整一个项目,把一些自己不是很清楚的东西先试验一下,这篇文章主要是对我在项目中需要使用 ...

  4. (原创)Log4Net 在多层项目中的使用小记

    这几天刚好在调整一个项目,把一些自己不是很清楚的东西先试验一下,这篇文章主要是对我在项目中需要使用Log4Net的一些记录.网上有很多相关的教程,但是各有各的说法,我结合我自己这个项目的需要,首先,项 ...

  5. JAVA WEB项目中生成验证码及验证实例(附源码及目录结构)

    [我是一个初学者,自己总结和网上搜索资料,代码是自己敲了一遍,亲测有效,现将所有的目录结构和代码贴出来分享给像我一样的初学者] 作用 验证码为全自动区分计算机和人类的图灵测试的缩写,是一种区分用户是计 ...

  6. 在.net core web项目中生成二维码

    1.添加QRCoder包引用 2. public IActionResult MakeQrCode()        { string url="https://www.baidu.com& ...

  7. Java Web项目中使用Freemarker生成Word文档

    Web项目中生成Word文档的操作屡见不鲜.基于Java的解决方式也是非常多的,包含使用Jacob.Apache POI.Java2Word.iText等各种方式,事实上在从Office 2003開始 ...

  8. React Native(ios)项目中logo,启动屏设置

    由于logo和启动屏尺寸多,react native(ios)中没有命令可以自动生成各种的尺寸,所以可以使用以下办法:在ionic项目中生成(使用命令:ionic resources)后,再粘贴到re ...

  9. 在java项目中使用webservice

    今天学习webservice,主要参考了网络上的一些文章. 1.关于原理的介绍:个人认为这篇文章写得不错了,戳这里. 2.关于demo的编写:个人认为这篇文章很简洁,也能运行成功,戳这里. 按照上面那 ...

随机推荐

  1. MySQL事务(脏读、不可重复读、幻读)

    1. 什么是事务? 是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作:这些操作作为一个整体一起向系统提交,要么都执行.要么都不执行:事务是一组不可再分割的操作集合(工作逻辑单元): ...

  2. mysql小白入门

    mysql简介 1.什么是数据库 ? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,它产生于距今六十多年前,随着信息技术和市场的发展,特别是二十世纪九十年代以后,数据管理不再仅 ...

  3. 【2019.10.30】SDN上机第1次作业

    用字符命令搭建如下拓扑,要求写出命令 题目一: 字符命令如下: 题目二: 字符命令如下: 利用可视化工具搭建如下拓扑 要求支持OpenFlow 1.0 1.1 1.2 1.3,设置h1(10.0.0. ...

  4. docker 监控之 cadvisor

    我们可以使用多种方法监控容器的运行情况,比如EFK等,但是我们仍旧需要一个资源利用率监控系统.这个时候,google开发的cadvisor就可以帮上我们的忙了. cadvisor是google创建的用 ...

  5. vmWare安装centos7之后使用yum安装提示there are on enabled repos(修改yum源)

    可以使用这个命令修改yum源 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.rep ...

  6. 判断x的m次方和y的m次方末尾三位数是否相等

    /*==============================================对于任意给定的两个正整数x和y,是否存在一个不超过100的正整数m使得x^m与y^m的末尾三位数相等呢? ...

  7. Java字节码增强探秘

    Java字节码增强探秘 https://mp.weixin.qq.com/s/CH9D-E7fxuu462Q2S3t0AA

  8. Oracle数据库启动报错,找不到数据文件(ORA-01157和ORA-01110)

    数据库报了ORA-01157和ORA-01110错误,提示找不到一个数据文件. 1.启动数据库报错 在启动数据库过程中,报了ORA-01157和ORA-01110错误,提示找不到数据文件. SQL&g ...

  9. Shell Script 入门教程

    和 Shell 的区别 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁. Shell 即是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序,这个应用程序提 ...

  10. flutter Checkbox 复选框组件

    import 'package:flutter/material.dart'; class CheckboxDemo extends StatefulWidget { @override _Check ...