完整FusionChart技术的报表源代码和分析

        把最近弄的一个图形表表的实现跟大家分享分享吧。采用的是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

 }

}
这样就可以实现一个非常漂亮的报表了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值