把最近弄的一个图形表表的实现跟大家分享分享吧。采用的是FusionChart组件:
哪一个资金管理的例子来看吧,首先看action:
package com.ztev.fipmis.project;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import com.ztev.chartservlet.Constants;
import com.ztev.fipmis.BaseAction;
import com.ztev.fipmis.BaseDataEntry;
import com.ztev.fipmis.BaseService;
import com.ztev.fipmis.ServiceException;
import com.ztev.fipmis.SessionManager;
import com.ztev.fipmis.StringUtils;
import com.ztev.fipmis.baseinfo.AdcdBean;
import com.ztev.fipmis.baseinfo.AdcdService;
import com.ztev.fipmis.baseinfo.DeptService;
import com.ztev.fipmis.baseinfo.EmployeeBean;
import com.ztev.fipmis.baseinfo.ProjectService;
import com.ztev.fipmis.irrigation.util.AdcdIrUtil;
import com.ztev.fipmis.irrigation.util.UserAdcds;
import com.ztev.pagination.PageParameterSimple;
/**
*采用的是spring的MVC模式,注释来事务管理
*author 朱志国 zhu.zhiguo@hotmail.com
*/
@Controller
@RequestMapping("/project/schedule/")
public class ScheduleAction extends BaseAction {
@RequestMapping("chart.view")
public void showChart(@RequestParam("chartType") String chartType,
@RequestParam("areaCode") String areaCode,@RequestParam("buildYear") Integer buildYear,@RequestParam("invDept") String invDept,PageParameterSimple pp,
Schedule schedule, HttpServletResponse response,HttpSession session) throws IOException {
// session中取得,查询行政区
AdcdBean queryBean=new AdcdBean();
schedule=new Schedule(invDept, buildYear);
List<AdcdBean> rightAdcdBeans = adcdService.findListBylike(areaCode);
String adcds=AdcdIrUtil.getAdcdsCodeStr(rightAdcdBeans);
List<Plan> list=planService.findByAdcd(adcds,schedule);
String pids=AdcdIrUtil.getProjectPid(list);
Schedule schedule1 = this.scheduleService.findStat(pp, schedule,pids, 1);// 实施方案批复
Schedule schedule2 = this.scheduleService.findStat(pp, schedule,pids, 2);// 上周累计
Schedule schedule3 = this.scheduleService.findStat(pp, schedule,pids, 3);// 本周累计
Schedule schedule4 = this.scheduleService.findStat(pp, schedule,pids, 4);// 累计完成
if (schedule1 == null) {
schedule1 = new Schedule();
}
if (schedule2 == null) {
schedule2 = new Schedule();
}
if (schedule3 == null) {
schedule3 = new Schedule();
}
if (schedule4 == null) {
schedule4 = new Schedule();
}
queryBean.setDsc(adcdService.find(areaCode).getDsc()+BaseService.findInvertDeptValue().get(invDept));
queryBean.setAdcd(buildYear+"年度");
response.setContentType("text/xml");
response.setCharacterEncoding(Constants.servletEncoding);
ServletOutputStream srvltOut = response.getOutputStream();
/** 输出utf-8标记,否则显示中文会出现乱码 **/
srvltOut.write(new byte[] { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF });
int type = Constants.getChartServiceMap().get(chartType);
switch (type) {
case 1:// 3D柱状图
scheduleService.showCapitalColumnChart(schedule1, schedule2,
schedule3, schedule4, srvltOut,queryBean);
break;
case 2:// 3D柱状图
scheduleService.showCapitalColumnChart2(schedule1, schedule2,
schedule3, schedule4, srvltOut,queryBean);
break;
case 3:// 3D饼图
scheduleService.showCapitalPieChart(schedule1, srvltOut,queryBean);
break;
case 4:// 3D饼图
scheduleService.showCapitalPieChart(schedule2, srvltOut,queryBean);
break;
case 5:// 3D饼图
scheduleService.showCapitalPieChart(schedule3, srvltOut,queryBean);
break;
case 6:// 3D饼图
scheduleService.showCapitalPieChart(schedule4, srvltOut,queryBean);
break;
case 7:// 3D柱状图
scheduleService.showCountColumnChart(schedule1, schedule2,
schedule3, schedule4, srvltOut,queryBean);
break;
case 8:// 3D柱状图
scheduleService.showCountColumnChart2(schedule1, schedule2,
schedule3, schedule4, srvltOut,queryBean);
break;
case 9:// 3D柱状图
scheduleService.showCountColumnChart3(schedule1, schedule2,
schedule3, schedule4, srvltOut,queryBean);
break;
case 10:// 3D柱状图
scheduleService.showCountColumnChart4(schedule1, schedule2,
schedule3, schedule4, srvltOut,queryBean);
break;
}
srvltOut.flush();
}
}
下面是service层的业务逻辑:
public void showCountColumnChart4(Schedule schedule1, Schedule schedule2,
Schedule schedule3, Schedule schedule4, OutputStream outs,AdcdBean bean) {
Document doc = BuilderDocument(bean.getAdcd()+bean.getDsc()+"建设进度块石,土石方分类统计图");
Element chart = doc.getDocumentElement();
chart.setAttribute("numberSuffix", "立方米");
chart.setAttribute("formatNumber", "0");
chart.setAttribute("formatNumberScale", "0");
Element categories = doc.createElement("categories");
addXMLNode(chart, categories, doc);
Element category = doc.createElement("category");
category.setAttribute("label", "土石方");
addXMLNode(categories, category, doc);
category = doc.createElement("category");
category.setAttribute("label", "块石");
addXMLNode(categories, category, doc);
Element dataset = doc.createElement("dataset");
dataset.setAttribute("seriesName", "实施方案批复");
dataset.setAttribute("color", "AFD8F8");
dataset.setAttribute("showValues", "0");
addXMLNode(chart, dataset, doc);
Element set = doc.createElement("set");
set.setAttribute("value", StringUtils.valueOf(schedule1.getSoil()));
addXMLNode(dataset, set, doc);
set = doc.createElement("set");
set.setAttribute("value", StringUtils.valueOf(schedule1.getBlock()));
addXMLNode(dataset, set, doc);
dataset = doc.createElement("dataset");
dataset.setAttribute("seriesName", "上周累计完成");
dataset.setAttribute("color", "F6BD0F");
dataset.setAttribute("showValues", "0");
addXMLNode(chart, dataset, doc);
set = doc.createElement("set");
set.setAttribute("value", StringUtils.valueOf(schedule2.getSoil()));
addXMLNode(dataset, set, doc);
set = doc.createElement("set");
set.setAttribute("value", StringUtils.valueOf(schedule2.getBlock()));
addXMLNode(dataset, set, doc);
dataset = doc.createElement("dataset");
dataset.setAttribute("seriesName", "本周完成");
dataset.setAttribute("color", "8BBA00");
dataset.setAttribute("showValues", "0");
addXMLNode(chart, dataset, doc);
set = doc.createElement("set");
set.setAttribute("value", StringUtils.valueOf(schedule3.getSoil()));
addXMLNode(dataset, set, doc);
set = doc.createElement("set");
set.setAttribute("value", StringUtils.valueOf(schedule3.getBlock()));
addXMLNode(dataset, set, doc);
dataset = doc.createElement("dataset");
dataset.setAttribute("seriesName", "累计完成");
dataset.setAttribute("color", "A66EDD");
dataset.setAttribute("showValues", "0");
addXMLNode(chart, dataset, doc);
set = doc.createElement("set");
set.setAttribute("value", StringUtils.valueOf(schedule4.getSoil()));
addXMLNode(dataset, set, doc);
set = doc.createElement("set");
set.setAttribute("value", StringUtils.valueOf(schedule4.getBlock()));
addXMLNode(dataset, set, doc);
SerialDocument(outs, doc);
}
下面是正在把XML文件转化成输出流的类:
package com.ztev.chartservlet;
import java.io.OutputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
/**
*author 朱志国 zhu.zhiguo@hotmail.com
*/
public class DataFactoryBase {
//添加节点
public void addXMLNode(Element nodeName,Element newNode,Document doc){
try {
if( nodeName.getNodeName()==null ){
//System.out.println("该节点不存在!");
}else{
doc.createElement("newNode");
nodeName.appendChild(newNode);
}
}catch(Exception ex){
ex.printStackTrace();
}
}
//添加节点属性
public void addXMLNodeAttribute(Element nodeName,String attribute,String value){
try{
if(nodeName.getNodeName()==null){
System.out.println("该节点不存在!");
}else{
nodeName.setAttribute(attribute,value);
}
}catch(Exception ex){
ex.printStackTrace();
}
}
//如果查询的结果全为空,则生成NullInfo节点的XML
public void NullInfoNode(Document doc,Element RootNode,String strInfo){
Element chart=doc.createElement("chart");
addXMLNode(RootNode,chart,doc);
addXMLNodeAttribute(chart,"color","red");
addXMLNodeAttribute(chart,"caption", strInfo + "无数据!");
addXMLNodeAttribute(chart,"type","2");
addXMLNodeAttribute(chart,"showControl","true");
}
/**
* 生成操作XML的Doc类
* @param caption 图形标题
* @return
*/
public Document BuilderDocument(String caption){
try{
//定义工厂 API,使应用程序能够从 XML 文档获取生成 DOM 对象树的解析器
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
//应用程序员可以用DocumentBuilder从 XML中获取一个 Document
DocumentBuilder builder = factory.newDocumentBuilder();
//DOMImplementation 接口为执行独立于文档对象模型的任何特定实例的操作提供了许多方法
DOMImplementation impl = builder.getDOMImplementation();
//创建具有文档元素的指定类型的 DOM Document 对象
Document doc = impl.createDocument(null,"chart",null);
Element chart = doc.getDocumentElement();
chart.setAttribute("caption", caption);//标题
chart.setAttribute("bgColor", "99CCFF,FFFFFF");//背景色
chart.setAttribute("baseFontSize", "12");//字体大小
chart.setAttribute("font", "sinsum");//字体
chart.setAttribute("bgAlpha", "40,100");
chart.setAttribute("bgRatio", "0,100");
chart.setAttribute("bgAngle", "360");
chart.setAttribute("showBorder", "1");
return doc;
}
catch(Exception ex){
ex.printStackTrace();
return null;
}
}
//把Doc类序列化为一个XML流
public void SerialDocument(OutputStream outStream, Document doc){
try{
//通过 TransformerFactory.newTransformer 方法获取此类的实例
TransformerFactory tFactory = TransformerFactory.newInstance();
//可以使用此实例处理来自不同源的 XML,并将转换输出写入各种接收器
Transformer transformer = tFactory.newTransformer();
//以 Document Object Model(DOM)树的形式充当转换 Source 树的持有者
DOMSource source = new DOMSource(doc);
//充当转换结果的持有者,可以为 XML、纯文本、HTML 或某些其他格式的标记
StreamResult result = new StreamResult(outStream);
//把 XML资源文件转换成Result结果集.
transformer.transform(source, result);
}
catch(Exception ex){
ex.printStackTrace();
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
这样就可以实现一个非常漂亮的报表了。