最近接触过许多报表导出功能,也用过多种工具进行导出功能的实现,但对于图表的导出一直没有仔细的去展开研究和探讨,直到最近略微整理了下这方面的需求和技术攻克。

首先导出excel功能的实现主要有JXL、JXCELL、POI等工具。目前只实现了JXL和JXCELL。

JXL:

  先介绍下JXL:

  jxl是一个韩国人写的java操作excel的工具, 在开源世界中,有两套比较有影响的API可 供使用,一个是POI,一个是jExcelAPI。其中功能相对POI比较弱一点。但jExcelAPI对中文支持非常好,API是纯Java的, 并不 依赖Windows系统,即使运行在Linux下,它同样能够正确的处理Excel文件。 另外需要说明的是,这套API对图形和图表的支持很有限,而且 仅仅识别PNG格式。

  通过过jxl导出EXCEL报表,相信很多同行已经实现,并且网上有大量的例子和文章来介绍他,这里就不在记录。

  本文着重介绍如果你使用了JXL进行EXCEL的导出,并且暂时无法替换工具(这里说的是整体替换),同时又有新的需求对已有的图表进行导出(之前导出报表),那么下面的方法将会帮助到您:

  首先JXL对于EXCEL图表的导出能力有限,在本人进行大量的资料查询后仍没有具体的办法。但是请注意,在JXL介绍当中提到,JXL对图形和图表有支持,虽然仅仅识别PNG格式的图片,但却也同时提供了一种方法:

  思路:

    页面展示图表所用到的JS框架,都有提供对图表FLASH 进行格式的转化,转化为图片。如:Open Flash Chart。

    在Open Flash Chart中,通过javascript把flash保存成图片。运用js就可以直接在页面生产图片jQuery 的实现:
    

  1. <script src="Resources/swfobject.js" type="text/javascript"></script>
  2.  
  3. <script type="text/javascript">
  4. swfobject.embedSWF("Resources/open-flash-chart.swf", "divChange", "550", "300",
  5. "9.0.0", "expressInstall.swf",
  6. { "data-file": "OpenFlashChartData/LineData.aspx" }
  7. );
  8. </script>

  Html页面:

  1. <div id="divChange">
  2. </div>
  3. <input type="button" name="btncopy" onclick="OFC.jquery.rasterize('divChange', 'img_chart_1')"
  4. value="生成图片" />
  5. <div id="img_chart_1">
  6. </div>

  Js代码如下:

  1. <script type="text/javascript">
  2. OFC = {};
  3. OFC.jquery = {
  4. name: "jQuery",
  5. version: function(src) { return $('#' + src)[0].get_version() },
  6. rasterize: function(src, dst) { $('#' + dst).replaceWith(OFC.jquery.image(src)) },
  7. image: function(src) { return "<img src='data:image/png;base64," + $('#' + src)[0].get_img_binary() + "' />" },
  8. popup: function(src) {
  9. var img_win = window.open('', 'Image')
  10. with (img_win.document) {
  11. write('<html><head><title>Tipsdoo Chart Report Image</title></head><body>' + OFC.jquery.image(src) + '</body></html>')
  12. }
  13. img_win.document.close();
  14. }
  15. }
  16.  
  17. if (typeof (Control == "undefined")) { var Control = { OFC: OFC.jquery} }
  18.  
  19. function save_image() { OFC.jquery.popup('divChange') }
  20. function moo() { alert(99); };
  21. </script>

  页面运行情况:

  (本例网上资料)

  这样就把FLASH格式的图表转化为了 PNG格式的图片,并且是BASE64编码的图片资源(html识别,并且能够显示)。

  在获取到PNG图片时,通过AJAX 把BASE64编码格式的图片传到后台:

  

  1. function save_image() {
  2. var pic1;
  3. var pic2;
  4. $.ajax({
  5. type : "POST",
  6. url : "xxxx.do?method=xxx",
  7. dataType : "json",
  8. async : false,
  9. data:{imgstr:$('#图片所在标签ID')[0].get_img_binary(),imgstr1:$('#图片所在标签ID')[0].get_img_binary()},
  10. error : function(XMLHttpRequest, textStatus, errorThrown) {
  11. alert("error");
  12. },
  13. success : function(data, textStatus) {
  14. if (data && data.result != "") {
  15. pic1 = data.result.split('%')[0];
  16. pic2 = data.result.split('%')[1];
  17. exportFilter(pic1,pic2);//导出方法
  18. }
  19. }
  20. });
  21. }

  exportFilter(pic1,pic2):

  

  1. function exportFilter(pic1,pic2) {
  2. OFC.jquery.rasterize('图表所在标签ID', '图片所在标签ID');
  3. OFC.jquery.rasterize('图表所在标签ID', '图片所在标签ID');
  4. submitFrm(document.getElementById("myOneForm"),
  5. "xxxxxxxx.do?method=xxxxxx&pic1="+pic1+"&pic2="+pic2);
  6. }

  这样 通过AJAX 把图片传回 后台,后台做相应的处理,保存图片文件到服务器上,并且返回图片的名称(BASE64格式转码保存为文件可以网上找到资料)。

  然后再发送导出EXCEL文件请求,到了这一步则是后台处理数据集合通过JXL编辑EXCEL 插入数据。然后就是JXL插入图片代码:

  

  1. File imgFile1 = new File("D:/"+userId+"/"+pic1+".png");
  2. File imgFile2 = new File("D:/"+userId+"/"+pic2+".png");
  3. WritableImage img1 = new WritableImage(7, 0, 7, 18, imgFile1);
  4. WritableImage img2 = new WritableImage(7, 19, 7, 18, imgFile2);
  5. sheet.addImage(img1);
  6. sheet.addImage(img2);
  7.  
  8. // 写入excel
  9. pWorkbook.write();
  10. pWorkbook.close();

   这里是取到之前保存的图表PNG格式的图片,然后通过JXL自带的图片插入方法插入到EXCEL中,位置可以自定。

   这样就可以实现JXL 图表、报表的同时导出,

     优点:1、导出的是原生页面显示图表,并且在EXCEL可以随意的拖动 ,改变图片的大小。2、能够满足各种图表,甚至是非规则图表、甚至可以导出任意大小小于

2M的图片

   缺点:1、必须先把需要的图表展现在页面上,然后才能保证报表,图表数据的一致性。2、实现麻烦,需要把先保存图片到后台。3、转码过程中容易出现图片损坏。

    提醒:为了不浪费服务器性能,图片需要放在临时文件夹中,定时删除或者导出完立即删除。

JXCELL:

  JXCELL对图表的导出支持很突出。因为支持了EXCEL自带的绘制图表的方法。因此并不依赖于页面JS图表框架,只要有数据源。

  下面一个小的例子:

  基本的报表导出就不多做介绍。看代码,插入饼图:

  

  1. ChartShape chartpie = m_view.addChart(0, 25 + count, 5, 37 + count);
  2. chartpie.setTitle("图表的名称");
  3. chartpie.setChartType(ChartShape.TypePie);//图表类型
  4.  
  5. chartpie.addSeries();
  6. chartpie.setSeriesYValueFormula(0, name + "!$B$25:$B$" + (24 + count));\\饼图数据源,饼图需要的具体数字,不包含总数,参数为 开始单元格结束单元格,EXCEL提供
  7. chartpie.setCategoryFormula(name + "!$A$25:$A$" + (24 + count));//数据对应的说明.如:货车 12辆,这里是货车
  8. chartpie.setVaryColors(true);
  9. this.getChartShapeAttribute(chartpie, 1);
  10. chartpie.setLegendPosition(ChartFormat.LegendPlacementRight);

  很简单的就插入到了EXCEL当中。下面附上JXCELL  API 网站:

  http://www.jxcell.net/

  优点:简单快捷,数据同步。与页面图表无关系。

  缺点:EXCEL自带的图表样式,如果EXCEL不支持,则JXLCELL也无能为力

 

总结:

  总体来说 JXCELL 优先级比较高,因为实现方便,但是对于复杂的图表则相对乏力,因为前台JS图表框架的发展迅猛,越来越多样式的图表展现在页面上,如地图类的

图表,EXCEL本省不能生成这些图表,这时候JXL则能够实现。POI据说实力强大,但本人没有去研究,故在此不做介绍。也希望熟悉POI的同僚能够反馈给我,在此加以补充

  本人初涉博客,目的方面自己方便大家,大家在发现博客有误时,还请能够反馈给我,在这小弟不胜感激,有来有往共同成就未来!

/*********************补充****************************/

  从发此篇随笔至今 也过去好久了,在此对此篇文章作出补充

  前面提到了对图表的导出一些常用的工具.

  在对于jxcell 工具 操作excel对图表进行导出时,犹豫jxcell api的不完善,方法的缺失?  或者属性方法的混乱,导致

在对excel操作图标时 往往不能绘制出想要的图表,

  再进一步的方法就是,利用模板实现导出功能,报表的导出 相信大家都有好几种方法好几种工具,其中就有一个利用模板导出,在模板

excel当中编写函数 使之实现大量数据的导出。不仅如此图表也可以实现,在模板excel当中选择合适的类型的图表(这比jxcel提供的图表类型可多得太多),

然后设置图表的动态数据源来实现图表的导出。同样缺点明显,类型满足,但样式美观差强人意,远远不如前端框架画出来的图标好看。

  目前上班中,至此先补充方法,晚上 会补充具体的实现方法和实例代码。

  

Jxl、JxCell图表导出功能的实现的更多相关文章

  1. SSI框架下,用jxl实现导出功能

    SSI框架下,用jxl实现导出功能 先说明一下,这个是SSI框架下,前端用ExtJs,应用在一个企业级的系统中的导出功能,因为是摸索着做的,所以里面有一些代码想整理一下,如果有人看到了,请视自己的架构 ...

  2. java jxl excel 导入导出的 总结(建立超链接,以及目录sheet的索引)

    最近项目要一个批量导出功能,而且要生成一个单独的sheet页,最后后面所有sheet的索引,并且可以点击进入连接.网上搜索了一下,找到一个方法,同时把相关的excel导入导出操作记录一下!以便以后使用 ...

  3. SpringCloud微服务实战——搭建企业级开发框架(三十):整合EasyExcel实现数据表格导入导出功能

      批量上传数据导入.数据统计分析导出,已经基本是系统必不可缺的一项功能,这里从性能和易用性方面考虑,集成EasyExcel.EasyExcel是一个基于Java的简单.省内存的读写Excel的开源项 ...

  4. 用SpringMvc实现Excel导出功能

    以前只知道用poi导出Excel,最近用了SpringMvc的Excel导出功能,结合jxl和poi实现,的确比只用Poi好,两种实现方式如下: 一.结合jxl实现: 1.引入jxl的所需jar包: ...

  5. FusionCharts V3图表导出图片和PDF属性说明(转)

    百闻不如一见,狠狠点击,快快下载:(演示文档有错误,不提供下载了.待新的演示文档出来.) 许多朋友说上面的DEMO用不了.fusioncharts官方的演示非常不错,就是来不及整理,各位大侠们可以研究 ...

  6. 实现excel导入导出功能,excel导入数据到页面中,页面数据导出生成excel文件

    今天接到项目中的一个功能,要实现excel的导入,导出功能.这个看起来思路比较清楚,但是做起了就遇到了不少问题. 不过核心的问题,大家也不会遇到了.每个项目前台页面,以及数据填充方式都不一样,不过大多 ...

  7. 解决highCharts导出功能汉化问题

    本文以highCharts中文网上的例子为原型,处理解决highCharts导出功能为英文的问题. 我们使用highCharts当然希望所有提示或文本都是中文的了,但是highCharts的默认语言是 ...

  8. Springboot---后台导出功能,easyExcel

    Sprintboot+vuejs+easyExcel实现excel导出功能 一.背景 前段时间,有个需求,想要做一个excel导出功能,用来把查询到的数据进行导出.第一次做,所以搜了大量的资料,分为两 ...

  9. 【HOW】如何限制Reporting Services报表导出功能中格式选项

    Reporting Services报表导出功能中缺省会提供多种导出格式选项,但很多情况下不需要全部的格式选项,因此需要对这些选项进行限制.下面我们以SQL Server 2008 R2为例来说明对这 ...

随机推荐

  1. [转]Hibernate入门:批量插入数据

    转自:http://blog.csdn.net/xiazdong/article/details/7709068 一般如果要插入100万条数据,则会写如下代码: package org.xiazdon ...

  2. BZOJ 4004 JLOI2015 装备购买 高斯消元+线性基

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4004 Description 脸哥最近在玩一款神奇的游戏,这个游戏里有 n 件装备,每件装 ...

  3. windows下 eclipse搭建spark java编译环境

    环境: win10 jdk1.8 之前有在虚拟机或者集群上安装spark安装包的,解压到你想要放spark的本地目录下,比如我的目录就是D:\Hadoop\spark-1.6.0-bin-hadoop ...

  4. 基于SDN的IP RAN网络虚拟化技术

    http://www.zte.com.cn/cndata/magazine/zte_technologies/2014/2014_4/magazine/201404/t20140421_422858. ...

  5. 【SSH】——封装参数不确定的分页查询

    [前言] 在BS中,分页技术的应用相当频繁.说到分页,简单的分页就很好实现了,如果在分页的基础上再加上业务逻辑,这就使得分页的技术更加的灵活了. [简单分页] 我们先看一种简单的分页,为了做到复用,我 ...

  6. Redis--各个数据类型最大存储量

    原文地址:https://redis.io/topics/data-types Strings类型:一个String类型的value最大可以存储512M Lists类型:list的元素个数最多为2^3 ...

  7. C# 利用WMI对象获取物理内存和可用内存大小

    下面的代码演示的是使用WMI对象可获取取物理内存和可用内存大小,在使用WMI对象前,先要添加对System.Management的引用,然后就可以调用WMI对象,代码如下: //获取总物理内存大小 M ...

  8. 【bzoj2768/bzoj1934】[JLOI2010]冠军调查/[Shoi2007]Vote 善意的投票 最小割

    bzoj2768 题目描述 一年一度的欧洲足球冠军联赛已经进入了淘汰赛阶段.随着卫冕冠军巴萨罗那的淘汰,英超劲旅切尔西成为了头号热门.新浪体育最近在吉林教育学院进行了一次大规模的调查,调查的内容就是关 ...

  9. 【luogu 1439 最长公共子序列】

    题目描述 给出1-n的两个排列P1和P2,求它们的最长公共子序列. 输入输出格式 输入格式: 第一行是一个数n, 接下来两行,每行为n个数,为自然数1-n的一个排列. 输出格式: 一个数,即最长公共子 ...

  10. bulk_insert_buffer_size and InnoDB

    Q: I read the following on this page http://dev.mysql.com/doc/mysql/en/server-system-variables.html ...