这些年的工作当中,最早是在8年前接触到FastReport这个报表工具,从名字上来看,直译过来就是快速报表,正所谓天下武功,唯快不破,FastReport报表早些年确实是制作报表的不二之选,8年前的工作中,涉入到了医疗行业,项目中要使用FastReport.net 打印基因检测报告,效果确实是满足了项目要求。

最新版FastReport.net支持.net core

鸡肋的FastReport.net网页版

回过来看,最近几年的工作中,报表也是一直使用的是FastReport.net ,但转到了BS端,即在网页上打印业务单据,基本上不复杂的效果完全满足要求,而且我还开发了基于ActiveX的控件,以解决浏览器上FastReport报表BS版本比较鸡肋的功能,FastReport.net的网页版本的打印是通过生成PDF文件,然后调用PDF的打印功能来实现打印,如果原生的浏览器打印功能,会存在着页脚被添加一串URL地址、翻页,定制页不能打印的问题。通过开发FastReport.net的ActiveX控件,可以实现用户自定义报表功能,网页直接打印功能,指定默认打印机功能,反正跟桌面版本体验一致的效果。但唯一的缺点是基于IE内核,因ActiveX是弥补IE的缺陷而生的一项技术,等将来有兴趣了,我或许会移植该程序以支持基于Chrome浏览器,让FastReport.net这个报表,不管任何浏览器都获得跟桌面版本一致的体验。

今天要分享给大家的是使用FastReport.net 2017版本而编写的一个demo程序,并提供了示例程序下载;为何使用FastReport.net 2017,那是因为购买的授权是这个版本,当时想着该版本支持 .net core,但实际情况是该版本只是一个过渡版本,对.net core的支持有问题,官方示例程序我是没有运行起来,于是我就变通一下,直接使用 webform方式来实现,因为该报表对webform实现支持是比较良好的,如果有朋友或公司购买了FastReport.net老版本的授权,但想要它支持.net core是行不通的,必须最新版本才行,因此可以像我这样变通解决网页版打印问题。

解决方法如下

1、单独新建一个webform的网站项目,只添加报表相关文件和代码,我们暂且将这个项目称之为FastReport.Print,它是一个BS版本的基于FastReport.net实现打印需求的网站项目,如果您的业务单据较多,可以建很多目录,同时将报表文件扔到相应目录即可,只需要在代码里面指定报表文件即可。

2、正式的网站项目,我们称之为XXXX.Portal,在Portal某个目录的页面上发起打印请求,该页面上放置一个打印按钮,名字叫:批量打印,触发批量打印事件后,从后台获取到数据,然后将打印数据按报表所需要的格式Post到FastReport.Print对应的打印页面即可。记住,一定是发送post请求,至于格式,你可以是任意的,只需要您自己能解析出来即可,将解析出来的数据,在Print项目的页面的C#代码里面,向FastReport.net注册数据源即可。

示例代码解读

下面是aspx页面代码

1

2

3

4

5

6

7

8

9

10

11

12

<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" %>

<%@ Register assembly="FastReport.Web" namespace="FastReport.Web" tagprefix="cc2" %>

<asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="server">

    <div>

        <h3><a href="https://jhrs.com" target="_blank"> jhrs.com</a> 出品 FastReport 打印功能示例</h3>

    </div>

    <div class="row">

        <cc2:WebReport ID="WebReport1" runat="server" ShowCsvExport="true" ShowExports="true"  />

    </div>

</asp:Content>

  页面代码是一个WebReport的标签,即FastReport的服务器端标签,下面是后台C#代码:

 public partial class _Default : Page{protected void Page_Load(object sender, EventArgs e){if (!IsPostBack){string reportFile = Server.MapPath("/report/设备标牌.frx");//这里为了演示,直接new一个集合,您应该从另外一个项目将数据post过来再反序列化。通过Request.Form["参数名"],将它反序列化即可。List<SbData> list = new List<SbData>();for (int i = 0; i < 5; i++){list.Add(new SbData{标题= "帝国游戏集团游戏装备标牌",使用科室 = "机要部" + i,启用日期 = DateTime.Now.AddDays(i).ToString(),型号 = "XH34534-" + i,序列号 = "XLH-3452" + i,序号 = (i + 1).ToString(),条码 = "BH20190302002" + i,生产厂家 = "帝国" + i + "科技有限公司",规格 = "GGX-1" + i,设备名称 = "X射線髮射器",责任人 = "趙佳仁" + i,质保日期 = DateTime.Now.AddYears(i).ToString()});}var dt = ToDataTable(list);WebReport1.RegisterData(dt, "设备管理标牌");WebReport1.Report.Load(reportFile);WebReport1.Prepare();}}/// <summary>/// 将泛型集合类转换成DataTable/// </summary>/// <typeparam name="T">集合项类型</typeparam>/// <param name="list">集合</param>/// <returns>数据集(表)</returns>public DataTable ToDataTable<T>(IList<T> list){List<string> propertyNameList = new List<string>();DataTable result = new DataTable();if (list.Count > 0){PropertyInfo[] propertys = list[0].GetType().GetProperties();foreach (PropertyInfo pi in propertys){if (propertyNameList.Count == 0){result.Columns.Add(pi.Name, pi.PropertyType);}else{if (propertyNameList.Contains(pi.Name))result.Columns.Add(pi.Name, pi.PropertyType);}}for (int i = 0; i < list.Count; i++){ArrayList tempList = new ArrayList();foreach (PropertyInfo pi in propertys){if (propertyNameList.Count == 0){object obj = pi.GetValue(list[i], null);tempList.Add(obj);}else{if (propertyNameList.Contains(pi.Name)){object obj = pi.GetValue(list[i], null);tempList.Add(obj);}}}object[] array = tempList.ToArray();result.LoadDataRow(array, true);}}return result;}}public class SbData{public string 标题 { get; set; }public string 序号 { get; set; }public string 设备名称 { get; set; }public string 规格 { get; set; }public string 型号 { get; set; }public string 启用日期 { get; set; }public string 序列号 { get; set; }public string 生产厂家 { get; set; }public string 条码 { get; set; }public string 责任人 { get; set; }public string 使用科室 { get; set; }public string 质保日期 { get; set; }}

上面的代码,是一个aspx页面后置代码,我们可以在Page_Load事件里面接收正式项目提交过来的打印数据,建议使用json,因为你只需要直接反序列化即可,方便。然后将获取到的值还要转为DataTable,因为FastReport注册数据源我这儿使用的是DataTable类型,至于其它类型,我没有去烟酒是否正常。

FastReport.net打印网页版运行效果一览

网页版的打印效果如下:

上面的报表,排版格式是很简单的,二维码FastReport自带,这里不介绍使用教程,这个示例只是一个很简单的应用,它的更多功能,可以看官方示例及源码。

基于asp.net 的Demo源码下载

以下提供的demo程序,下载后直接使用VS打开即可运行。

源码下载:点击原文链接进行下载

使用FastReport.net 报表在网页上实现打印功能相关推荐

  1. 优酷复制的html代码怎么用,关于网页上增加视频功能的代码

    在开发网站上时候,不知道怎么在自己的网站上增加视频播放功能.后来找了许多资料,不管怎么说,还是在自己的网站上挂上了视频页面及播放窗口,尽管很小白,记录下来,以成长精进之用. 1直接利用优酷代码 先复制 ...

  2. 网页上facebook分享功能的具体实现

    1,一个链接: 参数是要分享的页面的链接 代码如下: <a style="width:35px; height:40px; position:relative; top:10px; l ...

  3. 网页上实现打印指定区域的方法实现

    通过单击页面按钮,便实现页面打印指定区域内容的方法. <!doctype html> <html> <head> <meta charset="ut ...

  4. html页面怎么添加打印,在网页中添加打印按钮或链接的方法

    在网页中添加打印按钮或链接的方法 发布时间:2020-05-27 17:38:35 来源:亿速云 阅读:347 作者:鸽子 打印按钮或链接是对网页的简单添加 CSS(层叠样式表)使你可以控制屏幕上的网 ...

  5. 基于ZYNQ的网页上传BMP图片至HDMI端口输出实例

    目录 Change Log 0 前言 0.1 系统实现 0.2 源码下载 0.3 项目信息 1 ZYNQ开发板HDMI输出BMP图片功能:FPGA相关 1.1 系统框图 1.2 RTL图 1.3 Bl ...

  6. WEB打印-网页打印功能(带分页、可多页打印)

    <html> <head> <title>Web打印</title> <meta http-equiv="Content-Type&qu ...

  7. 在Winform开发中使用FastReport创建报表

    FastReport.Net是一款适用于Windows Forms, ASP.NET和MVC框架的功能齐全的报表分析解决方案.可用在Microsoft Visual Studio 2005到2015, ...

  8. asp.net实现在网页上自动显示超链接以及Email地址

    人们总喜欢在帖子中加上各种有用的URL链接或Email地址.而笔者当初设计时没有考虑到这一点,使得这些URL链接或Email地址只能以文字的形式而并不是以超链接的形式显示,其它浏览帖子的人还必须把这些 ...

  9. 使用php读写mysql数据库并显示到网页上

    由于工作的原因,需要了解下bs模式下的读写数据库的流程,将试验过程梳理一下. 我采用的是phpstudy搭建数据库,mysql数据库已经搭建完成,名称为2018版本,如下图: 由于我前期安装过apac ...

最新文章

  1. 中国芯片将靠此超车!RISC-V架构神在哪全解构【附下载】
  2. 为什么优秀的程序员都成了无能的领导?
  3. 模拟电路技术之基础知识
  4. 饿了么多活利器:实时双向复制工具(DRC)
  5. Swift入门篇-循环语句
  6. oracle遇null赋默认值,使用hibernate annotation 为非空列加上默认值
  7. [转贴]IT外包服务商如何构建高效率的服务台运营机制
  8. python将csv一行保存一个txt_Python读写文件(csv、txt、excel)
  9. 圆平移后的方程变化_1.1 直角坐标系中的平移变换与伸缩变换
  10. Koa2+Mysql搭建简易博客
  11. 【Linux系列】centos7中防火墙相关命令
  12. Spring Boot 2 Webflux的全局异常处理
  13. Python面向对象中的多态与静态语言(C++,Java)的区别
  14. 对字节输入输出流的理解以及几道练习题
  15. C语言学生管理程序输入错误,c语言编程,关于学生管理的程序(急急急)
  16. 安卓导航车机root方法_手机、平板这么好用,为什么车机还这么垃圾
  17. 各大搜索引擎站点提交入口大全
  18. 树型拓扑计算机网络的缺点是,计算机网络拓扑的优缺点 -电脑资料
  19. 双机热备份VRRP原理详解(附实验)
  20. 为ESP8266编译时出错

热门文章

  1. Autoware 中 GPS 定位问题
  2. source insight python Python.CLF 语言包,设置source insight使之可以查看并编辑python文件
  3. SpringMVC学习----SpringMvc快速入门
  4. 当代的设计潮流是什么_当代设计如何多元化发展?
  5. 简历表格模板-Word简历可编辑下载
  6. Do not run Composer as root/super user
  7. 2021.07.15 周四 晴
  8. mc服务器用户名,“我是mc服务器的最后一个玩家,听着窗外的雨声,我却没法拯救”...
  9. 用做考试练习的c语言题库软件,练习题软件
  10. adsl动态拨号服务器有什么不同?