技术标签: spring spring boot
因为工作要求我接触到了报表这个东西,网络上大部分教程都较为杂乱,我在这里也分享一下我所积累的经验,希望可以帮助到更多的人。
首先这个你想使用IReport5.6需要java7jre,这是第一步,这里我就不放下载链接了,百度一下就可以找到。
然后这个是iReport5.6的官方下载地址: iReport Designer | Jaspersoft Community
接下来我们开始今天的正题,如何在前端显示我们的报表
首先先在pom.xml文件中引入我们的依赖
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>6.0.0</version>
</dependency>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>2.2.2</version>
</dependency>
<!-- 解决前端显示不了中文,或字体报错-->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
然后创建一个工具类,这是我工具类中的方法
/**
* 前端预览pdf格式报表
* @param finame jasper文件路径 jasper文件统一存放在resources下的jasper文件夹下 必传
* @param fiJrxmls jrxml文件路径 jrxml件统一存放在resources下的jrxmls文件夹下 必传
* @param dataList 参数 必传
*/
public static HttpEntity<byte[]> getReportByParam(
String finame,
String fiJrxmls,
List<HashMap> dataList) throws SQLException, ClassNotFoundException, JRException, IOException {
File compiledFile = ResourceUtils.getFile(finame);
JasperReport jr;
if (compiledFile.exists()) {
jr = (JasperReport) JRLoader.loadObject(compiledFile);
} else {
InputStream inputStream = IreportUtils.class.getResourceAsStream(fiJrxmls);
JasperDesign jd = JRXmlLoader.load(inputStream);
jr = (JasperCompileManager.compileReport(jd));
JRSaver.saveObject(jr, finame);
}
JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(dataList,false);
JasperPrint jasperPrint = JasperFillManager.fillReport(jr, new HashMap<>(), dataSource);
final byte[] data = JasperExportManager.exportReportToPdf(jasperPrint);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_PDF);
headers.set(HttpHeaders.CONTENT_DISPOSITION, "inline: filename=demo.pdf");
headers.setContentLength(data.length);
return new HttpEntity<>(data, headers);
}
在这里我所参考的博客是: Springboot+jasperReport+ireport5.6(模板工具)+vue+pdf.js实现pdf文件流在前端预览打印_孔川的博客-程序员宅基地
然后在我们的resources下放入我们使用iReport所生成的jrxml文件和jasper文件
随后在我们的controller层添加一个接口
这里因为项目原因直接把SQL写在了controller层
@ResponseBody
@GetMapping("getPDF")
public HttpEntity<byte[]> getReportByParam(String Date) throws SQLException, ClassNotFoundException, JRException, IOException {
String sql = String.format(这里是SQL语句);
//这里是调用service层方法获取数据
List<HashMap> dataList = queryService.getData(sql,null,null);
//相对路径找到我们需要的文件
String finame="classpath:jaspers/Roleplus.jasper";
// String finame="D:\\ireport\\iReport-5.6.0\\ireport\\libs\\Role.jasper";
String fiJrxmls = "classpath:jrxmls/Roleplus.jrxml";
// String fiJrxmls = "D:\\ireport\\iReport-5.6.0\\ireport\\libs\\Role.jrxml";
//调用工具类中的方法
return IreportUtils.getReportByParam(finame,fiJrxmls,dataList);
}
在添加上这个方法就可以直接请求在前端查看我们做的报表了,我用的浏览器是Edge,可以自动解析PDF数据预览,如果你是要适配别的浏览器可以使用PDF.js
然后再说说我遇到的小坑
在我们前面引入的net.sf.jasperreports这个包中有一个阴间包0.9.7.309-JS-3,为什么说这个是阴间包呢,因为这个包maven下载不到,我在maven仓库中也没有搜到(可能是我太菜),这个包会导致我们在打包的时候报错,现在我也没有很好的解决方法,如果你看到我的博客并且也遇到了这个问题可以加我的QQ:3411460259,我会给你提供一个比较暴力的笨办法
最后呢,这是一个入行不到一年的小白写的第一篇博客,写的不是很好,希望大家多多包涵,如有问题也欢迎指出
这里是成功之后的效果预览(这里因为我没有给数据,所以会是null和无数据)
1:<% String demo=request.getParameter("demo"); int index=0; while((index=demo.indexOf("\n"))!=-1) demo=demo.substring(0,index)+"<br>"+demo.substring(index+1); out.print(demo); %...
经过我多次试验,nowrap如果为true,则在同一行中显示数据。设置为true可以提高加载性能。 这种形式才能生效,<script type="text/javascript"> $('#tt').datagrid({ nowrap: false }); </script>无效<th data-options="f...
对于时间的选择问题,查到的大部分为两种情况:1.存在readonly属性的2.没有readonly属性的可直接赋值send_keys()测试用例中刚好是没有readonly属性的且定位不到弹窗(通过查资料可知道,直接给时间控件input属性赋值是最快捷的方法)一开始都是奔着情况二去处理的,但一直运行不成功,总是在赋值的地方出错,反复确认了不存在iFrame...
在项目中一直用String s = jsonObject.getString( "s" )来获取字段,突然有一天我们安卓组同事跟后端说,让他们传json数据全部用string类型,否则如果一会传int一会又是string的话我们安卓端解析容易报类型转换异常。咋一听感觉好像有一定的道理,于是我就把获取的json字符串打印出来,一看确实有的是int有的string。然而奇怪的是,我所有的项目都是用
1.Float的介绍float 属性定义元素在哪个方向浮动。以往这个属性总应用于图像,使文本围绕在图像周围,不过在 CSS 中,任何元素都可以浮动。浮动元素会生成一个块级框,而不论它本身是何种元素。如果浮动非替换元素,则要指定一个明确的宽度;否则,它们会尽可能地窄(塌陷的产生)。注:假如在一行之上只有极少的空间可供浮动元素,那么这个元素会跳至下一行,这个过程会持续到某一行拥有足够的空间为止。...
史上最全的java spring注解,没有之一注解是个好东西,但好东西我们也是看见过,整理过,理解过,用过才知道好。不求我们每个都记住,但求保有印象,在需要的时候能提取出来再查找相关资料,平时工作就不会显得那么被动了。[email protected]注解该类等价 与XML中配置beans,相当于Ioc容器,它的某个方法头上如果注册了@Bean,就会作为这个Spring容器中的Bean,与xml中配...
使用pgAdmin把Excel文件导入PostgreSql数据库
辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。”如果你是辰辰,你...
一、实现效果图二、项目工程结构三、详细代码编写1、主tab布局界面,main_tab_layout:双击代码全选1234567891011121314151617181920212223242526<?xm...
废话不多说直接上精华。下面是图片操作的一些关键代码:图片操作类需求是得到一些图片的信息存入数据库,其中图片的宽高可通过system.Drawing.Image查看。一切从FileInfo开始OpenFileDialog open = new OpenFileDialog(); if ((bool)open.ShowDialog()) ...
openssl x509 -inform der -in certificate.cer -pubkey -noout &gt; rsa_public_key.pemOpenSSL手册
前言 “Struts2系列起始篇”是我整各系列的核心,希望大家能花些时间先看看。正文 我发现关于一些早期的Struts2的漏洞,网上的分析文章并不多,不知道是不是我打开浏览器的方式不对,唯一看到的两篇文章也仅有poc,没有细节分析。于是我在官方上看了下漏洞详情,如下: 大概意思是动态方法调用开启了会导致安全问题,给出的信息太少了,于是我又看了下网上的po...