精华内容
下载资源
问答
  • 报表生成

    千次阅读 2019-05-19 11:55:51
    简单的说:报表就是用表格、图表等格式来动态显示数据,可以用公式表示为:“报表 = 多样的格式 + 动态的数据” 表格:详细数据 图表: 直观 二.表格数据展示 2.1 准备了一 vo 报表中需的数据(准备的类) public ...

    一.什么是报表

    向上级报告情况的表格。简单的说:报表就是用表格图表等格式来动态显示数据,可以用公式表示为:“报表 = 多样的格式 + 动态的数据”

    • 表格:详细数据
    • 图表: 直观

    二.表格数据展示

    2.1 准备了一 vo

    报表中需的数据(准备的类)

    public class PurchasebillitemVO {
        //编号
        private Long id;
        //供应商
        private String supplierName;
        //采购员
        private String buyerName;
        //产品
        private String productName;
        //产品类型
        private String productTypeName;
        //日期
        private Date vdate;
        //数量
        private BigDecimal num;
        //单价
        private BigDecimal price;
        //小计
        private BigDecimal amount;
        //状态
        private Integer status;
    
        //分组字段
        private String groupField;
    
        public PurchasebillitemVO() {}
        //创建时设置值
        public PurchasebillitemVO(Purchasebillitem item,Integer groupBy) {
            this.id = item.getId();
            this.supplierName = item.getBill().getSupplier().getName();
            this.buyerName = item.getBill().getBuyer().getUsername();
            this.productName = item.getProduct().getName();
            this.productTypeName = item.getProduct().getTypes().getName();
            this.vdate = item.getBill().getVdate();
            this.num = item.getNum();
            this.price = item.getPrice();
            this.amount = item.getAmount();
            this.status = item.getBill().getStatus();
    
            //确定分组字段
            switch (groupBy){
                case 1:{
                    this.groupField = this.buyerName;
                    break;
                }
                case 2:{
                    this.groupField = (DateUtils.toCalendar(this.vdate).get(Calendar.MONTH)+1) +"月份";
                    break;
                }
                default:
                    this.groupField =this.supplierName;
            }
        }
        ...
    }
    

    2.2 前端展示

    easyui的一个扩展控制:groupview

    2.2.1 引入相应的js支持

    <script src="/easyui/plugins/datagrid-groupview.js"></script>

    2.2.2 高级查询字段

    <div id="tb" style="padding:5px;height:auto">
        <!-- 这里就是一个日历 -->
        <div id="cc" class="easyui-calendar"></div>
        <form id="searchForm" method="post" action="">
            采购时间: <input name="beginDate" class="easyui-datebox" data-options="sharedCalendar:'#cc'"
                         style="width:120px">
            - <input name="endDate" class="easyui-datebox" data-options="sharedCalendar:'#cc'" style="width:120px">
            状态:<select class="easyui-combobox" panelHeight="auto" name="status" style="width: 100px">
            <option value="">--请选择--</option>
            <option value="0">未审</option>
            <option value="1">已审</option>
            <option value="-1">作废</option>
        </select>
            <!-- 分组的条件 -->
            <select class="easyui-combobox" panelHeight="auto" name="groupBy" style="width: 100px">
                <option value="0">供应商</option>
                <option value="1">采购员</option>
                <option value="2">月份</option>
            </select>
            <a href="javascript:;" data-method="search" class="easyui-linkbutton" iconCls="icon-search">查询</a>
            <a href="javascript:;" data-method="show3d" class="easyui-linkbutton" iconCls="icon-search">3D</a>
            <a href="javascript:;" data-method="show2d" class="easyui-linkbutton" iconCls="icon-search">2D</a>
        </form>
    </div>
    <table id="itemsGrid"></table>
    

    2.2.3 案例进行修改

    //创建分组grid
    itemsGrid.datagrid({
        //title:'',
        // width:500,
        // height:250,
        fit:true,
        rownumbers:true,
        remoteSort:false,
        nowrap:false,
        fitColumns:true,
        //url:'datagrid_data.json',
        toolbar:"#tb",
        url:'/purchasebillitem/findItems',
        columns:[[
            {field:'id',title:'编号',width:100,sortable:true},
            {field:'supplierName',title:'供应商',width:100,sortable:true},
            {field:'buyerName',title:'采购员',width:100,sortable:true},
            {field:'productName',title:'产品',width:100,sortable:true},
            {field:'productTypeName',title:'产品类型',width:100,sortable:true},
            {field:'vdate',title:'采购日期',width:100,sortable:true},
            {field:'num',title:'数量',width:100,sortable:true},
            {field:'price',title:'价格',width:100,sortable:true},
            {field:'amount',title:'小计',width:100,sortable:true},
            {field:'status',title:'状态',width:100,sortable:true,formatter:statusFormat}
        ]],
        groupField:'groupField', //指示要被分组的字段
        view: groupview,
        groupFormatter:function(value, rows){ //组格式化
            let num = 0,amount = 0;
            for(let r of rows){
                num += r.num;
                amount += r.amount;
            }
            return value + ' - ' + rows.length + '条数据 <span style="color: green;">共'+num+'条数据</span> <span style="color: red;">总金额:'+amount +"</span>";
        }
    });
    

    三.图表展示

    • 两种技术:flash(actionscript),h5(画布)
    • flash缺点:不安全,容易崩溃
    • IE的话只能是flash的方式
    • 两个框架:highchart(收费,支持IE),echart(百度,开源免费)

    3.1 前端使用

    3.1.1 引入相应的js

    <!-- 引入highcharts的js支持 -->
    <script src="/js/plugin/highcharts/code/highcharts.js"></script>
    <script src="/js/plugin/highcharts/code/highcharts-3d.js"></script>
    <script src="/js/plugin/highcharts/code/modules/exporting.js"></script>
    <script src="/js/plugin/highcharts/code/modules/export-data.js"></script>
    

    3.1.2 弹出div进行展示

    1. 准备弹出来的
    <!-- 一个弹出框,里面要装一个form表单 -->
    <div id="chartDialog" class="easyui-dialog" title="图表展示"
         data-options="height:400,width:600,closed:true,modal:true">
        <div id="container" style="height: 320px"></div>
    </div>
    
    1. 点击3D按钮弹出图表
    show3d(){
        chartDialog.dialog("center").dialog("open");
        //拿到表单中的所有数据
        var params = searchForm.serializeObject();
        //通过Ajax到后台拿到相应的值[{name:xxx,y:10},]
        $.post("/purchasebillitem/findCharts",params,function (data) {
            //注意这里有一个异步问题
            var chart = Highcharts.chart('container', {
                chart: {
                    type: 'pie', //饼图
                    options3d: {
                        enabled: true,
                        alpha: 45,
                        beta: 0
                    }
                },
                title: {
                    text: '我是一个头'
                },
                tooltip: {
                    pointFormat: '{series.name}: <b>{point.percentage:.1f}%</b>'
                },
                plotOptions: {
                    pie: {
                        allowPointSelect: true,
                        cursor: 'pointer',
                        depth: 35,
                        dataLabels: {
                            enabled: true,
                            format: '{point.name}'
                        }
                    }
                },
                series: [{
                    type: 'pie',
                    name: '浏览器有',
                    data: data
                }]
            });
        })
    }
    

    3.2 后台获取参数

    1.修改query中的方法

    // where o.bill.status = ? and o.xxx =? ...
    //接收参数的变量
    private List params = new ArrayList();
    //准备一个方法,返回JPQL的查询条件
    public String createWhereJPQL(){
        StringBuilder jpql = new StringBuilder();
        //开始时间
        if(beginDate!=null){
            jpql.append(" and o.bill.vdate >= ? ");
            params.add(beginDate);
        }
        //结束时间
        if(endDate!=null){
            jpql.append(" and o.bill.vdate < ? ");
            params.add(DateUtils.addDays(endDate, 1));
        }
        //状态
        if(status!=null){
            jpql.append(" and o.bill.status = ? ");
            params.add(status);
        }
        //第一个条件必需是where开头
        return jpql.toString().replaceFirst("and", "where");
    }
    //创建分组的JPQL
    public String createGroupBy(){
        String groupStr = "o.bill.supplier.name";
        switch (groupBy){
            case 1:{
                groupStr="o.bill.buyer.username";
                break;
            }
            case 2:{
                groupStr="MONTH(o.bill.vdate)";
                break;
            }
        }
        return groupStr;
    }
    

    2.PurchasebillitemServiceImpl

    /**
     * 查询图表需要的数据
     * @param query
     */
    @Override
    public List<Map> findCharts(PurchasebillitemQuery query){
        List<Map> mapList = new ArrayList<>();
    
        //拿到条件JPQL
        String whereJPQL = query.createWhereJPQL();
        //拿到条件对应的参数
        List params = query.getParams();
        //准备分组的条件
        String groupBy = query.createGroupBy();
        //根据供应商分组拿到的数据
        String jpql = "select "+groupBy+",sum(o.amount) from Purchasebillitem o "+whereJPQL+" group by "+groupBy;
        List<Object[]> list = findByJpql(jpql,params.toArray());
        //需要把一个List<Object[]> -> List<Map>
        for (Object[] objects : list) {
            Map map = new HashMap();
            map.put("name", objects[0]);
            map.put("y", objects[1]);
            mapList.add(map);
        }
        return mapList;
    }
    
    展开全文
  • 这个工程可以跑起来,里面涵盖了所需要的jar包,报表的现实方式有两种,一种是以图片形式输出在本地,一种是输出到界面,是我用了几天时间实现的,有问题联系我QQ673707678
  • 自己写的java生成excel报表jar包,使用html中的table标签样式设计报表头部信息xml文件,接受list数据集生成excel报表。对结构不是太复杂的excel报表十分好用,有详细使用说明。最新添加了打印时间
  • 蓝梦报表生成器V2.05

    2009-03-28 15:52:53
    蓝梦报表生成器V2.05是一款功能强大,界面漂亮但的报表自动生成器,为delphi程序员在网格报表自动生成,数据导出Excel等提供了很大的便利,节省开发时间
  • Labview Office 报表生成工具包

    热门讨论 2012-03-12 20:51:44
    不具备自动报表生成的自动化测试程序通常被视作“入门级”程序,就像汽车里面的“奔奔”或者“QQ”。先前,生成专业的office报表几乎被少数几个VB或VC高手“垄断”,因为你除了要熟悉VB或VC外,还要熟悉Windows下的...
  • 项目中用到生成word报表报表中有表格的合并 、页眉、表格中会有报表图片。然后查找了网上的资料,利用echar生成柱状图,然后已base64串的方式发给后台,在后台解析成字节数组 ,利用poi生成到word文档中。

    poi生成word文档,word表格,将echar报表生成到word


      项目中用到生成word报表,报表中有表格的合并 、页眉、表格中会有报表图片。然后查找了网上的资料,利用echar生成柱状图,然后已base64串的方式发给后台,在后台解析成字节数组 ,利用poi生成到word文档中。



    先来张效果图:


    代码下载地址: 代码下载地址

    项目的主要代码:

    pom.xml  主要需要引入
    <dependency>
          <groupId>org.apache.poi</groupId>
          <artifactId>poi-ooxml</artifactId>
          <version>3.15</version>
        </dependency>
        <dependency>
          <groupId>org.apache.poi</groupId>
          <artifactId>poi-ooxml</artifactId>
          <version>3.15</version>
        </dependency>
      </dependencies>

    java代码:
    EchartsController.java
    
    
    
    

    package com.lyq.web;
    
    import com.lyq.util.ExportWordUtil;
    import org.apache.commons.io.FileUtils;
    import org.apache.poi.xwpf.usermodel.XWPFDocument;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Controller;
    import org.springframework.util.StringUtils;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    import sun.misc.BASE64Decoder;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.Calendar;
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * 
    *    
    * 创建人:lyq
    * 创建时间:2017-9-13 下午12:49:52
    * 修改备注:   
    * @version    
    *
     */
    @Controller
    @RequestMapping("/echarts")
    public class EchartsController {
    
    	private static final Logger logger = LoggerFactory.getLogger(EchartsController.class);
    
    	@RequestMapping(value="/viewEcharts")
    	@ResponseBody
    	public Map<String, Object> echartsMap(HttpServletRequest request, HttpServletResponse response) {
    		
    		Map<String, Object> map = new HashMap<String, Object>();
    		map.put("category", new String[]{"70年代人数","80年代人数","90年代人数","00年代人数"});
    		map.put("child", new int[] {10000,20000,30000,40000});
    		map.put("old", new int[] {30000,25000,20000,15000});
    		map.put("man", new int[]{1000000,1500000,1550000,1600000});
    		return map;
    	} 
    	
    	@RequestMapping("/goEchart")
    	public String goEchart(HttpServletRequest request, HttpServletResponse response) {
    		return "/echart";
    	}
    
    	/**
    	 * 报警分析报表下载
    	 */
    	@RequestMapping("/exportReport")
    	@ResponseBody
    	public Map<String,String> exportReport(HttpServletResponse response, HttpServletRequest request, String picBase64Info1) {
    		Map<String,String> map = new HashMap();
    		try {
    			byte[] base64Info1 = decodeBase64(picBase64Info1);
    			XWPFDocument xdoc = new ExportWordUtil().export(base64Info1);
    
    			Calendar c = Calendar.getInstance();
    			String fileName = "生成分析报告" + c.get(Calendar.YEAR) + to2String(String.valueOf((c.get(Calendar.MONTH) + 1)))
    					+ c.get(Calendar.DAY_OF_MONTH) + c.get(Calendar.HOUR_OF_DAY) + c.get(Calendar.MILLISECOND) + ".docx";
    			//获取存放路径
    			String classPath = FileUtils.class.getClassLoader().getResource("/").getPath();
    			String os_name = System.getProperties().get("os.name").toString().toLowerCase();
    			if (os_name.indexOf("windows") != -1) {
    				classPath = classPath.substring(1, classPath.indexOf("/WEB-INF/classes")) + "/upload/";
    			} else if (os_name.indexOf("linux") != -1) {
    				classPath = FileUtils.class.getProtectionDomain().getCodeSource().getLocation().getPath();
    				classPath = "/" + classPath.substring(1, classPath.indexOf("/WEB-INF/")) + "/upload/";
    			}
    			logger.info("==============report================" + classPath + fileName);
    			FileOutputStream fos = new FileOutputStream(classPath + fileName);
    			xdoc.write(fos);
    			fos.close();
    
    			map.put("ret", "/upload/" + fileName);
    			return map;
    		} catch (Exception e) {
    			logger.error(e.getMessage(), e);
    			map.put("ret", "faild");
    			return map;
    		}
    	}
    
    
    	/**
    	 * 解析base64,返回图片所在路径
    	 *
    	 * @param base64Info
    	 * @return
    	 */
    	private byte[] decodeBase64(String base64Info) {
    		if (StringUtils.isEmpty(base64Info)) {
    			return null;
    		}
    		BASE64Decoder decoder = new BASE64Decoder();
    		if (!base64Info.contains("base64,"))
    			return null;
    		String[] arr = base64Info.split("base64,");
    		// 数据中:data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABI4AAAEsCAYAAAClh/jbAAA
    		// ... 在"base64,"之后的才是图片信息
    		try {
    			return decoder.decodeBuffer(arr[1]);
    		} catch (IOException e) {
    			logger.info(e.getMessage(), e);
    			return null;
    		}
    	}
    
    	private String to2String(String str) {
    		if (str.length() > 2) {
    			str = str.substring(0, 2);
    		} else {
    			str = "0" + str;
    		}
    		return str;
    	}
    }
    

    ExportWordUtil.java
    
    
    /**
     * 
     */
    package com.lyq.util;
    
    import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
    import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy;
    import org.apache.poi.xwpf.usermodel.*;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import javax.imageio.stream.FileImageInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.math.BigInteger;
    import java.text.DecimalFormat;
    
    /**
     * 导出Excel公共方法
     * 
     * @author lyq
     */
    public class ExportWordUtil {
    	
    	private static final Logger logger = LoggerFactory.getLogger(ExportWordUtil.class);
    
    	/**
    	 * 导出word
    	 * @param base64Info1		报表图片数据
    	 * @return
    	 */
    	public XWPFDocument export(byte[] base64Info1) {
    		try {
    			CustomXWPFDocument xdoc = new CustomXWPFDocument();
    			// 创建页眉
    			createCtp(xdoc);
    
    			// 标题
    			createTitle(xdoc);
    
    			XWPFTable dTable = xdoc.createTable(4, 3);
    			createBaseInfoTable(dTable, xdoc, "未来科技", "谢谢侬",	"1024", "生成报表201709120056251");
    			// 标题一、未来科技数据统计分析
    			createTitle(xdoc, "一、	未来科技数据统计分析");
    
    			// 报表数据分析
    			XWPFTable dataReportTable = xdoc.createTable(4, 2);
    			createDataReportTable(dataReportTable, xdoc, base64Info1);
    
    			return xdoc;
    		} catch (Exception e) {
    			logger.error(e.getMessage(), e);
    			throw new RuntimeException("生成文件失败");
    		}
    	}
    
    	/**
    	 * 在cell 里面插入图片
    	 * @param xdoc
    	 * @param paragraph
    	 * @param imageByte
    	 */
    	private void createPic(CustomXWPFDocument xdoc, XWPFParagraph paragraph, byte[] imageByte) {
    		try {
    			xdoc.addPictureData(imageByte, XWPFDocument.PICTURE_TYPE_JPEG);
    		} catch (InvalidFormatException e) {
    			e.printStackTrace();
    		}
    		xdoc.createPicture(paragraph, xdoc.getAllPictures().size() - 1, 300, 200, "    ");
    	}
    
    	// 图片到byte数组
    	public byte[] image2byte(String path) {
    		byte[] data = null;
    		FileImageInputStream input = null;
    		try {
    			input = new FileImageInputStream(new File(path));
    			ByteArrayOutputStream output = new ByteArrayOutputStream();
    			byte[] buf = new byte[1024];
    			int numBytesRead = 0;
    			while ((numBytesRead = input.read(buf)) != -1) {
    				output.write(buf, 0, numBytesRead);
    			}
    			data = output.toByteArray();
    			output.close();
    			input.close();
    		} catch (FileNotFoundException ex1) {
    			ex1.printStackTrace();
    		} catch (IOException ex1) {
    			ex1.printStackTrace();
    		}
    		return data;
    	}
    
    	/**
    	 * 创建标题
    	 */
    	private void createTitle(CustomXWPFDocument xdoc) {
    		// 标题
    		XWPFParagraph titleMes = xdoc.createParagraph();
    		titleMes.setAlignment(ParagraphAlignment.CENTER);
    		XWPFRun r1 = titleMes.createRun();
    		r1.setBold(true);
    		r1.setFontFamily("华文仿宋");
    		r1.setText("未来科技平台统计分析报告");// 活动名称
    		r1.setFontSize(18);
    		r1.setColor("333333");
    		r1.setBold(true);
    	}
    
    	/**
    	 * 生成页眉
    	 */
    	public void createCtp(CustomXWPFDocument document) {
    		CTSectPr sectPr = document.getDocument().getBody().addNewSectPr();
    		XWPFHeaderFooterPolicy policy = new XWPFHeaderFooterPolicy(document, sectPr);
    		// 添加页眉
    		CTP ctpHeader = CTP.Factory.newInstance();
    		CTR ctrHeader = ctpHeader.addNewR();
    		CTText ctHeader = ctrHeader.addNewT();
    		String headerText = "我的报表我做主                                                                                         在我的地盘听我的";
    		ctHeader.setStringValue(headerText);
    		XWPFParagraph headerParagraph = new XWPFParagraph(ctpHeader, document);
    		// 设置为左对齐
    		headerParagraph.setAlignment(ParagraphAlignment.BOTH);
    		XWPFParagraph[] parsHeader = new XWPFParagraph[1];
    		parsHeader[0] = headerParagraph;
    		try {
    			policy.createHeader(XWPFHeaderFooterPolicy.DEFAULT, parsHeader);
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    
    	/**
    	 * 生成基础信息Table
    	 *
    	 * @param table
    	 * @param xdoc
    	 */
    	public void createBaseInfoTable(XWPFTable table, CustomXWPFDocument xdoc, String dateStr, String unitName,
    			String machineNum, String reportNo) {
    		String bgColor = "111111";
    		CTTbl ttbl = table.getCTTbl();
    		CTTblPr tblPr = ttbl.getTblPr() == null ? ttbl.addNewTblPr() : ttbl.getTblPr();
    		CTTblWidth tblWidth = tblPr.isSetTblW() ? tblPr.getTblW() : tblPr.addNewTblW();
    		tblWidth.setW(new BigInteger("8600"));
    		tblWidth.setType(STTblWidth.AUTO); // STTblWidth.AUTO 自动长度
    		mergeCellsVertically(table, 0, 0, 3);
    		setCellText(xdoc, getCellHight(table, 0, 0, 2400), "基 础 信 息", bgColor, 600, 14, "仿宋");
    		setCellText(xdoc, getCellHight(table, 0, 1, 600), "报告周期", bgColor, 1800, 14, "仿宋");
    
    		setCellText(xdoc, getCellHight(table, 0, 2, 600), dateStr, bgColor, 6200, 14, "仿宋");
    
    		setCellText(xdoc, getCellHight(table, 1, 1, 600), "单位名称", bgColor, 1800, 14, "仿宋");
    		if (unitName == null)
    			unitName = "";
    		setCellText(xdoc, getCellHight(table, 1, 2, 600), unitName, bgColor, 6200, 14, "仿宋");
    
    		setCellText(xdoc, getCellHight(table, 2, 1, 600), "主机数量", bgColor, 1800, 14, "仿宋");
    		setCellText(xdoc, getCellHight(table, 2, 2, 600), machineNum, bgColor, 6200, 14, "仿宋");
    
    		setCellText(xdoc, getCellHight(table, 3, 1, 600), "报告编号", bgColor, 1800, 14, "仿宋");
    		setCellText(xdoc, getCellHight(table, 3, 2, 600), reportNo, bgColor, 6200, 14, "仿宋");
    	}
    
    	/**
    	 * 生成标题
    	 * 
    	 * @param xdoc
    	 * @param titleText
    	 */
    	public void createTitle(CustomXWPFDocument xdoc, String titleText) {
    		XWPFParagraph headLine2 = xdoc.createParagraph();
    		headLine2.setAlignment(ParagraphAlignment.CENTER);
    		XWPFRun runHeadLine2 = headLine2.createRun();
    		runHeadLine2.setText(titleText);
    		runHeadLine2.setFontSize(16);
    		runHeadLine2.setFontFamily("华文仿宋");
    		runHeadLine2.setBold(true);
    		runHeadLine2.setColor("333333");
    	}
    
    
    
    	/**
    	 * 报表数据分析
    	 * 
    	 * @param table
    	 * @param xdoc
    	 */
    	public void createDataReportTable(XWPFTable table, CustomXWPFDocument xdoc, byte[] base64Info1) {
    		String bgColor = "111111";
    		CTTbl ttbl = table.getCTTbl();
    		CTTblPr tblPr = ttbl.getTblPr() == null ? ttbl.addNewTblPr() : ttbl.getTblPr();
    		CTTblWidth tblWidth = tblPr.isSetTblW() ? tblPr.getTblW() : tblPr.addNewTblW();
    		tblWidth.setW(new BigInteger("8600"));
    		tblWidth.setType(STTblWidth.AUTO); // STTblWidth.AUTO 自动长度
    		// mergeCellsVertically(table, 0, 0, 3);
    		mergeCellsHorizontal(table, 0, 0, 1);
    		
    		String  str = "";
    		Double sss = 0.6666666666666666;
    		DecimalFormat df = new DecimalFormat("0.00");
    
    		str = "(一)报告时间内误报率"+df.format((sss * 100))+"%";
    
    		setCellText(xdoc, getCellHight(table, 0, 0, 1200), str, bgColor, 8600, 14, "仿宋");
    
    		setCellText(xdoc, getCellHight(table, 1, 0, 1200), "报表数据", bgColor, 4300, 14, "仿宋");
    		setCellText(xdoc, getCellHight(table, 1, 1, 1200), "报表数据", bgColor, 4300, 14, "仿宋");
    
    		// 自动报警数量环比 报表
    		if(base64Info1 == null || base64Info1.length < 100){
    			setCellText(xdoc, getCellHight(table, 2, 0, 1200), "暂无数据", bgColor, 4300, 14, "仿宋");
    		} else {
    			setCellPic(xdoc, getCellHight(table, 2, 0, 1200), base64Info1);
    		}
    		// 自动报警数量同比 报表
    		if(base64Info1 == null || base64Info1.length < 100){
    			setCellText(xdoc, getCellHight(table, 2, 1, 1200), "暂无数据", bgColor, 4300, 14, "仿宋");
    		} else {
    			setCellPic(xdoc, getCellHight(table, 2, 1, 1200), base64Info1);
    		}
    		mergeCellsHorizontal(table, 3, 0, 1);
    		setCellText(xdoc, getCellHight(table, 3, 0, 1200), "数据汇总\n1:@@@@@@@@@@@@@@@@@@@@@\n2!!!!!!!!!!!!!!!!!!!!!!!!", bgColor, 4300, 14, "仿宋", ParagraphAlignment.LEFT,true);
    
    	}
    
    	// 设置表格高度
    	private XWPFTableCell getCellHight(XWPFTable xTable, int rowNomber, int cellNumber, int hight) {
    		XWPFTableRow row = null;
    		row = xTable.getRow(rowNomber);
    		row.setHeight(hight);
    		XWPFTableCell cell = null;
    		cell = row.getCell(cellNumber);
    		cell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);
    		return cell;
    	}
    
    	/**
    	 * 创建图片
    	 */
    	private void setCellPic(CustomXWPFDocument xdoc, XWPFTableCell cell, byte[] imageByte) {
    		createPic(xdoc, cell.addParagraph(), imageByte);
    	}
    
    	private void setCellText(CustomXWPFDocument xDocument, XWPFTableCell cell, String text, String bgcolor, int width,
    			int fontSize, String textType) {
    		setCellText(xDocument, cell, text, bgcolor, width, fontSize, textType, ParagraphAlignment.CENTER);
    	}
    
    	/**
    	 * 
    	 * @param xDocument
    	 * @param cell
    	 * @param text
    	 * @param bgcolor
    	 * @param width
    	 */
    	private void setCellText(CustomXWPFDocument xDocument, XWPFTableCell cell, String text, String bgcolor, int width,
    			int fontSize, String textType, ParagraphAlignment align) {
    		setCellText(xDocument, cell, text, bgcolor, width, fontSize, textType, align, false);
    	}
    
    	private void setCellText(CustomXWPFDocument xDocument, XWPFTableCell cell, String text, String bgcolor, int width,
    			int fontSize, String textType, ParagraphAlignment align, boolean isBold) {
    		CTTc cttc = cell.getCTTc();
    		CTTcPr cellPr = cttc.addNewTcPr();
    		cellPr.addNewTcW().setW(BigInteger.valueOf(width));
    		XWPFParagraph pIO = cell.addParagraph();
    		if (null == align) {
    			pIO.setAlignment(ParagraphAlignment.CENTER);
    		} else {
    			pIO.setAlignment(align);
    		}
    		cell.removeParagraph(0);
    
    		if (text.contains("\n")) {
    			String[] myStrings = text.split("\n");
    			for (int i = 0; i < myStrings.length; i++) {
    				String temp = myStrings[i];
    				if (isBold) {
    					if (i == 0) {
    						setTextStyle(pIO, textType, bgcolor, fontSize, temp, true, true);
    					} else {
    						setTextStyle(pIO, textType, bgcolor, fontSize, "      " + temp, true, false);
    					}
    				} else {
    					setTextStyle(pIO, textType, bgcolor, fontSize, temp, true, false);
    				}
    			}
    		} else {
    			setTextStyle(pIO, textType, bgcolor, fontSize, text, false, false);
    		}
    	}
    
    	private void setTextStyle(XWPFParagraph pIO, String textType, String bgcolor, int fontSize, String text,
    			boolean isEntery, boolean isBold) {
    		XWPFRun rIO = pIO.createRun();
    		if (textType == null || textType.equals("")) {
    			rIO.setFontFamily("微软雅黑");
    		} else {
    			rIO.setFontFamily(textType);
    		}
    		if (bgcolor == null || bgcolor.equals("")) {
    			rIO.setColor("000000");
    		} else {
    			rIO.setColor(bgcolor);
    		}
    		rIO.setFontSize(fontSize);
    		rIO.setText(text);
    		if (isBold)
    			rIO.setBold(true);
    		if (isEntery)
    			rIO.addBreak();
    	}
    
    	// 设置表格间的空行
    	public void setEmptyRow(CustomXWPFDocument xdoc, XWPFRun r1) {
    		XWPFParagraph p1 = xdoc.createParagraph();
    		p1.setAlignment(ParagraphAlignment.CENTER);
    		p1.setVerticalAlignment(TextAlignment.CENTER);
    		r1 = p1.createRun();
    	}
    
    	// word跨列合并单元格
    	public void mergeCellsHorizontal(XWPFTable table, int row, int fromCell, int toCell) {
    		for (int cellIndex = fromCell; cellIndex <= toCell; cellIndex++) {
    			XWPFTableCell cell = table.getRow(row).getCell(cellIndex);
    			if (cellIndex == fromCell) {
    				// The first merged cell is set with RESTART merge value
    				cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
    			} else {
    				// Cells which join (merge) the first one, are set with CONTINUE
    				cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
    			}
    		}
    	}
    
    	// word跨行并单元格
    	public void mergeCellsVertically(XWPFTable table, int col, int fromRow, int toRow) {
    		for (int rowIndex = fromRow; rowIndex <= toRow; rowIndex++) {
    			XWPFTableCell cell = table.getRow(rowIndex).getCell(col);
    			if (rowIndex == fromRow) {
    				// The first merged cell is set with RESTART merge value
    				cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);
    			} else {
    				// Cells which join (merge) the first one, are set with CONTINUE
    				cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);
    			}
    		}
    	}
    }


    CustomXWPFDocument.java
    
    
    package com.lyq.util;
    
    /**
     * Created by lyq on 2017/9/7.
     * POI 导出图片bug修复
     */
    
    import org.apache.poi.openxml4j.opc.OPCPackage;
    import org.apache.poi.xwpf.usermodel.XWPFDocument;
    import org.apache.poi.xwpf.usermodel.XWPFParagraph;
    import org.apache.xmlbeans.XmlException;
    import org.apache.xmlbeans.XmlToken;
    import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;
    import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D;
    import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTInline;
    
    import java.io.IOException;
    import java.io.InputStream;
    
    /**
     *
     */
    public class CustomXWPFDocument extends XWPFDocument {
    	
        public CustomXWPFDocument(InputStream in) throws IOException {
            super(in);
        }
    
        public CustomXWPFDocument() {
            super();
        }
    
        /**
         * @param pkg
         * @throws IOException
         */
        public CustomXWPFDocument(OPCPackage pkg) throws IOException {
            super(pkg);
        }  // picAttch 图片后面追加的字符串 可以是空格
        public void createPicture(XWPFParagraph paragraph,int id, int width, int height,String picAttch) {
            final int EMU = 9525;
            width *= EMU;
            height *= EMU;
            String blipId = getAllPictures().get(id).getPackageRelationship()
                    .getId();
    
            CTInline inline = paragraph.createRun().getCTR()
                    .addNewDrawing().addNewInline();
            paragraph.createRun().setText(picAttch);
            String picXml = ""
                    + "<a:graphic xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\">"
                    + "   <a:graphicData uri=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">"
                    + "      <pic:pic xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">"
                    + "         <pic:nvPicPr>" + "            <pic:cNvPr id=\""
                    + id
                    + "\" name=\"Generated\"/>"
                    + "            <pic:cNvPicPr/>"
                    + "         </pic:nvPicPr>"
                    + "         <pic:blipFill>"
                    + "            <a:blip r:embed=\""
                    + blipId
                    + "\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"/>"
                    + "            <a:stretch>"
                    + "               <a:fillRect/>"
                    + "            </a:stretch>"
                    + "         </pic:blipFill>"
                    + "         <pic:spPr>"
                    + "            <a:xfrm>"代码下载地址
                    + "               <a:off x=\"0\" y=\"0\"/>"
                    + "               <a:ext cx=\""
                    + width
                    + "\" cy=\""
                    + height
                    + "\"/>"
                    + "            </a:xfrm>"
                    + "            <a:prstGeom prst=\"rect\">"
                    + "               <a:avLst/>"
                    + "            </a:prstGeom>"
                    + "         </pic:spPr>"
                    + "      </pic:pic>"
                    + "   </a:graphicData>" + "</a:graphic>";
    
            inline.addNewGraphic().addNewGraphicData();
            XmlToken xmlToken = null;
            try {
                xmlToken = XmlToken.Factory.parse(picXml);
            } catch (XmlException xe) {
                xe.printStackTrace();
            }
            inline.set(xmlToken);
            // graphicData.set(xmlToken);
    
            inline.setDistT(0);
            inline.setDistB(0);
            inline.setDistL(0);
            inline.setDistR(0);
    
            CTPositiveSize2D extent = inline.addNewExtent();
            extent.setCx(width);
            extent.setCy(height);
    
            CTNonVisualDrawingProps docPr = inline.addNewDocPr();
            docPr.setId(id);
            docPr.setName("图片" + id);
            docPr.setDescr("");
        }
    }
    
    echar.jsp代码:
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    <html>
    <head>
    <link type="text/css" rel="stylesheet" media="all" href="<%=path %>/static/styles/styles.css" />
    <script type="text/javascript" src="<%=path %>/js/jquery-3.2.1.min.js"></script>
    <script type="text/javascript" src="<%=path %>/js/echarts.min.js"></script>
    </head>
    <style>
    	*{
    		margin:0px;
    		padding:0px;
    	}
    	#form {
    		padding-top:600px;
    		width:400px;
    		height:500px;
    	}
    	#btn {
    		padding:8px 20px;
    		color:#fff;
    		background:#141414;
    		border-radius:4px;
    		transition: all  1s ease;
    	}
    	#btn:hover{
    		background:#60c;transition: all  1s ease;
    		}
    </style>
    <body>
     <!-- 为ECharts准备一个具备大小(宽高)的Dom -->
        <div id="echart" style="height:400px;width:500px">
        	<h1>欢迎来到echart首页</h1>
        </div>
        <input type ="button" value="下载" οnclick="fn()"/>
        <!-- ECharts单文件引入 -->
    </body>
    <script type="text/javascript">
        var myChart ;
    	 $(function(){
    		//获得后台数据
    		var category;//年代
    		var child;//孩子
    		var old;//老人
    		var man;//大人
    		$.ajax({
    			url:'<%=path%>/echarts/viewEcharts.html',
    			async:false,
    			dataType: "json",
    			cache: false,
    			success: function(data){
    				category=data.category;
    				child=data.child;
    				old=data.old;
    				man=data.man;
                    // 基于准备好的dom,初始化echarts图表
                    myChart = echarts.init(document.getElementById('echart'),"echart");
    
                    var option = {
                        tooltip: {//提示框,鼠标悬浮交互时的信息提示
                            show: true
                        },
    
                        toolbox:{//定义工具按钮
                            show : true,
                            feature : {
                                dataView : {show: true, readOnly: false},//数据信息按钮
                                magicType : {show: true, //显示折线、柱状图等切换按钮
                                    type: ['line', 'bar','stack', 'tiled']}
                            }
                        },
                        legend: {//图例
                            data:['孩子','老人','大人']
                        },
                        xAxis : [//x轴设置
                            {
                                type : 'category',//x轴显示类别
                                data : category//年代
                            }
                        ],
                        yAxis : [//y轴设置
                            {
                                type : 'value'///y轴显示数据值
                            }
                        ],
                        series : [
                            {
                                "name":"孩子",
                                "type":"bar",
                                "data":child
                            },
                            {
                                "name":"老人",
                                "type":"bar",
                                "data":old
                            },
                            {
                                "name":"大人",
                                "type":"bar",
                                "data":man
                            }
                        ]
                    };
    
                    // 为echarts对象加载数据
                    myChart.setOption(option);
    			}
    			})
    
    	});
    
         function fn () {
             var data = {};
             data.picBase64Info1 = myChart.getDataURL();
             $.ajax({
                 url:'<%=path%>/echarts/exportReport.html',
                 type:"post",
                 data:data,
                 dataType:"json",
                 success:function(data1){
                     if('faild' == data1.ret){
                         alert('下载失败请重试...');
                     }else{
                         window.location.href = '../'+data1.ret;
                     }
                 }
             });
         }
        
    //     function down(ec){
    //         var data={};
    //         var myChart = ec.init(document.getElementById('echart'),"dark");
    //
    //     }
    
    
    
    </script>
    </html>

     
     
     
     
     
     
    主要代码如上所示,没有啥好说的,没啥难得,看看例子就能明白。
    代码下载地址
    
    
    展开全文
  • PD模型报表生成过程上机作业题1利用Powerdesigner分析和设计工具对校务管理系统 其功能有1)管理老师的模块包括:录入老师情况(姓名.地址.所教课程) 老师缺科记录(名字.时间.原因.课程) 2)管理学生的模块包括:录入学生...
  • PHP写的开源报表生成工具Reportico 2011-10-16 22:11:56 其实现在还没有足够的时间看这个工具,只是到软件首页初步了解了一下,感觉不错。灵活度非常大,直接定制报表的纸型、CSS显示样式、控制sql结果等。...

    PHP写的开源报表生成工具Reportico 2011-10-16 22:11:56


     

        其实现在还没有足够的时间看这个工具,只是到软件首页初步了解了一下,感觉不错。灵活度非常大,直接定制报表的纸型、CSS显示样式、控制sql结果等。总体说真是不错的。特别怕忘,所以在这做个记录,等咱细细学完了Mysql那本书之后再找时间消灭它!
    项目主页:http://www.reportico.org

    转载于:https://www.cnblogs.com/shsgl/p/5736642.html

    展开全文
  • 大概功能就是在网页上有一些数据参数,可以随便选中其中的几个,然后选中起始时间,有个按钮‘生成报表’,点击就分别生成这些参数的报表
  • 使用ireport+jasperReport报表生成

    千次阅读 2015-06-12 13:52:48
    一、报表样式设计  1、使用ireport Design进行报表可视化设计[下载地址:http://community.jaspersoft.com/project/ireport-designer]  2、打开ireport Design并新建一个blank A4的模板,如下所示,默认定义了...

    一、报表样式设计

           1、使用ireport Design进行报表可视化设计[下载地址:http://community.jaspersoft.com/project/ireport-designer]

            2、打开ireport Design并新建一个blank A4的模板,如下所示,默认定义了页面的不同结构

            

            3、我的目标报表需要有报告的title和一些统计的表格数据,而表格title我希望参数如,所以我在Parameters节点下添加了一个title的参数,然后将改参数拖动到右侧窗口“Title”区域上,调整参数框的位置和大小。

              另外我还希望显示一个执行时间,所以打开组件面板,将“Current Date”的组件也拖动到右侧窗口的Title区域。

            4、报表内容部分我希望填充一些统计的表格数据,首先需要设置列头,因为这个列头是不变的,所以我们打开组件面板,拖动几个“static text”组件到“column header”区域,并进行排版。

              表格内容我们从java代码中传入,所以需要定义几个参数,我们在“Fields”下新建几个Field并进行重命名。将建好的field参数拖到右侧窗口的“Detail 1”区域并进行排版。

              因为有时候数据会出现因为过长而被截断的现象,所以我们需要再对Details下的field属性进行设置,选择某一个field,然后将“Stretch with overflow”勾选,将该区域内其他的所有field的“stretch type”全部修改为“relative to band  height”。

            5、将xml compile为jasper格式,最终整体样式如下:


    二、jasper使用报表模板文件并生成最终报表

           1、引入jasper的依赖

    <dependency>
         <groupId>net.sf.jasperreports</groupId>
         <artifactId>jasperreports</artifactId>
         <version> 6.0 . 0 </version>
    </dependency>

           

            2、根据jasper报表的Field设计,新建一个java类,并且设置与之名字一样的成员,生成所有这些成员对应的set和get方法。

    CrashBean.java
    public  class  CrashBean {
         private  String hash;
         private  String number_o;
         private  String user_o;
         private  String number_l;
         private  String user_l;
         private  String imei;
         private  String product;
         private  String rom;
         private  String version;
         private  String call;
         private  String stack;
         private  String path;
         
         public  CrashBean() {
             super ();
         }
         
         
         public  CrashBean(String hash, String number_o, String user_o,
                 String number_l, String user_l, String imei, String product,
                 String rom, String version, String call, String stack, String path) {
             super ();
             this .hash = hash;
             this .number_o = number_o;
             this .user_o = user_o;
             this .number_l = number_l;
             this .user_l = user_l;
             this .imei = imei;
             this .product = product;
             this .rom = rom;
             this .version = version;
             this .call = call;
             this .stack = stack;
             this .path = path;
         }
     
         public  String getProduct() {
             return  product;
         }
     
         public  void  setProduct(String product) {
             this .product = product;
         }
     
         public  String getRom() {
             return  rom;
         }
     
         public  void  setRom(String rom) {
             this .rom = rom;
         }
     
         public  String getVersion() {
             return  version;
         }
     
         public  void  setVersion(String version) {
             this .version = version;
         }
     
         public  String getCall() {
             return  call;
         }
     
         public  void  setCall(String call) {
             this .call = call;
         }
     
         public  String getStack() {
             return  stack;
         }
     
         public  void  setStack(String stack) {
             this .stack = stack;
         }
     
         public  String getPath() {
             return  path;
         }
     
         public  void  setPath(String path) {
             this .path = path;
         }
     
         public  String getHash() {
             return  hash;
         }
         public  void  setHash(String hash) {
             this .hash = hash;
         }
         public  String getNumber_o() {
             return  number_o;
         }
         public  void  setNumber_o(String number_o) {
             this .number_o = number_o;
         }
         public  String getUser_o() {
             return  user_o;
         }
         public  void  setUser_o(String user_o) {
             this .user_o = user_o;
         }
         public  String getNumber_l() {
             return  number_l;
         }
         public  void  setNumber_l(String number_l) {
             this .number_l = number_l;
         }
         public  String getUser_l() {
             return  user_l;
         }
         public  void  setUser_l(String user_l) {
             this .user_l = user_l;
         }
         public  String getImei() {
             return  imei;
         }
         public  void  setImei(String imei) {
             this .imei = imei;
         }
    }

     

           3、使用JasperReport提供的方法设置报表参数和数据

    MyJasperReport.java
    import  java.util.ArrayList;
    import  java.util.HashMap;
    import  java.util.Map;
    import  org.slf4j.Logger;
    import  org.slf4j.LoggerFactory;
    import  net.sf.jasperreports.engine.JRDataSource;
    import  net.sf.jasperreports.engine.JasperExportManager;
    import  net.sf.jasperreports.engine.JasperFillManager;
    import  net.sf.jasperreports.engine.JasperPrint;
    import  net.sf.jasperreports.engine.JasperReport;
    import  net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
    import  net.sf.jasperreports.engine.util.JRLoader;
    public  class  MyJasperReport {
         private  Logger m_logger = LoggerFactory.getLogger( this .getClass());
         private  ArrayList<CrashBean> crashBeans =  new  ArrayList<CrashBean>();
         public  MyJasperReport(String jasperFile, String htmlReport,ArrayList<CrashBean> beans) {
             
    //      generatorBeanData();
             
             Map parameters =  new  HashMap();
             parameters.put( "reporttitle" "这是一个测试用的Title" );
             
             // 定义java bean数据源
             JRDataSource dataSource =  new  JRBeanCollectionDataSource(beans);
             try  {
                 JasperReport jasperReport = (JasperReport) JRLoader
                         .loadObjectFromFile(jasperFile);
                 JasperPrint print = JasperFillManager.fillReport(jasperReport,
                         parameters, dataSource);
                 JasperExportManager.exportReportToHtmlFile(print, htmlReport);
             catch  (Exception ex) {
                 m_logger.error(ex.getMessage());
                 ex.printStackTrace();
             }
         }
         
         public  void  generatorBeanData()
         {
         }
    }

    备注:报表除了html,还支持pdf、csv等多种格式

    展开全文
  • oracle 报表生成器的学习

    千次阅读 2008-09-22 15:30:00
    简单报表 最简单的报表由一些说明报表信息的标题组成,后跟通常作为一系列相交的行和栏以列表形式提供的报表数据。因此,简单的报表实际上是二维的,与您在电子表格中可能创建的类似。 取决于行和栏的固有属性,行和...
  • EBS_财务报表生成器(FSG)的设置

    千次阅读 2017-04-06 10:44:03
    财务报表生成器 (FSG) 是 Oracle General Ledger 的一个功能强大的报表建立工具。FSG做为最重要的一个财务报表开发工具,已经相当成熟,在从10i,11i中和后来的R12中变化并不大。 使用 FSG,您可以: ·...
  • ' 域帐号用户信息报表生成VBScript脚本操作 ' Sample VBScript to user information ' ----------------------------------------------- '列出AD帐号信息,并生成AD用户信息csv报表 Dim objRootDSE,objContainer ...
  • 其实,在报表生成过程中,每一步操作都力求准确(通过VBA、SQL等自动化手段,尽量减少容易出错的人工操作),按道理走到最后报表出现问题的概率很低。所以,这里的自检主要是随机抽取两条新数据,和上期已交付的报表...
  • jsp+servlet生成报表

    2016-04-13 12:41:42
    慕课网上jsp+servlet技术生成报表 一课的源码。并不完全,且要配数据库,但是基础知识点都是用到的,且能正常运行。希望对初学者有所帮助。我也是花了很多时间编写和调试的。
  • 安装报表生成器Report Builder

    千次阅读 2009-09-14 16:37:00
    真的是累啊,安装完成了SQL Server... 开始安装 老规矩,安装欢迎界面 同样是同意 你可以发现,其实Report Builder没有啥功能 采用默认是url 就直接安装吧 安装的时间比起SQL Server2008来讲,简直可以说是迅雷不及掩耳
  • navicat for mysql可以制作报表(制造业工厂项目实践总结):一、报表编辑器中有数据、设计、预览三个选项卡,每一个选项卡有自己的菜单。二、1、数据可以填写表、连接方式、栏位、计算、排序等拼接sql,也可以在sql...
  • 遇到了一个每周生成报表并发送至特定邮箱的需求,这个需求比较麻烦因为有三个难点: 1.如何将获取的数据生成excel文件,在这个项目中我使用的是POI,利用poi生成表格存储在特定的位置。 2.如何将表格作为附件发到...
  • .NET下的报表生成(二)

    千次阅读 2004-10-17 15:57:00
    2、报表工具让我们讨论一些在现存报表系统中被广泛使用的报表工具。如何在这些工具中选择最好的是一个非常关键的决定。在.NET下主要有三种报表工具:a) 水晶报表水晶报表(集成于Visual Studio .NET)是Visual ...
  • 利用reportviewer与C#生成报表

    千次阅读 2017-06-16 11:31:20
    利用reportviewer与C#生成报表。 这个是我自己做的总结,供大家参考。不足之处,请大家批评指针。 http://blog.sina.com.cn/s/blog_149e9d2ec0102vuue.html
  • Python-Excel报表自动化生成报表(一)

    万次阅读 多人点赞 2019-06-12 16:48:41
    使用python语言,实现对excel工作簿表格的自动化处理,自动生成各类统计报图表,让定期反复的报表处理工作变得简单快捷。
  • 大家平时都用过ELK做日志搜索和展示吧?kibana中有Visualize模块,能够生成各种各样的图表,但是只能对单一...这个问题涉及到每张表根据时间做统计后再次做处理生产一组数据,传递到前端JS生成要展示的报表的流程. 按道理
  • 而且有的报表可能极其复杂以及不规范,这时就会浪费程序员大量的时间来编写和调试这些代码,那到底有没有一种方法能使代码尽量少写,且又能实现各种Excel报表生成呢,下面我们就转入正题。 我们要生成Excel报
  • .NET下的报表生成(三)

    千次阅读 2004-10-23 09:47:00
    3、有效的Excel报表企业应用经常依赖于Excel报表来与如JD Edwards一样的其他ERP系统进行交互。受到金融和直销影响的项目经常大量使用Excel表格。客户端环境下的Excel自动操作经常使用Excel对象。但是这个部分主要...
  • 而且有的报表可能极其复杂以及不规范,这时就会浪费程序员大量的时间来编写和调试这些代码,那到底有没有一种方法能使代码尽量少写,且又能实现各种Excel报表生成呢,下面我们就转入正题。 我们要生成Exce
  • 目的:unix+oracle下每日生成前一天某统计报表,以一张统计表为例。   ----在unix下执行sh脚本---- sqlplus -s username/password @/home/zxin10/task/mazongxiao/sql.sql / column spf1 new_value spf1 ...
  • net关于企业Excel报表生成

    千次阅读 2006-02-22 17:31:00
    net关于企业Excel报表生成 选择自 yangyifan0 的 Blog 关键字 .net关于企业Excel报表生成 出处 作者:uponce 来源:http://blog.csdn.net/uponce/ 在一般的企业应用开发中都会涉及到报表生成,且一般报表...
  • 在数据分析师的日常工作中,经常会需要需要做定期的报告,例如每周、每月的市场营销报告、财务绩效报告、行业数据报告等等,这些报表以Word或PPT形式呈现给...有没有一款好用的可视化报表在线生成工具来快速完成这些报

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 75,951
精华内容 30,380
关键字:

报表生成时间