java做报表

Python031

java做报表,第1张

把数据库中需要的数据处理后做成可视化图表,根据不同需求可以做成不同形式的图表,节省时间,效果比较好,报表软件国外的话水晶报表,SAP公司的商业报表工具,作为SAP“集团”下的报表组件模块。10年事前盛行一时,后被SAP收购。但水晶报表(Crystal Report)在理论上只支持单数据集,对多集的支持依赖于数据库的运算能力(叉乘与联合等或写存储过程),多库一般难以支持。

国内的话FineReport,目前国内报表软件领域发展最成熟也是市场份额最高的。IDC的报告里,17年甚至超过SAP,IBM,在这个细分领域,也是Gartner的BI选型市场指南里唯一推荐的报表工具。零代码开发,类似excel的设计方式,上手简单。尤其数据字典、实际值和显示值等的设计更是切入快速开发的要害,这些放在别的语言和体系下往往要大量代码才能实现且频繁需要的功能放在FineReport里却只是几个操作的事情。移动端报表+可视化大屏。

使用 JFreeChart 生成各种样式的图表

限于篇幅的问题我们在这里只实现两种常用的图表,其他类型图表读者可以触类旁通。我们先给出柱状图的实现,饼图的实现再来跟柱状图进行比较。

1 柱状图

package lius.chart.demo

import java.io.*

import org.jfree.data.*

import org.jfree.chart.*

import org.jfree.chart.plot.*

/**

* 该类用于演示最简单的柱状图生成

* @author Winter Lau

*/

public class BarChartDemo {

public static void main(String[] args) throws IOException{

CategoryDataset dataset = getDataSet2()

JFreeChart chart = ChartFactory.createBarChart3D(

"水果产量图", // 图表标题

"水果", // 目录轴的显示标签

"产量", // 数值轴的显示标签

dataset, // 数据集

PlotOrientation.VERTICAL, // 图表方向:水平、垂直

true, // 是否显示图例(对于简单的柱状图必须是 false)

false, // 是否生成工具

false // 是否生成 URL 链接

)

FileOutputStream fos_jpg = null

try {

fos_jpg = new FileOutputStream("D:\\fruit.jpg")

ChartUtilities.writeChartAsJPEG(fos_jpg,100,chart,400,300,null)

} finally {

try {

fos_jpg.close()

} catch (Exception e) {}

}

}

/**

* 获取一个演示用的简单数据集对象

* @return

*/

private static CategoryDataset getDataSet() {

DefaultCategoryDataset dataset = new DefaultCategoryDataset()

dataset.addValue(100, null, "苹果")

dataset.addValue(200, null, "梨子")

dataset.addValue(300, null, "葡萄")

dataset.addValue(400, null, "香蕉")

dataset.addValue(500, null, "荔枝")

return dataset

}

/**

* 获取一个演示用的组合数据集对象

* @return

*/

private static CategoryDataset getDataSet2() {

DefaultCategoryDataset dataset = new DefaultCategoryDataset()

dataset.addValue(100, "北京", "苹果")

dataset.addValue(100, "上海", "苹果")

dataset.addValue(100, "广州", "苹果")

dataset.addValue(200, "北京", "梨子")

dataset.addValue(200, "上海", "梨子")

dataset.addValue(200, "广州", "梨子")

dataset.addValue(300, "北京", "葡萄")

dataset.addValue(300, "上海", "葡萄")

dataset.addValue(300, "广州", "葡萄")

dataset.addValue(400, "北京", "香蕉")

dataset.addValue(400, "上海", "香蕉")

dataset.addValue(400, "广州", "香蕉")

dataset.addValue(500, "北京", "荔枝")

dataset.addValue(500, "上海", "荔枝")

dataset.addValue(500, "广州", "荔枝")

return dataset

}

}

2 饼图

package lius.chart.demo

import java.io.*

import org.jfree.data.*

import org.jfree.chart.*

/**

* 用于演示饼图的生成

* @author Winter Lau

*/

public class PieChartDemo {

public static void main(String[] args) throws IOException{

DefaultPieDataset data = getDataSet()

JFreeChart chart = ChartFactory.createPie3DChart("水果产量图", // 图表标题

data,

true, // 是否显示图例

false,

false

)

// 写图表对象到文件,参照柱状图生成源码

}

/**

* 获取一个演示用的简单数据集对象

* @return

*/

private static DefaultPieDataset getDataSet() {

DefaultPieDataset dataset = new DefaultPieDataset()

dataset.setValue("苹果",100)

dataset.setValue("梨子",200)

dataset.setValue("葡萄",300)

dataset.setValue("香蕉",400)

dataset.setValue("荔枝",500)

return dataset

}

}

3将生成的图表移到浏览器上

package lius.chart.demo

import java.io.IOException

import javax.servlet.*

import javax.servlet.http.HttpServlet

import org.jfree.data.*

import org.jfree.chart.*

/**

* 演示通过 servlet 直接输出图表

* @author Winter Lau

*/

public class ChartDemoServlet extends HttpServlet {

public void service(ServletRequest req, ServletResponse res)

throws ServletException, IOException

{

res.setContentType("image/jpeg")

DefaultPieDataset data = getDataSet()

JFreeChart chart = ChartFactory.createPie3DChart("水果产量图",

data,

true,

false,

false

)

ChartUtilities.writeChartAsJPEG(res.getOutputStream(),

100,chart,400,300,null)

}

/**

* 获取一个演示用的简单数据集对象

* @return

*/

private static DefaultPieDataset getDataSet() {

DefaultPieDataset dataset = new DefaultPieDataset()

dataset.setValue("苹果",100)

dataset.setValue("梨子",200)

dataset.setValue("葡萄",300)

dataset.setValue("香蕉",400)

dataset.setValue("荔枝",500)

return dataset

}

}

4高级主题

很多情况我们不仅仅要求可以在浏览器上显示一个图表,我们更需要客户可以直接在图表上做一下交互的操作,例如获取信息提示,点击图表某个部分进行更详细信息的展示等等。例如前面生成的简单柱状图,用户需要在看到柱状图后点击某种水果例如是苹果即可看到各个地区苹果产量的情况。为此就要求该图形具有交互操作的功能。在 HTML 中为了让一个图像具有可交互的功能就必须给该图像定义一个 Map 对象。下表节选一段具有该功能的 HTML 代码:

<MAP NAME="chartMap">

<AREA SHAPE="RECT" COORDS="81,15,126,254" href="?series=0&category=100"

title="100 = 7,048"

onclick="javascript:clickChart('100')return false">

<AREA SHAPE="RECT" COORDS="143,27,188,255" href="?series=0&category=200"

title="200 = 6,721"

onclick="javascript: clickChart ('200')return false">

<AREA SHAPE="RECT" COORDS="205,54,250,255" href="?series=0&category=300"

title="300 = 5,929"

onclick="javascript: clickChart ('300')return false">

<AREA SHAPE="RECT" COORDS="267,85,312,255" href="?series=0&category=400"

title="400 = 5,005"

onclick="javascript: clickChart ('400')return false">

<AREA SHAPE="RECT" COORDS="329,17,374,255" href="?series=0&category=Diet"

title="Diet = 7,017" onclick="javascript:

clickChart ('Diet')return false">

</MAP>

由此就产生了一个问题:如果根据一个图像来生成对应的 MAP 对象。我们回头看看刚才的代码,在创建一个图表对象时候有两个参数,我们举柱状图的例子来讲这两个参数就是 ChartFactory. createBarChart3D 方法中的最后两个参数,这两个参数的类型都是布尔值。这两个参数意思分别是:是否创建工具提示 (tooltip) 以及是否生成 URL。这两个参数分别对应着 MAP 中一个 AREA 的 title 属性以及 href 属性。

可是我想知道的是怎么来产生这个 MAP 啊!哈哈,不要着急,JFreeChart 已经帮我们做好生成 MAP 对象的功能。为了生成 MAP 对象就要引入另外一个对象:ChartRenderingInfo。因为 JFreeChart 没有直接的方法利用一个图表对象直接生成 MAP 数据,它需要一个中间对象来过渡,这个对象就是 ChartRenderingInfo。

java开发报表工具有很多的呀,给题主介绍几款口碑和性价比不错的吧

1、Jasperreport:最常用的报表工具,常和Ireport搭配使用。可以在java环境下制作报表,支持PDF、XLS、HTML、CSV、XLM文件输出格式。

2、Irepoer:允许用户可视化编辑包含charts,图片,子报表等的复杂报表,还集成了TFreechart图表制作包。

3、BIRT:由数据连接,数据转换,业务逻辑设计,表现四个组成逻辑构成,可以设计制作简单的列表报表,交叉报表和文本报表,也支持饼图、折线图、柱形图等基础图表。

4、FineReport:类EXCEL界面,特色功能报表制作,报表权限配置,报表管理还有填报,支持各种数据库,能去各种数据源,专门针对解决复杂的中国式报表。