精华内容
下载资源
问答
  • 学生成绩统计分析

    千次阅读 2018-05-10 17:28:22
    <title> 学生单科成绩统计分析表 , initial-scale=1.0" name="viewport" /> <!-- BEGIN GLOBAL MANDATORY STYLES --> body { background: #fff !important; padding: 5px; ...


    <!DOCTYPE html>
    <!--[if IE 8]> <html lang="en" class="ie8 no-js"> <![endif]-->
    <!--[if IE 9]> <html lang="en" class="ie9 no-js"> <![endif]-->
    <!--[if !IE]><!-->
    <html lang="en" class="no-js">
        <!--<![endif]-->
        <!-- BEGIN HEAD -->
    
        <head>
            <meta charset="utf-8" />
            <title> 学生单科成绩统计分析表</title>
            <meta http-equiv="X-UA-Compatible" content="IE=edge">
            <meta content="width=device-width, initial-scale=1.0" name="viewport" />
            <meta content="" name="description" />
            <meta content="" name="author" />
            <meta name="MobileOptimized" content="320">
    
            <!-- BEGIN GLOBAL MANDATORY STYLES -->
            <link rel="stylesheet" type="text/css" href="../../../assets/plugins/font-awesome/css/font-awesome.min.css" />
            <link rel="stylesheet" type="text/css" href="../../../assets/plugins/bootstrap/css/bootstrap.min.css" />
            <link rel="stylesheet" type="text/css" href="../../../assets/plugins/data-tables/dataTables.bootstrap.css" />
            <link rel="stylesheet" type="text/css" href="../../../assets/plugins/data-tables/css/fixedHeader.bootstrap.min.css" />
    
            <link rel="stylesheet" type="text/css" href="../../../assets/css/report.css" />
            <link rel="stylesheet" type="text/css" href="../../../assets/css/report_udr.css" />
        </head>
        <style>
            body {
                background: #fff !important;
                padding: 5px;
                overflow-x: hidden;
            }
    
            .search input{
                width:50px;
            }
            .search2 input{
                width:70px;
            }         
            .red{
                color:red;
            }  
            .green{
                color:green;
            }
            .table{
                text-align: center;
            }
            .search{
                margin-bottom: 20px;
            }
            .wrong{
                position: absolute;
                top:226px;
                left:360px;
                display: none;
            }
            .form-control{
                width:120px;
                display: inline-block;
            }
            th{
                white-space: nowrap;
                vertical-align: middle !important;
            }   
            .btn{
                margin-left: 20px;
            }      
             
    
        </style>
    
        <body>
            <div class="rpt_header">
                <h4 class="rpt_title"></h4>
                <h4 class="rpt_title_ext"></h4>
            </div>           
            <div class="page-container">
                <div class="search">
                    <p class="range" style="text-align:center;font-size:18px;padding-top:10px;"></p>
                         请选择学科 : 
                    <select class="select form-control">
                        <option selected value="1">语文</option>
                        <option value="2">数学</option>
                        <option value="3">英语</option>
                        <option value="4">物理</option>
                        <option value="5">化学</option>
                        <option value="6">历史</option>
                        <option value="7">地理</option>
                        <option value="8">政治</option>
                        <option value="9">生物</option>
                    </select> 
                          请选择试卷类别 : 
                      <select class="select1 form-control">
                        <option selected value="0">全卷</option>
                        <option value="1">A卷</option>
                        <option value="2">B卷</option>
                    </select>                    
                    <div class="wrong"><span style="padding:20px;color:#999;font-size:30px;">没有检索到数据.</span></div>
                </div>
                <div class="search2" style="margin-top: 10px;">
                   	     高线 : <input type="text" class="high form-control"/>
                   	   中线 : <input type="text" class="mid form-control"/>
                    <button type="button" class="btn btn-primary" style="margin-left: 30px">查询</button>
                </div>
              
                <div class="page-content" style="margin-left: 0px;">
                    <div class="rpt_chart" id="rptChart"></div>
                    <table class="table table-striped table-bordered table-hover rpt_table" align='center'>
                    </table>
                </div>
            </div>
            <script type="text/javascript" src="../../../assets/lib/jquery-3.0.0.min.js"></script>
            <script type="text/javascript" src="../../../assets/plugins/backbone/underscore.js"></script>
            <script type="text/javascript" src="../../../assets/plugins/backbone/backbone.js"></script>
            <script type="text/javascript" src="../../../assets/plugins/jquery.cookie.min.js"></script>
    
            <script type="text/javascript" src="../../../assets/plugins/data-tables/jquery.dataTables.js"></script>
            <script type="text/javascript" src="../../../assets/plugins/data-tables/dataTables.bootstrap.min.js"></script>
            <script type="text/javascript" src="../../../assets/plugins/data-tables/dataTables.fixedHeader.min.js"></script>
            <script type="text/javascript" src="../../../assets/plugins/bootstrap/js/bootstrap.js"></script>
            <script type="text/javascript" src="../../../assets/plugins/purl.js"></script>
            <script type="text/javascript" src="../../../assets/plugins/pace/pace.min.js"></script>
            <script type="text/javascript" src="../../../assets/plugins/echart/echarts-all.js"></script>
    
            <script type="text/javascript" src="../../../assets/lib/zxt.js"></script>
            <script type="text/javascript" src="../../../assets/scripts/app.js"></script>
    		<script type="text/javascript" src="../../../assets/scripts/app_udr.js"></script>
            <script id="rpt_table" type="text/template">
                <thead>
                    <tr>
                        <th rowspan="2">学校</th>
                        <th rowspan="2">参考人数</th>
                        <th rowspan="1" colspan="2" style="text-align:center">优秀(80%)</th>
                        <th rowspan="1" colspan="2" style="text-align:center">及格(60%)</th> 
    					<th rowspan="1" colspan="2" style="text-align:center">学困(40%)</th> 
    					<th rowspan="1" colspan="2" style="text-align:center">高线(<%=data[0].highScore%>)</th> 
    					<th rowspan="1" colspan="2" style="text-align:center">中线(<%=data[0].midScore%>)</th> 
                    </tr>
    				<tr>
    					<th>人数</th>
    					<th>比例</th>
    					<th>人数</th>
    					<th>比例</th>
    					<th>人数</th>
    					<th>比例</th>
    					<th>人数</th>
    					<th>比例</th>
    					<th>人数</th>
    					<th>比例</th
    				</tr>
                </thead>
                <tbody>
                    <%_.each(data[0].data, function(d){%>
                    <tr>
                        <%for(var i=0;i<d.length;i++){%>
                            <%if(i==0){%>
                                <th><%=d[i]%></th>
                            <%}else{%>
    							<% if(i > 1 && i % 2 == 1 && d[i] != ""){%>
    								<th style="text-align:right;"><%=(d[i]*100).toFixed(2) + '%'%></th>
    							<%}else{%>
                               	 	<th style="text-align:right;"><%=d[i]%></th>
    							<%}%>
                            <%}%>
                        <%}%>
                    </tr>
                    <%})%>
                </tbody>
            </script>
    
            <script>
                jQuery(document).ready(function() {
                    var xkId = $('body', window.parent.document).attr('xkId');
                    if( xkId != undefined && xkId != null && xkId.length!=0){
                        $(".select").attr('disabled','true');
                        $(".select option[value='"+xkId+"']").attr('selected',true);
                    }
                    var exam = appUtils.getExamInfo(); 
                    var totalScore;
                    function getTotalScore(){
                        ZX.getDataByAjax(
                            "../../../rpt/single/rpt2008/tbl/"+exam.uid+"/"+exam.examId+"/"+$(".select").val(),
                            'json',
                            function(res){
                                $('.wrong').css('display','none');
                                $(".btn").removeAttr('disabled');
                                totalScore = res[0].paperScore;
                                $(".range").html('').html('自定义分数档 /分 (0 - '+totalScore+'): ');
                                
                            },
                            function(){
                                //判断dom节点是否被datatable了
                                if ($.fn.DataTable.isDataTable($('.rpt_table'))) { 
                                    //构建datatable的dom对象进行销毁
                                    $('.rpt_table').DataTable().destroy(true); 
                                    //销毁后 dom也会一并销毁,此处需要还原dom节点
                                    $('.page-content').append('<table class="table table-striped table-bordered table-hover rpt_table" align="center"></table>'); 
                                }                                 
                                $('.wrong').css('display','block');
                                $(".range").html('未查到该考试的分数信息');
                                $(".btn").attr('disabled',true);
                                $.zxtloading.close();
                            }
                        ); 
                    }   
                    getTotalScore(); 
    
                    
    
                    var url = "";
                    var xkId = $(".select").val();
                    $(".select").change(function(){
                    	var high = $(".high").val().trim(); 
                    	var mid = $(".mid").val().trim();
                    	if (high == '' || mid == ''){
                    		alert("不能有空值!");
                    	}else{
                            if(isNaN(high)){
                                alert("高线请输入数字!");
                            }else if(isNaN(mid)){
                            	alert("中线请输入数字!");
                            }
                            else if(parseFloat(high)<0 || parseFloat(high)>totalScore){
                                alert("高线超出分数范围!");
                            }else if(parseFloat(mid)<0 || parseFloat(mid)>totalScore){
                            	alert("中线超出分数范围!");
                            }
                            else{
                                high = parseFloat(parseFloat($(".high").val().trim()).toFixed(2));
                                $(".high").val(high);
                                mid = parseFloat(parseFloat($(".mid").val().trim()).toFixed(2));
                                $(".mid").val(mid);
                                var xkId = $(".select").val();
                                var section = $(".select1").val();
                                url = "../../../rpt/single/rpt2039/tbl/"+exam.uid+"/"+exam.examId+"/"+xkId+"/"+high+"/"+mid+"/"+section;
                                RptController.renderRptTable();
                                getTotalScore(); 
                            }
                   		 }   
                    });
                    
                    $(".select1").change(function(){
                    	var high = $(".high").val().trim(); 
                    	var mid = $(".mid").val().trim();
                    	if (high == '' || mid == ''){
                    		alert("不能有空值!");
                    	}else{
                            if(isNaN(high)){
                                alert("高线请输入数字!");
                            }else if(isNaN(mid)){
                            	alert("中线请输入数字!");
                            }
                            else if(parseFloat(high)<0 || parseFloat(high)>totalScore){
                                alert("高线超出分数范围!");
                            }else if(parseFloat(mid)<0 || parseFloat(mid)>totalScore){
                            	alert("中线超出分数范围!");
                            }
                            else{
                                high = parseFloat(parseFloat($(".high").val().trim()).toFixed(2));
                                $(".high").val(high);
                                mid = parseFloat(parseFloat($(".mid").val().trim()).toFixed(2));
                                $(".mid").val(mid);
                                var xkId = $(".select").val();
                                var section = $(".select1").val();
                                url = "../../../rpt/single/rpt2039/tbl/"+exam.uid+"/"+exam.examId+"/"+xkId+"/"+high+"/"+mid+"/"+section;
                                RptController.renderRptTable();
                                getTotalScore(); 
                            }
                   		 }  
                    });
                    
                    $(".btn").click(function(){
                                var high = $(".high").val().trim(); 
                            	var mid = $(".mid").val().trim();
                            	if (high == '' || mid == ''){
                            		alert("不能有空值!");
                            	}else{
                                    if(isNaN(high)){
                                        alert("高线请输入数字!");
                                    }else if(isNaN(mid)){
                                    	alert("中线请输入数字!");
                                    }
                                    else if(parseFloat(high)<0 || parseFloat(high)>totalScore){
                                        alert("高线超出分数范围!");
                                    }else if(parseFloat(mid)<0 || parseFloat(mid)>totalScore){
                                    	alert("中线超出分数范围!");
                                    }
                                    else{
                                        high = parseFloat(parseFloat($(".high").val().trim()).toFixed(2));
                                        $(".high").val(high);
                                        mid = parseFloat(parseFloat($(".mid").val().trim()).toFixed(2));
                                        $(".mid").val(mid);
    		                            var xkId = $(".select").val();
    		                            var section = $(".select1").val();
    		                            url = "../../../rpt/single/rpt2039/tbl/"+exam.uid+"/"+exam.examId+"/"+xkId+"/"+high+"/"+mid+"/"+section;
    		                            RptController.renderRptTable();
    		                            getTotalScore(); 
                                    }
                            }  
                    });                
                    var RptController = function() {
    
                        var renderRptTable = function() { 
                            //获取数据
                            $('.wrong').css('display','none');       
                            ZX.getDataByAjax(
                                url,
                                'json',
                                function(res){
                                    if(res.length==1 && _.isEmpty(res[0]) || res==null || res==undefined || res.length==0){
                                    //判断dom节点是否被datatable了
                                    if ($.fn.DataTable.isDataTable($('.rpt_table'))) { 
                                        //构建datatable的dom对象进行销毁
                                        $('.rpt_table').DataTable().destroy(true); 
                                        //销毁后 dom也会一并销毁,此处需要还原dom节点
                                        $('.page-content').append('<table class="table table-striped table-bordered table-hover rpt_table" align="center"></table>'); 
                                    }
                                    $('.wrong').css('display','block');                                 
                                        $.zxtloading.close();
                                    }else{
                                        var data = {};
                                        data["data"] = res;
                                        var high = $(".high").val().trim(); 
                                    	var mid = $(".mid").val().trim();
                                    	var section = $(".select1").val();
                                        //判断dom节点是否被datatable了
                                        if ($.fn.DataTable.isDataTable($('.rpt_table'))) { 
                                            //构建datatable的dom对象进行销毁
                                            $('.rpt_table').DataTable().destroy(true); 
                                            //销毁后 dom也会一并销毁,此处需要还原dom节点
                                            $('.page-content').append('<table class="table table-striped table-bordered table-hover rpt_table" align="center"></table>'); 
                                        }
                                                                          
                                        var xkId = $(".select").val(); 
                                        $('.rpt_table').zxtable({
                                            //url: url,
                                            data: data,
                                            template: '#rpt_table',
                                            exportURL: '../../../rpt/single/rpt2039/export/'+exam.uid+'/'+exam.examId+'/'+exam.examName+'/'+exam.yearIn+'/'+xkId+'/'+high+'/'+mid+'/'+section,
    
                                            needDataTable: true,
                                            renderTbody:false,
                                            orderby: [[ 0, "asc" ]], 
                                            fixedHeader: true,
    
                                            callBack: function(){
                                                $.zxtloading.close();
                                            }
                                        });                                    
                                    }                                
                                    
                                },
                                function(){
                                    //判断dom节点是否被datatable了
                                    if ($.fn.DataTable.isDataTable($('.rpt_table'))) { 
                                        //构建datatable的dom对象进行销毁
                                        $('.rpt_table').DataTable().destroy(true); 
                                        //销毁后 dom也会一并销毁,此处需要还原dom节点
                                        $('.page-content').append('<table class="table table-striped table-bordered table-hover rpt_table" align="center"></table>'); 
                                    }                                 
                                    $('.wrong').css('display','block');
                                    $.zxtloading.close();
                                }
                            );
                        };
                        return {
                            renderRptTable: function() {
                                renderRptTable();
                            }
                        }
                    }();
                    var initView = function() {
                        return {
                            init: function() {
                                $.cookie.json = true;
                                //启动加载进度条
                                if( exam.uid == undefined){
                                    alert("参数非法.");
                                    $.zxtloading.close();
                                    return false;
                                }
                                if( exam.examId == undefined){
                                    alert("请先选择考试.");
                                    $.zxtloading.close();
                                    return false;
                                }
                                Pace.start();
                            }
                        }
                    }();
                    initView.init();
    
                });
    
            </script>
            <!-- END JAVASCRIPTS -->
        </body>
        <!-- END BODY -->
    
    </html>


    package cn.doofen.udr.controller.single;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    import cn.doofen.udr.UDRBaseConst;
    import cn.doofen.udr.bo.single.ISingleBo;
    import cn.doofen.udr.bo.single.impl.Rpt2039Bo;
    import cn.doofen.udr.controller.SingleController;
    import cn.doofen.udr.controller.UDRBaseParam;
    import cn.doofen.udr.utils.Unit2Utils;
    
    import com.alibaba.fastjson.JSONArray;
    import com.alibaba.fastjson.JSONObject;
    
    /**
     * 
     * @Package cn.doofen.udr.controller.multi
     * @ClassName: Rpt2039Controller
     * @Description: 学生单科成绩统计分析表
     * @author fyq
     * @date 2018年05月04日
     * 
     */
    
    @Controller
    @RequestMapping("/rpt/single/rpt2039")
    public class Rpt2039Controller extends SingleController {
    
    	private static ISingleBo bo = new Rpt2039Bo();
    
    	/**
    	 * 
    	 * @Title: rpt2039_tble
    	 * @Description: 获取报表列表数据
    	 * @param uid
    	 * @param examId
    	 * @param yearIn
    	 * @return 参数
    	 * @return JSONObject
    	 * @throws
    	 */
    	@RequestMapping(value = "/tbl/{orgId}/{examId}/{xkId}/{high}/{mid}/{section}", method = RequestMethod.GET)
    	@ResponseBody
    	public JSONObject rpt2035_tble(@PathVariable(value = "orgId") Long orgId,
    			@PathVariable(value = "examId") Long examId,
    			@PathVariable(value = "high") Double high,
    			@PathVariable(value = "mid") Double mid,
    			@PathVariable(value = "section") Integer section,
    			@PathVariable(value = "xkId") Integer xkId) {
    		try {
    			UDRBaseParam param = new UDRBaseParam();
    			param.setExamId(examId);
    			param.setOrgId(orgId);
    			param.setXkId(xkId);
    			param.setHigh(high);
    			param.setMid(mid);
    			param.setSection(section);
    			JSONArray rjarr = loadTblData(param);
    
    			return getSuccessResult(rjarr);
    		} catch (Exception e) {
    			return getErrorResult("");
    		}
    	}
    
    
    
    	/**
    	 * 
    	 * @Title: exportExcel
    	 * @Description: 导出excel
    	 * @param request
    	 * @param response
    	 * @param uid
    	 * @param examName
    	 * @param examId
    	 * @param yearIn
    	 *            参数
    	 * @return void
    	 * @throws
    	 */
    	@RequestMapping(value = "/export/{orgId}/{examId}/{examName}/{yearIn}/{xkId}/{high}/{mid}/{section}", method = RequestMethod.GET)
    	@ResponseBody
    	public void exportExcel(HttpServletRequest request,
    			HttpServletResponse response,
    			@PathVariable(value = "orgId") Long orgId,
    			@PathVariable(value = "examName") String examName,
    			@PathVariable(value = "examId") Long examId,
    			@PathVariable(value = "yearIn") Integer yearIn,
    			@PathVariable(value = "high") Double high,
    			@PathVariable(value = "mid") Double mid,
    			@PathVariable(value = "section") Integer section,
    			@PathVariable(value = "xkId") Integer xkId) {
    
    		try {
    			// 注意协议头有字节数限制,所以fileName不能超长
    			Unit2Utils u2u = new Unit2Utils();
    			String xkName = u2u.excelXKChange(xkId);
    			String secName = "";
    			if(section == 0){
    				secName = "全卷";
    			}else if (section == 1){
    				secName = "A卷";
    			}else if (section == 2){
    				secName = "B卷";
    			}
    			String fileName = getExcelName(request, UDRBaseConst.RPT_2035_NAME+"_"+xkName+"("+secName+")"+"_"+examName);
    
    			response.reset();
    			response.setContentType("application/vnd.ms-excel"); // 改成输出excel文件
    			response.setHeader("Content-disposition", "attachment; filename="
    					+ fileName);
    
    			UDRBaseParam param = new UDRBaseParam();
    			param.setExamId(examId);
    			param.setOrgId(orgId);
    			param.setYearIn(yearIn);
    			param.setXkId(xkId);
    			param.setExamName(examName);
    			param.setXkName(xkName);
    			param.setHigh(high);
    			param.setMid(mid);
    			param.setSection(section);
    			exportExcel(request, response, param);
    
    		} catch (Exception e) {
    			logger.warn(e.getMessage());
    		}
    	}
    
    	/**
    	 * 
    	 * @Title: loadTblData
    	 * @Description: 获取页面table数据
    	 * @param param
    	 *            参数
    	 * @return 参数
    	 * @return JSONObject
    	 * @throws
    	 */
    	protected JSONArray loadTblData(UDRBaseParam param) throws Exception {
    		if (param.getOrgId() != null && param.getExamId() != null
    				&& param.getXkId() != null) {
    			return bo.loadTblData(param);
    		}
    
    		return null;
    	}
    
    	/**
    	 * 
    	 * @Title: loadChartData
    	 * @Description: 获取页面chart的数据
    	 * @param param
    	 * @return 参数
    	 * @return JSONObject
    	 * @throws
    	 */
    	protected JSONArray loadChartData(UDRBaseParam param) throws Exception {
    		if (param.getOrgId() != null && param.getExamId() != null
    				&& param.getXkId() != null) {
    			return bo.loadChartData(param);
    		}
    		return null;
    	}
    
    	/**
    	 * 
    	 * @Title: exportExcel
    	 * @Description: 导出Excel
    	 * @param param
    	 * @return 参数
    	 * @return void
    	 * @throws
    	 */
    	protected void exportExcel(HttpServletRequest request,
    			HttpServletResponse response, UDRBaseParam param) throws Exception {
    		if (param.getOrgId() != null && param.getExamId() != null
    				&& param.getExamName() != null && param.getYearIn() != null
    				&& param.getXkId() != null && param.getXkName()!=null) {
    			bo.exportExcel(request, response, param);
    		}
    
    	}
    }
    


    package cn.doofen.udr.bo.single.impl;
    
    import java.io.OutputStream;
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.poi.hssf.usermodel.HSSFCell;
    import org.apache.poi.hssf.usermodel.HSSFCellStyle;
    import org.apache.poi.hssf.usermodel.HSSFRow;
    import org.apache.poi.hssf.usermodel.HSSFSheet;
    import org.apache.poi.ss.util.CellRangeAddress;
    
    import cn.doofen.udr.UDRBaseConfig;
    import cn.doofen.udr.UDRBaseConst;
    import cn.doofen.udr.bo.single.ISingleBo;
    import cn.doofen.udr.controller.UDRBaseParam;
    import cn.doofen.udr.utils.Unit2Utils;
    
    import com.alibaba.fastjson.JSONArray;
    import com.alibaba.fastjson.JSONObject;
    import com.zxt.framework.export.RptExcelDomain;
    import com.zxt.framework.utils.PropertiesConfigUtils;
    
    /**
     * 
     * @Package cn.doofen.udr.bo.multi.impl
     * @ClassName: Rpt2035Bo
     * @Description: rpt2035的业务接口 学校分类的单学科总体分析
     * @author Zed
     * @date 2016年11月29日
     * 
     */
    public class Rpt2039Bo extends SingleBoImpl implements ISingleBo {
    
    	private static final String DSI_EXT_RPT_TBL_2039 = PropertiesConfigUtils
    			.getString("dsi.ext.rpt.tbl.2039");
    
    	
    	private static final String logo = PropertiesConfigUtils
    			.getString("logo");	
    
    	/**
    	 * 
    	 * @Title: loadTblData
    	 * @Description: 获取页面table数据
    	 * @param param
    	 *            参数
    	 * @return 参数
    	 * @return JSONArray
    	 * @throws
    	 */
    	public JSONArray loadTblData(UDRBaseParam param) throws Exception {
    		JSONObject uparam = new JSONObject();
    		uparam.put("xkId", param.getXkId());
    		uparam.put("orgId", param.getOrgId());
    		uparam.put("examId", param.getExamId());
    		uparam.put("high", param.getHigh());
    		uparam.put("mid", param.getMid());
    		uparam.put("section", param.getSection());
    		JSONArray resJarr = null;
    		if (UDRBaseConfig.SYS_DEBUG) {
    			Unit2Utils u2u = new Unit2Utils();
    			resJarr = u2u.getTestJSONArray("TestJSONArray1035.txt");
    
    		} else {
    			String url = getHttpDSIRestUri4Report(DSI_EXT_RPT_TBL_2039);
    			JSONObject rjo = httpRestGet(url, uparam.toString(), null);
    			if (rjo != null && !rjo.isEmpty()
    					&& rjo.getBooleanValue("success") == true) {
    				JSONObject job = rjo.getJSONObject("data");
    				resJarr = new JSONArray();
    				resJarr.add(job);
    			} else if (rjo != null && !rjo.isEmpty()) {
    				throw new Exception("Load chart data failed, beacause : "
    						+ rjo.getString("error"));
    			} else {
    				throw new Exception(
    						"Load chart data failed, beacause dsi response is null.");
    			}
    		}
    		return resJarr;
    	}
    
    	/**
    	 * 
    	 * @Title: loadChartData
    	 * @Description: 获取页面chart的数据
    	 * @param param
    	 * @return 参数
    	 * @return JSONOArray
    	 * @throws
    	 */
    	public JSONArray loadChartData(UDRBaseParam param) throws Exception {
    		return null;
    	}
    
    	/**
    	 * 
    	 * @Title: exportExcel
    	 * @Description: 导出Excel
    	 * @param param
    	 * @return 参数
    	 * @return void
    	 * @throws
    	 */
    	public void exportExcel(HttpServletRequest request,
    			HttpServletResponse response, UDRBaseParam param) throws Exception {
    			//输出表格的头部名称
    				Unit2Utils unit2=new Unit2Utils();
    				String xkName=unit2.excelXKChange(param.getXkId());
    				int sec = param.getSection();
    				String secName = null;
    				if(sec == 0){
    					secName = "全卷";
    				}else if (sec == 1){
    					secName = "A卷";
    				}else if (sec == 2){
    					secName = "B卷";
    				}
    				String title = UDRBaseConst.RPT_2039_NAME ;
    				String logo=PropertiesConfigUtils.getString("logo")+SHEET_TITLE;
    				OutputStream os = null;
    				try{
    				os = response.getOutputStream();
    				//获取数据
    				JSONObject jo =loadTblData(param).getJSONObject(0);
    				RptExcelDomain rptDo = new RptExcelDomain();
    				rptDo.setSheetName( logo+title);
    				rptDo.setSheetTitle( logo+title+","+xkName+"("+secName+")");
    				//所有数据的JSONArray
    				JSONArray ja = new JSONArray();
    				ja.add( jo);
    				rptDo.setSheetData( ja);
    				List<RptExcelDomain> sheets = new ArrayList<RptExcelDomain>();
    				sheets.add( rptDo);
    				setSheets( sheets);
    				//写入数据
    				writeExcel(os,true);
    
    		} catch (Exception e) {
    			throw new Exception("Export Excel failed, beacause"
    					+ e.getMessage());
    		} finally {
    			os.close();
    		}
    	}
    	
    	/**
    	 * 重载excel创建
    	 *
    	 */
    	protected void writeExcelSheetSelf( RptExcelDomain rptDomain){
    		// 创建Excel的工作sheet,对应到一个excel文档的tab
    		HSSFSheet sheet = wb.createSheet( rptDomain.getSheetName());
    		// 设置excel每列宽度
    		sheet.setColumnWidth(0, 6000);
    		sheet.setColumnWidth(1, 2500);
    		// 创建Excel的sheet的一行
    		HSSFRow row =null;
    		String[] titleDefault = {"学校", "参考人数"}; 
    		String[] headers = {"人数", "比例"};
    		/*---------------------------------------
    		 * 创建sheet的数据
    		 *--------------------------------------*/
    		JSONArray datas = rptDomain.getSheetData();
    		Object[] titles = datas.getJSONObject(0).getJSONArray( "head").toArray();
    		Integer xkMerg =  (titles.length-titleDefault.length)*headers.length;
    		JSONArray rowDatas = datas.getJSONObject(0).getJSONArray( "data");
    		//装第一行的表头数据
    		JSONArray ja=new JSONArray();
    		ja.add("学校");
    		ja.add("参考人数");
    		for(int i=titleDefault.length;i<titles.length;i++){
    			String schName=datas.getJSONObject(0).getJSONArray( "head").getJSONObject(i).getString("itemName");
    			ja.add(schName);
    		}
    	    titles=ja.toArray();
    	    //拿出副标题和主标题
    	    String str=rptDomain.getSheetTitle();
    	    String [] strs=new String[2];
    	    strs=str.split(",");
    	    String head1=strs[0];
    	    String head2=strs[1];
    
    		// 创建Excel的sheet的一行
    		row = sheet.createRow(0);
    		row.setHeight((short) rptDomain.getSheetTitleHeight());// 设定行的高度
    		// 创建一个Excel的单元格
    		HSSFCell cell_title = row.createCell(0);
    		// 合并单元格(startRow,endRow,startColumn,endColumn)
    		sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, xkMerg+titleDefault.length-1));
    		// 给Excel的单元格设置样式和赋值
    		cell_title.setCellStyle( this.getStyleTitle());
    		cell_title.setCellValue( head1);
    		
    		 
    		//副标题
    		row = sheet.createRow(1);
    		// 创建一个Excel的单元格
    		HSSFCell cell_title1 = row.createCell(0);
    		sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, xkMerg+titleDefault.length-1));
    		//给单元格设置样式和赋值
    		cell_title1.setCellType(HSSFCellStyle.ALIGN_LEFT);
    		
    		cell_title1.setCellValue(head2);
    		//构建表头
    		//第一行
    		HSSFCellStyle headerStyle = this.getStyleHeader();
    		row = sheet.createRow(2);
    		HSSFCell cell_header = null;
    		for( int i = 0; i <titleDefault.length; i++ ){
    			cell_header = row.createCell( i );
    			sheet.addMergedRegion(new CellRangeAddress( 2, 3, i,i));
    			cell_header.setCellStyle( headerStyle);
    			cell_header.setCellValue( titleDefault[i]);
    		}
    		int startHcl = titleDefault.length;
    		for( int i = 2; i < titles.length; i++){
    			cell_header = row.createCell(  startHcl );
    			sheet.addMergedRegion(new CellRangeAddress( 2, 2,  startHcl, startHcl+headers.length-1 ));
    			cell_header.setCellStyle( headerStyle);
    			cell_header.setCellValue((String)titles[i]);
    			startHcl = startHcl + headers.length;
    		}
    		//第二行
    		row = sheet.createRow(3);
    		int startCol = titleDefault.length;
    		for( int i = 2; i < titles.length; i++){
    			for( int j = 0; j < headers.length; j++){
    				cell_header = row.createCell(  startCol );
    				cell_header.setCellStyle( headerStyle);
    				cell_header.setCellValue( (String)headers[j]);
    				startCol = startCol + 1;
    			}
    		}
    		int startRow = 3;
    		//构建独立表的数据
    		for( int d =0; d <rowDatas.size(); d++ ){
    			startRow = startRow + 1;
    			row = sheet.createRow( startRow );
    			JSONArray _cellDatas = rowDatas.getJSONArray(d);
    			HSSFCell cell_Data = null;
    			for(int j = 0; j < _cellDatas.size(); j++){
    				cell_Data = row.createCell(j);
    				if(j > 1 && j % 2 == 1 && !_cellDatas.getString(j).equals("")){
    					cell_Data.setCellValue(String.format("%.2f",_cellDatas.getDouble(j)*100)+"%");
    				}else{
    					cell_Data.setCellValue(_cellDatas.getString(j));
    				}
    			}
    
    		}
    	}
    }
    
    package cn.doofen.dsi.core.bo.org.impl.or;
    
    import cn.doofen.dsi.core.bo.BOException;
    import cn.doofen.dsi.core.bo.DsiBOImpl;
    import cn.doofen.dsi.core.bo.check.BaseCheck;
    import cn.doofen.dsi.core.bo.org.ior.IOrgRpt0028;
    import cn.doofen.dsi.core.ctrl.pub.data.DataErrorCode;
    import cn.doofen.dsi.core.eao.BxoEAO;
    import cn.doofen.dsi.core.eao.BxoEAOImpl;
    import cn.doofen.dsi.core.eao.CicadaEAO;
    import cn.doofen.dsi.core.eao.CicadaEAOImpl;
    import cn.doofen.dsi.core.eao.OrgEAO;
    import cn.doofen.dsi.core.eao.OrgEAOImpl;
    
    import com.alibaba.fastjson.JSONArray;
    import com.alibaba.fastjson.JSONObject;
    import com.doofen.dict.core.bbo.dto.BBOOrg;
    import com.doofen.dict.core.beo.dto.BEOExam;
    
    /**
     * 
     * @Package cn.doofen.dsi.core.bo.org.impl.or
     * @ClassName: OrgRpt0028Impl
     * @Description: 获取报表单科/全科学校分类分析
     * @author fyq
     * @date 2018年05月03日
     * 
     */
    public class OrgRpt0028Impl extends DsiBOImpl implements IOrgRpt0028 {
    
        @Override
        /**
         * 
         * @Title: get
         * @Description: 获取报表  学校分类单科/全科分析
         * @param orgId
         * @param examId
         * @param xkId
         * @return {"width":11,head:[],data:[[],..]}
         * @throws Exception    参数
         * @return JSONObject
         * @throws
         */
        public JSONObject get(Long orgId, Double high, Double mid, Long examId, Integer xkId, Integer section) throws Exception {
            BaseCheck checkH = new BaseCheck();
            // 获取基础数据
            BBOOrg org = checkH.checkOrg(orgId);
            BEOExam exam = checkH.checkExamOrg(examId, orgId);
            if (xkId == 0) {
    
            } else {
                checkH.checkExamPaper(examId, xkId);
            }
    
            // 获取index
            String index = getOrgIndex(exam.getExamDate());
    
            // 获取数据
            return getData(index, org, exam, xkId, high, mid,section);
        }
    
        /**
         * 
         * @Title: getData
         * @Description: 获取具体数据
         * @param index
         * @param orgId
         * @param exam
         * @param xkId
         * @return {"width":11,"head":[],"data":[..],..}
         * @throws Exception
         *             参数
         * @return JSONObject
         * @throws
         */
        private JSONObject getData(String index, BBOOrg org, BEOExam exam, Integer xkId, Double high, Double mid, Integer section) throws Exception {
            JSONObject jo = new JSONObject();
            OrgEAO eao = new OrgEAOImpl(index);
            Long examId = exam.getExamId();
            Long orgId = org.getOrgId();
            JSONObject Data = new JSONObject();
            if (xkId.intValue() == 0) {
                Data = eao.getStatOrgScoreMix(orgId, examId);
            } else {
                Data = eao.getStatOrgScore(orgId, examId, xkId);
            }
            if ((Data == null) || (Data.isEmpty())) {
                throw new BOException(DataErrorCode.ECODE_DATA_LACK, "考试(" + examId + ")" + "机构分析数据没有找到");
            }
            JSONArray examSches = Data.getJSONArray("examSches");
    
            JSONObject schInfo = getSchIds(examSches);
            JSONArray datas = pre_data(schInfo, xkId, exam, examId, eao, orgId, high, mid, section);
    
            JSONArray head = new JSONArray();
            head.add("学校");
            head.add("参考人数");
          	JSONObject headContent = new JSONObject();
          	headContent.put("itemName", "优秀");
          	headContent.put("subNum", 2);
          	JSONArray subHead = new JSONArray();
          	subHead.add("人数");
          	subHead.add("比例");
          	headContent.put("subHead", subHead);
          	head.add(headContent);
          	headContent = new JSONObject();
          	headContent.put("itemName", "及格");
          	headContent.put("subNum", 2);
          	subHead = new JSONArray();
          	subHead.add("人数");
          	subHead.add("比例");
          	headContent.put("subHead", subHead);
          	head.add(headContent);
          	headContent = new JSONObject();
          	headContent.put("itemName", "学困");
          	headContent.put("subNum", 2);
          	subHead = new JSONArray();
          	subHead.add("人数");
          	subHead.add("比例");
          	headContent.put("subHead", subHead);
          	head.add(headContent);
          	headContent = new JSONObject();
          	headContent.put("itemName", "高线("+high+")");
          	headContent.put("subNum", 2);
          	subHead = new JSONArray();
          	subHead.add("人数");
          	subHead.add("比例");
          	headContent.put("subHead", subHead);
          	head.add(headContent);
          	headContent = new JSONObject();
          	headContent.put("itemName", "中线("+mid+")");
          	headContent.put("subNum", 2);
          	subHead = new JSONArray();
          	subHead.add("人数");
          	subHead.add("比例");
          	headContent.put("subHead", subHead);
          	head.add(headContent);
    
            jo.put("head", head);
            jo.put("data", datas);
            jo.put("highScore", high);
            jo.put("midScore", mid);
            return jo;
        }
    
        /**
         * 
         * @Title: getSchIds
         * @Description:获取参加考试的学校id
         * @param examSches
         * @return 参数
         * @return {schIds:[],shName:[]}
         * @throws
         */
        private JSONObject getSchIds(JSONArray examSches) {
            JSONObject jo = new JSONObject();
            Long[] schIds = new Long[examSches.size()];
            String[] schNames = new String[examSches.size()];
            for (int i = 0; i < examSches.size(); i++) {
                JSONObject sch = examSches.getJSONObject(i);
                schIds[i] = sch.getLong("schId");
                schNames[i] = sch.getString("schName");
            }
            jo.put("schIds", schIds);
            jo.put("schNames", schNames);
            return jo;
        }
    
        /**
         * @throws Exception
         * 
         * @Title: pre_data
         * @Description: 拿每一个学校的数据
         * @param schInfo
         * @return 参数
         * @return JSONArray
         * @throws
         */
        private JSONArray pre_data(JSONObject schInfo, Integer xkId, BEOExam exam, Long examId, OrgEAO eao,  Long orgId, Double high, Double mid, Integer section) throws Exception {
            // TODO Auto-generated method stub
            JSONObject schData = new JSONObject();
            JSONArray datas = new JSONArray();
            if (xkId == 0) {
                schData = eao.getExtStatSchScoreMix(orgId, examId);
            } else {
                schData = eao.getExtStatSchScore(orgId, examId, xkId);
            }
            Long[] schIds = schInfo.getObject("schIds", Long[].class);
            JSONObject OrgBase = new JSONObject();
            JSONArray CicadaEAO = new JSONArray();
            Long highNum = null;
            Long midNum = null;
            Long passNum = null;
            if (xkId == 0) {
                OrgBase = eao.getStatSchScoreMix(orgId, examId);
                for (int i = 0; i < schIds.length; i++) {
                    JSONArray tmp = new JSONArray();
                    JSONObject data = schData.getJSONObject(schIds[i].toString());
                    if (data == null || data.isEmpty()) {
                        continue;
                    }
                    String schName = data.getString("schName");
                    JSONObject schBase = OrgBase.getJSONObject(schIds[i].toString());
                    int schStuNum = schBase.getInteger("schStuNum");
                    double totalScore = data.getDoubleValue("paperScore");
                    double pass = totalScore*0.6;
                    int schEStuNum = schBase.getIntValue("schEStuNum");
                    double schEStuPer = schBase.getDoubleValue("schEStuPer");
                    int schDStuNum = schBase.getIntValue("schDStuNum");
                    double schDStuPer = schBase.getDoubleValue("schDStuPer");
                    highNum = eao.getExtStatStuMixHighNum(orgId, examId, schIds[i], high);
                    double highPer = (double)highNum/schStuNum;
                    midNum = eao.getExtStatStuMixMidNum(orgId, examId, schIds[i], mid);
                    double midPer = (double)midNum/schStuNum;
                    passNum = eao.getExtStatStuPassNum(orgId, examId, schIds[i], pass);
                    double passPer = (double)passNum/schStuNum;
                    tmp.add(schName);
                    tmp.add(schStuNum);
                    tmp.add(schEStuNum);
                    tmp.add(schEStuPer);
                    tmp.add(passNum);
                    tmp.add(passPer);
                    tmp.add(schDStuNum);
                    tmp.add(schDStuPer);
                    tmp.add(highNum);
                    tmp.add(highPer);
                    tmp.add(midNum);
                    tmp.add(midPer);
                    datas.add(tmp);
                }
    
            } else {
                OrgBase = eao.getStatSchScore(orgId, examId, xkId);
               
                for (int i = 0; i < schIds.length; i++) {
                    JSONArray tmp = new JSONArray();
                    JSONObject data = schData.getJSONObject(schIds[i].toString());
                    if (data == null || data.isEmpty()) {
                        continue;
                    }
                    BxoEAO beao = new BxoEAOImpl();
                    String schName = data.getString("schName");
                    
                    JSONObject schBase = OrgBase.getJSONObject(schIds[i].toString());
                    int schStuNum = schBase.getInteger("schStuNum");
                    
                    if(section == 0){ 
                        int schEStuNum = schBase.getIntValue("schEStuNum");
                        double schEStuPer = schBase.getDoubleValue("schEStuPer");
                        int schPassNum = schBase.getIntValue("schPassNum");
                        double schPassPer = schBase.getDoubleValue("schPassPer");
                        int schDStuNum = schBase.getIntValue("schDStuNum");
                        double schDStuPer = schBase.getDoubleValue("schDStuPer");
                        highNum = eao.getExtStatStuHighNum(orgId, examId, schIds[i], high, xkId);
                        double highPer = (double)highNum/schStuNum;
                        midNum = eao.getExtStatStuMidNum(orgId, examId, schIds[i], mid, xkId);
                        double midPer = (double)midNum/schStuNum;
                        tmp.add(schName);
                        tmp.add(schStuNum);
                        tmp.add(schEStuNum);
                        tmp.add(schEStuPer);
                        tmp.add(schPassNum);
                        tmp.add(schPassPer);
                        tmp.add(schDStuNum);
                        tmp.add(schDStuPer);
                        tmp.add(highNum);
                        tmp.add(highPer);
                        tmp.add(midNum);
                        tmp.add(midPer);
                        datas.add(tmp);
                    } else if(section == 1){
                    	long paperId = data.getLongValue("paperId");
                        JSONArray secArr = beao.getSectionScore(paperId);
                        JSONObject secObj = secArr.getJSONObject(0);
                        JSONArray ABscores = secObj.getJSONArray("sectionPaperScores");
                        JSONObject Ascores = ABscores.getJSONObject(0);
                        double Ascore = Ascores.getDoubleValue("disScore");
                        double Escore = Ascore*0.8;
                        double Pscore = Ascore*0.6;
                        double Dscore = Ascore*0.4;
                        int Enum = 0;
                        int Pnum = 0;
                        int Dnum = 0;
                    	String index = getCicadaIndex(exam.getExamDate(), schIds[i]);
                    	CicadaEAO ceao = new CicadaEAOImpl(index);
                    	CicadaEAO = ceao.getStatStuScoreNum(examId, xkId);
                         for(int j = 0; j < CicadaEAO.size(); j++){
                        	 JSONObject stuscores = CicadaEAO.getJSONObject(j);
                        	 JSONArray abscores = stuscores.getJSONArray("stuSections");
                        	 if(abscores != null ){
    	                    	 JSONObject ascores = abscores.getJSONObject(0);
    	                    	 double ascore = ascores.getDoubleValue("disStuScore");
    	                    	 if (ascore >= Escore ){
    	                    		 ++Enum;
    	                    	 }
    	                    	 if (ascore >= Pscore){
    	                    		 ++Pnum;
    	                    	 }
    	                    	 if (ascore < Dscore){
    	                    		 ++Dnum;
    	                    	 }
                        	 }
                        	 
                         }
                         double schEStuPer = (double)Enum/schStuNum;
                         double schPassPer = (double)Pnum/schStuNum;;
                         double schDStuPer = (double)Dnum/schStuNum;;
                         tmp.add(schName);
                         tmp.add(schStuNum);
                         tmp.add(Enum);
                         tmp.add(schEStuPer);
                         tmp.add(Pnum);
                         tmp.add(schPassPer);
                         tmp.add(Dnum);
                         tmp.add(schDStuPer);
                         tmp.add("");
                         tmp.add("");
                         tmp.add("");
                         tmp.add("");
                         datas.add(tmp);
                    	
                    }else if(section == 2){
                    	long paperId = data.getLongValue("paperId");
                        JSONArray secArr = beao.getSectionScore(paperId);
                        JSONObject secObj = secArr.getJSONObject(0);
                        JSONArray ABscores = secObj.getJSONArray("sectionPaperScores");
                        JSONObject Bscores = ABscores.getJSONObject(1);
                        double Bscore = Bscores.getDoubleValue("disScore");
                        double Escore = Bscore*0.8;
                        double Pscore = Bscore*0.6;
                        double Dscore = Bscore*0.4;
                        int Enum = 0;
                        int Pnum = 0;
                        int Dnum = 0;
                    	String index = getCicadaIndex(exam.getExamDate(), schIds[i]);
                    	CicadaEAO ceao = new CicadaEAOImpl(index);
                    	CicadaEAO = ceao.getStatStuScoreNum(examId, xkId);
                         for(int j = 0; j < CicadaEAO.size(); j++){
                        	 JSONObject stuscores = CicadaEAO.getJSONObject(j);
                        	 JSONArray abscores = stuscores.getJSONArray("stuSections");
                        	 if(abscores != null ){
    	                    	 JSONObject bscores = abscores.getJSONObject(1);
    	                    	 double bscore = bscores.getDoubleValue("disStuScore");
    	                    	 if (bscore >= Escore ){
    	                    		 ++Enum;
    	                    	 }
    	                    	 if (bscore >= Pscore){
    	                    		 ++Pnum;
    	                    	 }
    	                    	 if (bscore < Dscore){
    	                    		 ++Dnum;
    	                    	 }
                        	 }
                        	 
                         }
                         double schEStuPer = (double)Enum/schStuNum;
                         double schPassPer = (double)Pnum/schStuNum;;
                         double schDStuPer = (double)Dnum/schStuNum;;
                         tmp.add(schName);
                         tmp.add(schStuNum);
                         tmp.add(Enum);
                         tmp.add(schEStuPer);
                         tmp.add(Pnum);
                         tmp.add(schPassPer);
                         tmp.add(Dnum);
                         tmp.add(schDStuPer);
                         tmp.add("");
                         tmp.add("");
                         tmp.add("");
                         tmp.add("");
                         datas.add(tmp);
                    }
        
                }
            }
         
            return datas;
        }
    
    }
    


    展开全文
  •   本章将以初三年级的期中考试成绩为例,应用EXCEL中的数据透视表和数据分析中的描述统计功能,先对本次的成绩进行总体分析。   参考人数共652人,14个班,其中一名学生部分科目缺考,为了保证学生的私密,对...

    第1章 考试成绩表总体分析

    • 【 前 言 】 2
      • 第1章 考试成绩表总体分析 4
        • 1.1异常数据排查 4
        • 1.2利用“描述统计”对成绩进行总体分析 5
        • 实例1-2 5

      本章将以初三年级的期中考试成绩为例,应用EXCEL中的数据透视表和数据分析中的描述统计功能,先对本次的成绩进行总体分析。
      参考人数共652人,14个班,其中一名学生部分科目缺考,为了保证学生的私密,对学生的姓名作了修改,其结构如表1.01所示,并命名数据表名称为“总表”。
    表1.01 学生成绩总表

    1.1异常数据排查

      拿到了成绩数据后,首先是要检查数据的完整性,其次是对一些异常的数据进行排除。数据的完整性就是检查成绩数据是否缺漏,参考人数是否正确。异常的数据比如缺考的学生,得分为0的或成绩为空值的,采用什么方式进行排查呢?可以使用EXCEL中的筛选、排序等工具,对一些异常的数据进行隔离处理。对于不完整的数据信息,如果没有考试过程中的记录,还应该追查具体原因。在整理数据前,要注意做好原始数据的备份,以备对照检查。

    1.2利用“描述统计”对成绩进行总体分析

      “描述统计”是EXCEL的【数据分析】中自带的全面数据分析功能,利用此功能,可以非常快速地统计出数据的各项常见指标。

    实例1-2

    1、操作过程

      单击【数据】菜单,在最右边找到【数据分析】(如果没有,请先加载,步骤是单击【菜单】-【加载】,在弹出的窗口中选择“加载项”-“分析工具库”,单击【确定】),单击进入【数据分析】面板,选择“描述统计”,进入【描述统计】窗口,如图1.1.01所示,在“输入区域”中选择数据范围,这里是总分加上所有学科的数据区域,在输出区域中选择要输出的位置,勾选要统计的各个选项,单击【确定】,即得到本次考试的总体情况表,整理后如表1.1.01所示。增加了差异系数、难度和区分度三个指标,下面逐一解释各指标的意义和作用。
    图1.2.01 描述统计面板
    表1.2.01 成绩总体情况分析表

    2、统计指标
    (1)平均分

      在统计学上称为平均数,在成绩统计中,一般指简单算术平均数,是一个最基本的特征量数,指的是简单地把一批数据总和除以数据总次数所得的商数[1]。
       在EXCEL中,常用AVERAGE,AVERAGEIF,AVERAGEIFS三个函数来统计平均分。
      在本例中,总分平均分是504.7745,标准误差是5.2194,说明总分平均分在±5.2194之间的范围内取值是有效的。

    (2)中位数与众数

      中位数指一组数中按大小排序,位于中间的数[2],在EXCEL中,求中位数的是MEDIAN函数;众数是指总体中出现次数最多的标志值[3],在EXCEL中,函数MODE用于求众数。
       表里的中位数是531,说明中间哪个学生的分数是531分;众数是611,说明在611分这范围的人数最多。

    (3)标准差

      标准差是反映一个数据集的离散程度,指的是一组数据的离差平方和除以数据个数所得商的算术平均根[4]。在EXCEL中,可以通过函数STDEV(样本标准差)或STDEVP(总体标准差)求得,一般计算样本标准差即可。在这里可以简单理解为标准差小的全级学生的成绩跟平均值的距离比较小,反之则比较大。

    (4)峰度、偏度

      峰度和偏度是反映数据分布的参考值,峰度指数据分布平峰或尖峰的程度,也叫峰态[5],正态分布其参考值是3,低于3为平峰,在这里可以理解为各分数段的人数较分散,大于3则为尖峰,在这里可理解为某一分数段的人数较集中,偏度是反映不对称分布的偏态方向和程度的统计分析指标,也叫偏斜度,结合平均数、标准差,从另一角度描述了现象总体数据分布的特点[6],当偏度值大于0,表示正偏,这里可理解为低于平均分的人较多,偏度小于0,则为负偏,这里可理解为高于平均分的人较多。
    在EXCEL中,峰度可以用函数KURT计算,偏度则可以用函数SKEW计算。
    在这里插入图片描述

    (5)区域

      区域是最大值和最小值的差,表示分值范围。

    (6)最大值和最小值

       最大值是指一组数据中最大的数,在这里就是最高分,可用MAX函数计算。最小值是指一组数据中最小的数,就是最低分,在EXCEL用函数MIN可以求出。

    (7)观察数

      观察数实质就是参加考试的学生人数,对于缺考的学生不作统计,从表中可以看到语文的考试人数是652人,而数学的考试人数是651人,说明数学科有一个学生缺考。

    (8)差异系数

      差异系数是标准差和平均分的比值,是一种反映相对离散程度的系数,适合于不同性质数据的研究与比较[7]。本例中可看到数学的差异系数最大,可以理解为是拉开成绩距离最大的学科,而语文的差异系数最小,说明语文的成绩相对较接近,也可以说数学的离散程度比语文的高。

    (9)难度

      难度是反映被试完成题目或项目任务时所遇到的困难程度[8],可用计算得分率作为难度的指标。难度P的计算公式为:
      P=1-X/F
      其中X是该科平均分,F满分表示该科的总分。
      从表中可看到数学的难度最大,而化学的难度最小。

    (10)区分度

      区分度是题目区别初试水平的能力的量度[9],一般以字母D表示。计算方法为:
      D=(X高-X低)/F
      X高和X低分别表示高分组的平均分和低分组的平均分,其比例一般是各占总人数的27%,F是表示该题目的满分值。
      一般来说,区分度低于0.2,必须修改或淘汰,而高于0.4,则处于优良级别,从表中可看到数学的区分度最好,语文和化学的区分度则属于合格区间。从总体看,本次考试的区分度还是比较理想的,没有出现极端的现象。
    在这里插入图片描述

    (11)置信度(95%)

    是表示此统计的可信度为95%,也就是说存在有5%的误差。比如总分置信度(95%)的值是10.2488,说明其值的误差范围是在±10.2488之间。

    展开全文
  • 面对学生成绩,做好成绩数据统计分析,可以帮助教学行政做好评定教学质量和比较各种教学策略的成效,及时调整教学方向;可以帮助科组长及时发现本学科教学中存在的问题及薄弱环节,及时调整本科教学内容;可以帮助班...

    前 言

      考试作为衡量教师教学效果和检查学生掌握知识程度的测量工具,在学校的日常教学工作占有重要地位。面对学生成绩,做好成绩数据统计分析,可以帮助教学行政做好评定教学质量和比较各种教学策略的成效,及时调整教学方向;可以帮助科组长及时发现本学科教学中存在的问题及薄弱环节,及时调整本科教学内容;可以帮助班主任更深入了解本班各学科的优劣,及时协调科任老师的教学时间安排和引导学生的学习方向,做好培优扶困工作;可以帮助科任老师清楚了解学生是否达到预期的学习目标,自己的教学计划是否需调整,做好查漏补缺工作;可以帮助学生了解自己学习的不足及优势,及时调整自己的学习方法,提高自己的学习效率。
      笔者一直以来负责区域片区的成绩统计工作,苦于一直没有找到一本专门关于应用EXCEL进行学生成绩统计分析的参考书,随着广大中小学校对教育数据分析越来越迫切的需求,下面笔者基于EXCEL2010版本,以初三期中考试成绩数据为例,通过一个个实例操作,逐一介绍做好一次成绩统计分析,一般需涉及到哪些统计学知识和统计指标,各种统计功能在EXCEL电子表格下的实现过程,并说明这样做的意义。
    本实例的阅读对象是广大中小学教育工作者和成绩数据管理员,适合具有一定EXCEL操作基础的人群,也适合需了解或提高统计学在中小学教育统计中的应用的广大读者。
      本实例部分公式或统计学思想来自互联网和各种教育文献,在本实例中均做了明确的标注,如有不妥之处,欢迎关注笔考的微信公众号( iSTEAM)或发邮件到笔者的电子邮箱(59144885@QQ.COM),你的建议将是笔者工作的动力,共同推进中小学教育数据统计的发展。
    编者
    2019年11月7日星期四

    【目 录】

    • 【前 言 】
    • 第1章 考试成绩表总体分析
      • 1.1异常数据排查
      • 1.2利用“描述统计”对成绩进行总体分析
        • 实例1-2
    • 第2章 统计分数段人数
      • 2.1 利用数据透视数据表统计分数段
        • 实例2-1
      • 2.2利用countifs函数统计各分数段人数
        • 实例2-2
      • 2.3用其它函数统计分数段人数
      • 2.4 正态分布图
        • 实例2-4
    • 第3章 一分三率和离均率
      • 3.1计算一分三率
      • 3.2计算离均率
        • 实例3-2
    • 第4章 相关分析的应用
      • 4.1利用“相关系数”工具进行相关分析
        • 实例4-1
      • 4.2绘制散点图和回归方程
        • 实例4-2
    • 第5章 排名
      • 5.1使用rank函数排名
        • 5.1.1 RANK 函数的语法和用法
        • 5.1.2 RANK函数的应用
      • 5.2 利用“排位与百分比排位”分析工具实现排名
        • 实例5-2
      • 5.3标准分数的计算与排名
    • 第6章 成绩分析报告的编写
      • 6.1 分析报告流程
      • 6.2总体概况
      • 6.3成绩分析
      • 6.4成绩横向比较
      • 6.5 制作历次考试离均率变化图表
      • 6.6历次考试一分三率情况
      • 6.7培优扶困情况
    • 【 结 语 】
    • 【参考文献】

    【参考文献】

    • [1]平均数:《教育统计与测量评价新编教程》第19页.主编:黄光扬.2019年版.华东师范大学出版社.
    • [2]中位数:《统计学》108页,张晓庆.王玉良.王景涛 编著.清华大学出版社.2012年版.
    • [3]众数:《统计学》106页,张晓庆.王玉良.王景涛 编著.清华大学出版社.2012年版.
    • [4] 标准差:《教育统计与测量评价新编教程》第22页.主编:黄光扬.2019年版.华东师范大学出版社.
    • [5]峰度:《统计学》122页.张晓庆.王玉良.王景涛 编著.清华大学出版社.2012年版.
    • [6]偏度:《统计学》122页.张晓庆.王玉良.王景涛 编著.清华大学出版社.2012年版.
    • [7]差异系数:《教育统计与测量评价新编教程》第25页.主编:黄光扬.2019年版.华东师范大学出版社.
    • [8]《统计学》110页.张晓庆.王玉良.王景涛 编著,清华大学出版社,2012年版.
    • [9]区分度:《教育统计与测量评价新编教程》第82页.主编:黄光扬.2019年版.华东师范大学出版社.
    • [10]区分度计算:百度文库:https://wenku.baidu.com/view/b16e1f8fa0116c175f0e48b3.html
    • [11] EXCEL中正态曲线图如何绘制方法详解,百度文库:https://wenku.baidu.com/view/0d9358fc866fb84ae55c8dd7.html
    • [12] NORMDIST 函数的使用,来源百度百科:https://baike.baidu.com/item/NORMDIST/7257202?fr=aladdin
    • [13] 用EXCEL统计各分数段人数https://wenku.baidu.com/view/316a144327d3240c8447ef43.html
    • [14]《基于SPSS的数据分析(第四版)》201页.薛薇编著.中国人民大学出版社.2017年7月第四版
    • [15] 黄光扬.《教育统计与测量评价新编教程》第37页.2019年版.华东师范大学出版社.
    • [16] 龚笛,姜荣.学生成绩的统计分析.《统计学与应用》2014.3.1-6.
    • [17] 黄光扬.《教育统计与测量评价新编教程》第30页,2019年版,华东师范大学出版社.
    • [18] RANK函数,https://support.office.com/zh-cn/article/rank-%E5%87%BD%E6%95%B0-6a2fc49d-1831-4a03-9d8c-c279cf99f723
    • [19] PERCENTRANK函数,https://support.office.com/zh-cn/article/percentrank-%E5%87%BD%E6%95%B0-f1b5836c-9619-4847-9fc9-080ec9024442
    • [20] 宋宣.华东师范大学.中学应该使用标准分.《考试论谈》,2009.10.011.
    展开全文
  •   相关分析分析客观事物之间关系的数量分析方法,可归纳为函数关系和统计关系两大类。相关分析是用来分析事物之间统计关系的方法。函数关系是指两事物之间的一种一一对应的关系,即当一个变量x取一定值时,另一...

    第4章 相关分析的应用

    • 4.1利用“相关系数”工具进行相关分析
      • 1、 操作步骤
      • 2、结论

      相关分析是分析客观事物之间关系的数量分析方法,可归纳为函数关系和统计关系两大类。相关分析是用来分析事物之间统计关系的方法。函数关系是指两事物之间的一种一一对应的关系,即当一个变量x取一定值时,另一变量y可依确定的函数取唯一确定的值。统计关系指的是两事物之间的一种非一一对应的关系,即当一个变量x取一定值时,另一变量y无法依确定的函数取唯一确定的值[14]。
      在成绩数据分析中,可以根据相关分析的定义,通过计算总分与学科、学科与学科之间的相关系数,从而了解总分与学科之间,学科与学科之间的相关性。
      相关系数可以是正数,也可以是负数,相应地称为正相关和负相关,正相关是相互促进,而负相关则相反。

    4.1利用“相关系数”工具进行相关分析

      “相关系数”工具位于EXCEL中的【数据分析】工具库中。

    实例4-1
    1、 操作步骤

      (1)选择【数据】菜单,打开【数据分析】工具面板,选择【相关系数】,单击【确定】,弹出“相关系数”对话框。
      (2)在“输入区域”中输入数据的范围,并选择相关的选项,具体如图4.1.01所示,单击【确定】,得到相关系数的数据表4.1.01。从表中中可以看到,总分与各科,科与科之间呈正相关,总分跟数学和物理的相关系数最大,跟语文的相关系数最小;学科之间看,英语跟化学的相关系数最小,数学跟物理、化学的关系较大,道德与法治跟历史的关系也较紧密。

    2、结论

      据于数据的分析,可以得出如下结论:数理化三科比较好的学生,他们的总分相应比较好,英语成绩较好的学生,化学的成绩未必好,数学成绩较好的,物理和化学的成绩也相应较好,历史成绩较好的,其道德与法治的成绩相应也比较好。
      利用这样的方法,可以计算出各班的相关系数表,从而为各班的学习策略和时间分配中提供参考依据。
    图4.1.01相关系数面板设置
    表4.1.01 全级科与总分、科与科之间的相关分析表

    展开全文
  • 第5章 排名 5.1使用RANK函数排名 5.1.1 RANK 函数的语法和用法 ... 排名是成绩统计中经常用到的操作,最简单的是将成绩按从高到低顺序排序,然后排出1,2,3……名,这个按顺序排序的方法,对于同分的,本来都...
  • JAVA数组实现学生成绩统计

    千次阅读 2019-09-28 17:29:36
    数组实现学生成绩统计 二、项目描述 1.项目简介: 由用户输入学生人数名字,并定义当前学期课程数课程名,并分别录入每位学生每门课程成绩,系统显示输入每位学生每门课程成绩,并显示学生的总分平均分。 2....
  •   在进行数据分析时,为了直观显示成绩分布规律,即是正态,正偏态和负偏态三种分布状态,可以画总分及各学科的正态分布图,其作用一是对学生进行比较,通过分布曲线,可以分析学生成绩是不是存在两极分化(两头...
  •    对成绩进行分段统计,可以非常直观地看到各班各分数段的人数,有利于老师们快速了解本次考试结果,对考试情况作全方位的对比分析。 2.1 利用数据透视数据表统计分数段 实例2-1 1、操作步骤    ...
  • 学生成绩统计

    2014-03-04 14:46:45
    /* * 程序的版权和版本声明部分: ... * All rights reserved. * 文件名称:test.cpp * 作 者:周经纬 ...*学生成绩统计 * 输入描述:无 * 问题描述:。 * 程序输出: * 问题分析:略 * 算法设计:略
  • 案例1主题: 主成分分析学生成绩神秘联系分析 案例2主题: 因子分析学生成绩神秘联系分析 案例一:目的内容 学生的考试是评估学生的学习程度及能力,当我们只想知道学生的学习程度如何时,可借由一份良好的...
  • c++学生成绩统计

    千次阅读 2016-09-16 13:25:09
    3-5 学生成绩统计 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 通过本题目练习可以掌握对象数组的用法,主要是对象数组中数据的输入输出操作。 设计一个学生...
  •   绘制散点图是相关分析最常用的方法,从相关散点图的几何分布形态来认识相关的强度方向,如果散点图形杂乱无章,没有显示出向某一方向延伸的情形,则说明相关程度低;如果散点图分布形成一个边界不规则的椭圆,...
  • 线性表的练习--学生成绩统计

    千次阅读 2019-09-27 04:50:32
    线性表的练习--学生成绩统计 问题描述:建立一个简单的学生成绩表,要求能够完成学生成绩的录入,总成绩的计算,学生成绩的查询,学生成绩表的排序 算法分析:  创建一个线性表来储存学生成绩,每个...
  • 【前言:如题,本文中涉及的项目是去年应学妹要求帮忙写的,纯C语言,在...同时,给需要完成类似课程设计的学生一个参考,但是应注意理解其中的知识点,而不应复制粘贴草草了事。】问题描述:  学期考试结束,统计
  •   计算一分三率,即平均分、合格率、优秀率和高分率,是成绩统计中最常见也是最需要的统计数据。 3.1计算一分三率 实例3-2 3.2计算离均率 3.1计算一分三率   计算一分三率,即平均分、合格率、优秀率和高分...
  • 项目一学生成绩统计

    2014-03-09 12:25:42
    /* ...*All rights reserved. *作者:王至超 ...*问题描述:利用结构体进行学生成绩统计 *样例输入: *样例输出: *问题分析:用简单的方法,学会活学活用 */ #include using namespace std; stru
  • 学生成绩统计系统 所使用的知识较少所以实现的功能比较简单,处理的学生信息也不全面学习了结构体和文件处理后将会有一个更完善更实用的学生信息管理系统 一、项目实现 1.系统分析设计: (1)程序功能模块: &...
  • mapreduce 班级学生成绩统计

    千次阅读 2019-04-02 10:38:37
    1 统计每个班成绩的最大值 最小值 并且输出姓名 如果有多个那么要都要输出 ,然后输出每个班的平均值 再者就是每个班的成绩分布,优秀良好,及格不及格的个数 2 统计全部成绩的最大值最小值 要求如上 其中有一些...
  • /* *Copyright (c)2013,烟台大学计算机学院 *All rights reserved. *文件名称:test.cpp ...*问题描述:学生成绩统计 问题分析:输入学生成绩,进行成绩统计 */ #include #include using nam
  • /* *程序的版权和版本声明部分: ...*All rights reserved. *文件名称: *作者:田成琳 *完成日期:2013年 3月 3 日 *版本号:v1.0 *对任务及求解方法的描述部分:...*程序输出:学生成绩 *问题分析: *算法设计: */ #inc
  • 项目2-学生成绩统计

    2014-03-04 15:18:32
    /* *Corpyright (c)2013,烟台大学计算机学院 *All right reseved. ...*问题描述:【项目2-学生成绩统计】 *程序输出: *问题分析: *算法设计: */ #include using namespace std; struct Studen
  • 2-1学生成绩统计

    2014-03-04 15:21:14
    /* * 作 者: 霍雨佳 * 完成日期:2014 年3月4日 * 版 本 号:v1.0 ...* 问题分析:建立结构体,分析运用数组对学生成绩进行统计。 */ #include #include using namespace std; struct Student {
  • SQL成绩统计分析—排名问题

    万次阅读 多人点赞 2015-07-18 15:51:00
    ROW_NUMBER(),RANK(),DENSE_RANK(),NTILE()最近写了近半个月的成绩统计服务 , 被SQL折磨半死,下面介绍下在SQL成绩统计分析中遇到的一些小问题,首先介绍下成绩分析中经常遇到的问题 就是排名问题,这里就不得不...
  • 用C语言解决学生成绩统计问题 :

    千次阅读 2018-12-18 23:09:06
    @学生成绩统计问题 : 这个问题如果用结构体就非常简单,但如果规定只用数组和指针的话可能就有点小难度,特别是一些小细节,经常处理不好,所以博主贴出自己写的,希望对大家有帮助](这里写自定义目录标题) ...
  • **题目:**完成一个简易的学生成绩计算功能:从键盘输入N个学生的姓名,年龄,数学成绩,语文成绩四项信息,输入完N个学生信息后,计算各个学生的总成绩和平均成绩,计算完毕后输出每个学生的姓名、年龄、数学成绩、...
  • 简单的学生成绩数据分析案例

    千次阅读 2021-06-23 16:30:08
    本程序从Excel文件读取学生成绩统计各个分数段(90分以上,8089分,7079分,60~69分,60分以下)学生人数,并用柱状图(如图9-1)展示学生成绩分布,同时计算出最高分、最低分、平均成绩、各分数段人数等分析指标...
  • C语言 编程统计全班学生成绩

    千次阅读 2019-02-14 19:22:56
    编程统计全班学生成绩。要求每次用键盘输入一个学生的2门分数,计算输出每个学生平均分,如果平均分大于等于85,为优秀,60~85为通过。统计出成绩优秀的学生和及格的学生人数。 算法分析统计人数,用count计数器...
  • C语言进阶 (一)前言: 在学习c语言基础语法后我们需要通过...(二)题目要求:学生成绩统计系统实现 设计结构体数组,结构中包含学生数据为:学号、姓名、物理分数、数学分数、外语分数、计算机分数。 设...
  • /* *程序的版权和版本声明部分: *Copyright(c)2013,烟台大学计算机学院学生 *All rights reserved. *文件名称:学生成绩统计 *作者:刘中林 *完成日期:2013

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 23,538
精华内容 9,415
关键字:

学生成绩统计与分析