报表页面展示和Excel报表导出

 js

(function() {
    'use strict';
    var REPORT3003 = {
        offOn: true,
        init: function() {
            this.renderTable();
            this.onClickStar();
            this.downTemplate();
        },
        renderTable: function() {
            DREPORT.getNewTop100(function(res){
                console.log(res)
                document.getElementById('report3003').innerHTML = template('report3003Temp', res);
                var order = [], noSort = [{ targets: [], "orderable": false }]
                TOOL.dataTable('report3003', order, noSort, true, 'search');
                // 判断变化上升还是下降
                TOOL.fallOrUpChange('report3003');
            });
        },
        downTemplate: function() {
            $('#download').click(function() {
            	var json = JSON.parse($.cookie('user'));
        		var schCode = json.schCode;
        		var yearIn = json.yearIn;
        		var url = "../../../report/3003/xscjzbtop100/exportExcel/2001544525215806/"+schCode+"/"+yearIn;
                window.open(url, '_blank');
            })
        },
        // 关注
        onClickStar: function() {
            let self = this;
            $('#togglerStar').on('click', function() {
                if (self.offOn) {
                    $(this).find('.iconfont').removeClass('icon-heart-o').addClass('icon-heart');
                    console.log('已关注')
                    self.offOn = false;
                } else {
                    $(this).find('.iconfont').removeClass('icon-heart').addClass('icon-heart-o');
                    console.log('未关注')
                    self.offOn = true;
                }
            });
        }
    }
    REPORT3003.init();
})()
	// 前100名
	getNewTop100: function(callback){
		var json = JSON.parse($.cookie('user'))
		var schCode = json.schCode;
		var yearIn = json.yearIn;
		let url = "../../../report/3003/xscjzbtop100/list/2001544525215806/"+schCode+"/"+yearIn;
		Tomd.wait();
		$.get(url).done(function (response) {
			Tomd.waitok();
         	if (0 != response.code)
         		return;
         	callback(response.data);
		});
	},

HTML

<%@ page contentType="text/html; charset=utf-8"%>
<div class="message-tips mb-3">
    <span class="text-primary"><i class="iconfont icon-book-line"></i>报表中心——</span>2018年普通高等学校招生全国统一考试于2018年6月7日-2018年6月8日举行。
</div>
<!-- 前100名 -->
<div class="widget">
    <div class="widget-body">
        <div class="customSearch mb-2">
            <div class="row">
                <div class="col-md-6">
                    <label>搜索:
                        <input type="search" id="search" class="form-control form-control-sm" placeholder="输入搜索内容">
                    </label>
                </div>
                <div class="col-md-6 text-right">
                    <span id="togglerStar" class="star mr-4 cup"><i class="iconfont icon-heart-o"></i>常用报表</span>
                    <button type="button" class="btn btn-success btn-sm" id="download"><i class="iconfont icon-file-xls"></i>导出Excel</button>
                </div>
            </div>
        </div>
        <div class="table-responsive">
            <table class="table table-striped table-bordered table-hover table-expand table-nowrap text-center mb-0" id="report3003"></table>
        </div>
    </div>
</div>
<!-- 前100名 -->
<script type="text/html" id="report3003Temp">
    <thead>
        <tr>
            <th rowspan="2">班级</th>
            <th rowspan="2">学号</th>
            <th rowspan="2">姓名</th>
            <th rowspan="2">性别</th>
			<th rowspan="2">选修</th>
            {{each title}}
            <th rowspan="2">{{$value}}</th>
            {{/each}}
            {{each head}}
            <th colspan="3">
                {{$value}}
            </th>
            {{/each}}
            <th rowspan="2">3门总分</th>
            <th rowspan="2">班级名次</th>
            <th rowspan="2">年级名次</th>
            <th rowspan="2">6门总分</th>
            <th rowspan="2">班级名次</th>
            <th rowspan="2">年级名次</th>
        </tr>
        <tr>
            {{each head}}
            <th>卷面</th>
            <th>档次</th>
            <th>得分</th>
            {{/each}}
        </tr>
    </thead>
    <tbody>
        {{each datas item}}
        <tr>
            <td>{{item.className}}</td>
            <td>{{item.stuCode}}</td>
            <td>{{item.stuName}}</td>
            <td>{{item.gender}}</td>
			<td>{{item.selection}}</td>
            {{each item.data}}
            <td>{{$value}}</td>
            {{/each}}
            <td>{{item.courseScore}}</td>
            <td>{{item.courseClsRank}}</td>
            <td>{{item.courseGrdRank}}</td>
            <td>{{item.score}}</td>
            <td>{{item.clsRank}}</td>
            <td>{{item.grdRank}}</td>
        </tr>
        {{/each}}
    </tbody>
</script>

 JAVA

 

@Controller
@RequestMapping("/report/3003/xscjzbtop100")
public class Report_3003_Controller extends BaseController {
	
	@Resource(name = "report_3003_service")
	private Report_3003_Service service;
	
	/**
	 * 学生成绩总表(选课后前100名)
	 */
	@ResponseBody
	@GetMapping("/list/{examCode}/{schCode}/{yearIn}")
	public JSONObject xscjzbtop100(@NonNull @PathVariable Long examCode,
			@NonNull @PathVariable Long schCode,
			@NonNull @PathVariable Integer yearIn) {
		JSONObject result = service.findXscjzbTop100(examCode, schCode, yearIn, INCLUDE_ABSENT, INCLUDE_TRANSIENT, EXAM_CATEGORY);
		return result;
	}
	
	@ResponseBody
	@GetMapping("/exportExcel/{examCode}/{schCode}/{yearIn}")
	public void exportExcel(@NonNull @PathVariable Long examCode,
			@NonNull @PathVariable Long schCode,
			@NonNull @PathVariable Integer yearIn,
			HttpServletResponse response) {
			service.exportExcel(examCode,schCode, yearIn, INCLUDE_ABSENT, INCLUDE_TRANSIENT, EXAM_CATEGORY,response);
	}
	

}

JSON

{"code":0,"data":{"head":["物理"],"datas":[{"courseGrdRank":1,"score":"411","courseClsRank":1,"gender":"_","selection":"_","data":["102","93","142","74","_","_"],"grdRank":1,"clsRank":1,"className":"2班","stuName":"方天乐","courseScore":"337","stuCode":"21022218203"},{"courseGrdRank":2,"score":"403","courseClsRank":1,"gender":"_","selection":"_","data":["86","108","137","72","_","_"],"grdRank":2,"clsRank":1,"className":"1班","stuName":"韩笑","courseScore":"331","stuCode":"21022218103"},{"courseGrdRank":4,"score":"399","courseClsRank":2,"gender":"_","selection":"_","data":["106","80","144","69","_","_"],"grdRank":3,"clsRank":1,"className":"3班","stuName":"钱晨","courseScore":"330","stuCode":"21022218304"},{"courseGrdRank":6,"score":"396","courseClsRank":3,"gender":"_","selection":"_","data":["104","88","133","71","_","_"],"grdRank":4,"clsRank":2,"className":"2班","stuName":"刘必传","courseScore":"325","stuCode":"21022218213"},{"courseGrdRank":5,"score":"396","courseClsRank":2,"gender":"_","selection":"_","data":["95","98","133","70","_","_"],"grdRank":4,"clsRank":2,"className":"2班","stuName":"黄鑫","courseScore":"326","stuCode":"21022218218"},{"courseGrdRank":2,"score":"396","courseClsRank":1,"gender":"_","selection":"_","data":["101","84","146","65","_","_"],"grdRank":4,"clsRank":2,"className":"3班","stuName":"黄婵媛","courseScore":"331","stuCode":"21022218302"},{"courseGrdRank":6,"score":"392","courseClsRank":2,"gender":"_","selection":"_","data":["103","102","120","67","_","_"],"grdRank":7,"clsRank":2,"className":"1班","stuName":"石小晨","courseScore":"325","stuCode":"21022218112"},{"courseGrdRank":8,"score":"384","courseClsRank":3,"gender":"_","selection":"_","data":["101","121","98","64","_","_"],"grdRank":8,"clsRank":3,"className":"3班","stuName":"钱国阳","courseScore":"320","stuCode":"21022218305"},{"courseGrdRank":10,"score":"383","courseClsRank":3,"gender":"_","selection":"_","data":["108","63","142","70","_","_"],"grdRank":9,"clsRank":3,"className":"1班","stuName":"陈天乐","courseScore":"313","stuCode":"21022218106"},{"courseGrdRank":10,"score":"381","courseClsRank":5,"gender":"_","selection":"_","data":["93","78","142","68","_","_"],"grdRank":10,"clsRank":4,"className":"3班","stuName":"赵千帅","courseScore":"313","stuCode":"21022218308"},{"courseGrdRank":9,"score":"376","courseClsRank":4,"gender":"_","selection":"_","data":["91","100","127","58","_","_"],"grdRank":11,"clsRank":5,"className":"3班","stuName":"李乾","courseScore":"318","stuCode":"21022218313"},{"courseGrdRank":12,"score":"374","courseClsRank":4,"gender":"_","selection":"_","data":["92","87","129","66","_","_"],"grdRank":12,"clsRank":4,"className":"1班","stuName":"王婧嫣","courseScore":"308","stuCode":"21022218114"},{"courseGrdRank":17,"score":"373","courseClsRank":6,"gender":"_","selection":"_","data":["83","68","144","78","_","_"],"grdRank":13,"clsRank":5,"className":"1班","stuName":"董超","courseScore":"295","stuCode":"21022218110"},{"courseGrdRank":13,"score":"373","courseClsRank":4,"gender":"_","selection":"_","data":["94","103","104","72","_","_"],"grdRank":13,"clsRank":4,"className":"2班","stuName":"周鹏程","courseScore":"301","stuCode":"21022218210"},{"courseGrdRank":14,"score":"368","courseClsRank":5,"gender":"_","selection":"_","data":["110","70","120","68","_","_"],"grdRank":15,"clsRank":5,"className":"2班","stuName":"常乘樾","courseScore":"300","stuCode":"21022218205"},{"courseGrdRank":16,"score":"367","courseClsRank":5,"gender":"_","selection":"_","data":["110","89","97","71","_","_"],"grdRank":16,"clsRank":6,"className":"1班","stuName":"陈明宇","courseScore":"296","stuCode":"21022218105"},{"courseGrdRank":15,"score":"367","courseClsRank":6,"gender":"_","selection":"_","data":["111","101","86","69","_","_"],"grdRank":16,"clsRank":6,"className":"3班","stuName":"韩可欣","courseScore":"298","stuCode":"21022218303"},{"courseGrdRank":18,"score":"363","courseClsRank":7,"gender":"_","selection":"_","data":["100","113","80","70","_","_"],"grdRank":18,"clsRank":7,"className":"1班","stuName":"陈亦亮","courseScore":"293","stuCode":"21022218108"},{"courseGrdRank":18,"score":"357","courseClsRank":6,"gender":"_","selection":"_","data":["93","58","142","64","_","_"],"grdRank":19,"clsRank":6,"className":"2班","stuName":"余鹭","courseScore":"293","stuCode":"21022218215"},{"courseGrdRank":21,"score":"353","courseClsRank":8,"gender":"_","selection":"_","data":["91","95","98","69","_","_"],"grdRank":20,"clsRank":7,"className":"3班","stuName":"赵逸涵","courseScore":"284","stuCode":"21022218307"},{"courseGrdRank":22,"score":"350","courseClsRank":8,"gender":"_","selection":"_","data":["82","121","80","67","_","_"],"grdRank":21,"clsRank":8,"className":"1班","stuName":"王明杰","courseScore":"283","stuCode":"21022218113"},{"courseGrdRank":24,"score":"349","courseClsRank":9,"gender":"_","selection":"_","data":["92","67","114","76","_","_"],"grdRank":22,"clsRank":8,"className":"3班","stuName":"朱仪珺","courseScore":"273","stuCode":"21022218314"},{"courseGrdRank":20,"score":"348","courseClsRank":7,"gender":"_","selection":"_","data":["80","108","102","58","_","_"],"grdRank":23,"clsRank":9,"className":"3班","stuName":"李鹏菲","courseScore":"290","stuCode":"21022218311"},{"courseGrdRank":23,"score":"340","courseClsRank":7,"gender":"_","selection":"_","data":["91","98","86","65","_","_"],"grdRank":24,"clsRank":7,"className":"2班","stuName":"俞樱妍","courseScore":"275","stuCode":"21022218214"},{"courseGrdRank":26,"score":"337","courseClsRank":9,"gender":"_","selection":"_","data":["87","102","76","72","_","_"],"grdRank":25,"clsRank":8,"className":"2班","stuName":"姜富莹","courseScore":"265","stuCode":"21022218208"},{"courseGrdRank":25,"score":"336","courseClsRank":8,"gender":"_","selection":"_","data":["93","64","109","70","_","_"],"grdRank":26,"clsRank":9,"className":"2班","stuName":"于辰佳","courseScore":"266","stuCode":"21022218216"},{"courseGrdRank":28,"score":"335","courseClsRank":10,"gender":"_","selection":"_","data":["88","59","117","71","_","_"],"grdRank":27,"clsRank":10,"className":"2班","stuName":"吴逸伦","courseScore":"264","stuCode":"21022218211"},{"courseGrdRank":26,"score":"334","courseClsRank":9,"gender":"_","selection":"_","data":["92","104","69","69","_","_"],"grdRank":28,"clsRank":9,"className":"1班","stuName":"赵惟缘","courseScore":"265","stuCode":"21022218109"},{"courseGrdRank":29,"score":"324","courseClsRank":11,"gender":"_","selection":"_","data":["82","104","68","70","_","_"],"grdRank":29,"clsRank":11,"className":"2班","stuName":"樊文博","courseScore":"254","stuCode":"21022218201"},{"courseGrdRank":30,"score":"324","courseClsRank":12,"gender":"_","selection":"_","data":["87","87","78","72","_","_"],"grdRank":29,"clsRank":11,"className":"2班","stuName":"孙诗怡","courseScore":"252","stuCode":"21022218206"},{"courseGrdRank":34,"score":"316","courseClsRank":11,"gender":"_","selection":"_","data":["68","88","79","81","_","_"],"grdRank":31,"clsRank":10,"className":"1班","stuName":"黄煜晓","courseScore":"235","stuCode":"21022218101"},{"courseGrdRank":31,"score":"313","courseClsRank":10,"gender":"_","selection":"_","data":["97","69","75","72","_","_"],"grdRank":32,"clsRank":11,"className":"1班","stuName":"陈昶伟","courseScore":"241","stuCode":"21022218104"},{"courseGrdRank":32,"score":"310","courseClsRank":13,"gender":"_","selection":"_","data":["107","92","39","72","_","_"],"grdRank":33,"clsRank":13,"className":"2班","stuName":"孙佳婕","courseScore":"238","stuCode":"21022218207"},{"courseGrdRank":32,"score":"307","courseClsRank":10,"gender":"_","selection":"_","data":["111","91","36","69","_","_"],"grdRank":34,"clsRank":10,"className":"3班","stuName":"路佳怡","courseScore":"238","stuCode":"21022218306"},{"courseGrdRank":37,"score":"306","courseClsRank":13,"gender":"_","selection":"_","data":["85","94","51","76","_","_"],"grdRank":35,"clsRank":12,"className":"1班","stuName":"汤欣谕","courseScore":"230","stuCode":"21022218115"},{"courseGrdRank":34,"score":"304","courseClsRank":11,"gender":"_","selection":"_","data":["102","77","56","69","_","_"],"grdRank":36,"clsRank":11,"className":"3班","stuName":"曹聪","courseScore":"235","stuCode":"21022218315"},{"courseGrdRank":36,"score":"297","courseClsRank":12,"gender":"_","selection":"_","data":["23","94","115","65","_","_"],"grdRank":37,"clsRank":13,"className":"1班","stuName":"顾馨怡","courseScore":"232","stuCode":"21022218102"},{"courseGrdRank":38,"score":"297","courseClsRank":12,"gender":"_","selection":"_","data":["113","60","56","68","_","_"],"grdRank":37,"clsRank":12,"className":"3班","stuName":"解呈杰","courseScore":"229","stuCode":"21022218309"},{"courseGrdRank":39,"score":"286","courseClsRank":14,"gender":"_","selection":"_","data":["105","17","100","64","_","_"],"grdRank":39,"clsRank":14,"className":"2班","stuName":"唐云锋","courseScore":"222","stuCode":"21022218209"},{"courseGrdRank":40,"score":"281","courseClsRank":15,"gender":"_","selection":"_","data":["87","90","44","60","_","_"],"grdRank":40,"clsRank":15,"className":"2班","stuName":"龙茵","courseScore":"221","stuCode":"21022218217"},{"courseGrdRank":42,"score":"277","courseClsRank":14,"gender":"_","selection":"_","data":["106","10","90","71","_","_"],"grdRank":41,"clsRank":13,"className":"3班","stuName":"曹申昊","courseScore":"206","stuCode":"21022218316"},{"courseGrdRank":42,"score":"276","courseClsRank":14,"gender":"_","selection":"_","data":["110","65","31","70","_","_"],"grdRank":42,"clsRank":14,"className":"1班","stuName":"陈佳菁","courseScore":"206","stuCode":"21022218107"},{"courseGrdRank":41,"score":"274","courseClsRank":13,"gender":"_","selection":"_","data":["51","111","54","58","_","_"],"grdRank":43,"clsRank":14,"className":"3班","stuName":"李敏慧","courseScore":"216","stuCode":"21022218312"},{"courseGrdRank":46,"score":"267","courseClsRank":17,"gender":"_","selection":"_","data":["91","57","49","70","_","_"],"grdRank":44,"clsRank":16,"className":"2班","stuName":"杨馨黎","courseScore":"197","stuCode":"21022218202"},{"courseGrdRank":45,"score":"265","courseClsRank":16,"gender":"_","selection":"_","data":["79","81","43","62","_","_"],"grdRank":45,"clsRank":17,"className":"2班","stuName":"吴佳悦","courseScore":"203","stuCode":"21022218212"},{"courseGrdRank":44,"score":"263","courseClsRank":15,"gender":"_","selection":"_","data":["89","73","43","58","_","_"],"grdRank":46,"clsRank":15,"className":"3班","stuName":"杜广鑫","courseScore":"205","stuCode":"21022218310"},{"courseGrdRank":47,"score":"260","courseClsRank":18,"gender":"_","selection":"_","data":["84","24","79","73","_","_"],"grdRank":47,"clsRank":18,"className":"2班","stuName":"张超晨","courseScore":"187","stuCode":"21022218204"},{"courseGrdRank":48,"score":"254","courseClsRank":15,"gender":"_","selection":"_","data":["89","40","57","68","_","_"],"grdRank":48,"clsRank":15,"className":"1班","stuName":"胡英华","courseScore":"186","stuCode":"21022218111"},{"courseGrdRank":49,"score":"246","courseClsRank":16,"gender":"_","selection":"_","data":["95","36","45","70","_","_"],"grdRank":49,"clsRank":16,"className":"3班","stuName":"黄璟","courseScore":"176","stuCode":"21022218301"}],"title":["语文","数学","英语"]},"message":"请求成功"}

 

 报表页面展示和Excel报表导出

主要业务逻辑

package com.moofen.school.report.service.impl;

import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
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.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.util.CellRangeAddress;
import org.springframework.stereotype.Service;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.moofen.core.constant.AnalyzeConstant;
import com.moofen.school.basic.service.ContextService;
import com.moofen.school.report.service.Report_3003_Service;
import com.moofen.school.util.StringUtil;
import com.moofen.school.xqfx.multi.qkfx.service.impl.MultiServiceImpl;

@Service("report_3003_service")
public class Report_3003_ServiceImpl extends MultiServiceImpl implements Report_3003_Service {

	@Resource(name = "contextService")
	private ContextService contextService;
	
	@Override
	public JSONObject findXscjzbTop100(Long examCode, Long schCode, Integer yearIn, Integer includeAbsent,
			Integer includeTransient, Integer examCategory) {
		JSONObject allJson = findMulTotalScores(AnalyzeConstant.SUMM_ALL, examCode, schCode, yearIn, null, null, null, includeAbsent, includeTransient, examCategory, null);		
		JSONObject majorJson = findMulTotalScores(AnalyzeConstant.SUMM_MAJOR, examCode, schCode, yearIn, null, null, null, includeAbsent, includeTransient, examCategory, null);
		sortAll(allJson.getJSONArray("data"));
		Map<String, JSONObject> majorMap = groupByStudent(majorJson.getJSONArray("data"));
		List<String> titleList = new ArrayList<String>();
		List<String> head = new ArrayList<String>();
		JSONArray array = new JSONArray();
		for (int i = 0; i < allJson.getJSONArray("data").size(); i++) {
			JSONObject stuJson = allJson.getJSONArray("data").getJSONObject(i);
			if(stuJson.getInteger("grdRankPosition") > 100){
				break;
			}
			JSONObject json = new JSONObject();
			json.put("className", stuJson.getJSONObject("clazz").getString("clzAlias"));
			String stuCode = stuJson.getJSONObject("student").getString("schStuCode");
			json.put("stuCode", stuCode);
			json.put("stuName", stuJson.getJSONObject("student").getString("stuAlias"));
			json.put("gender", "_");
			json.put("selection", "_");
			json.put("courseScore", StringUtil.formatNumber(majorMap.get(stuCode).getDouble("score") / 100));
			json.put("courseClsRank", majorMap.get(stuCode).getInteger("clzRankPosition"));
			json.put("courseGrdRank", majorMap.get(stuCode).getInteger("grdRankPosition"));
			json.put("score", StringUtil.formatNumber(stuJson.getDouble("score") / 100));
			json.put("clsRank", stuJson.getInteger("clzRankPosition"));
			json.put("grdRank", stuJson.getInteger("grdRankPosition"));
			List<Object> items = new ArrayList<Object>();
			sortItems(stuJson.getJSONArray("items"));
			for (int j = 0; j < stuJson.getJSONArray("items").size(); j++) {
				String subCode = stuJson.getJSONArray("items").getJSONObject(j).getString("subCode");
				String section = stuJson.getJSONArray("items").getJSONObject(j).getString("section");
				if (0 == i) {
					if(subCode.equals("1") || subCode.equals("2") || subCode.equals("3")){
						if (AnalyzeConstant.ALL.equals(section)) {
							titleList.add(contextService.getSubjectBy(subCode).getName());
						}
					}else{
						if (AnalyzeConstant.ALL.equals(section)) {
							head.add(contextService.getSubjectBy(subCode).getName());
						} 
					}
				}
				
				if (AnalyzeConstant.ALL.equals(section)) {
					if(subCode.equals("1") || subCode.equals("2") || subCode.equals("3")){
						items.add(StringUtil.formatNumber(stuJson.getJSONArray("items").getJSONObject(j).getDouble("score") / 100));
					}else{
						items.add(StringUtil.formatNumber(stuJson.getJSONArray("items").getJSONObject(j).getDouble("score") / 100));
						items.add("_");
						items.add("_");
					}
				}	
			}
			json.put("data", items);
			array.add(json);
		}
		JSONObject json = new JSONObject();
		json.put("title", titleList);
		json.put("head", head);
		json.put("datas", array);
		allJson.put("data", json);
		return allJson;
	}
	
	private Map<String, JSONObject> groupByStudent(JSONArray array){
		Map<String, JSONObject> result = new HashMap<String, JSONObject>();
		for(int i = 0; i < array.size(); i++){
			String stuCode = array.getJSONObject(i).getJSONObject("student").getString("schStuCode");
			result.put(stuCode, array.getJSONObject(i));
		}
		return result;
	}
		
	private void sortItems(JSONArray array) {
		array.sort(new Comparator<Object>() {

			@Override
			public int compare(Object o1, Object o2) {
				JSONObject json1 = (JSONObject) o1;
				JSONObject json2 = (JSONObject) o2;
				int result = json1.getString("subCode").compareTo(json2.getString("subCode"));
				if (0 != result)
					return result;
				if (AnalyzeConstant.ALL.equals(json1.getString("section"))) {
					if (AnalyzeConstant.ALL.equals(json2.getString("section"))) {
						return 0;
					} else {
						return -1;
					}
				} else {
					if (AnalyzeConstant.ALL.equals(json2.getString("section"))) {
						return 1;
					} else {
						return json1.getString("section").compareTo(json2.getString("section"));
					}
				}
			}

		});
	}
	
	
	private void sortAll(JSONArray array) {
		array.sort(new Comparator<Object>() {

			@Override
			public int compare(Object o1, Object o2) {
				JSONObject json1 = (JSONObject) o1;
				JSONObject json2 = (JSONObject) o2;
				int result = json1.getInteger("grdRankPosition").compareTo(json2.getInteger("grdRankPosition"));
				return result;
			}
		});
	}
	
	
	
	@Override
	public void exportExcel(Long examCode, Long schCode, Integer yearIn, Integer includeAbsent,
			Integer includeTransient, Integer examCategory, HttpServletResponse response) {
		JSONObject obj = this.findXscjzbTop100(examCode, schCode, yearIn, includeAbsent, includeTransient, examCategory);
		//组装title
		JSONArray arr = obj.getJSONObject("data").getJSONArray("datas");
		JSONArray rowsName = new JSONArray();
		rowsName.add("班级");
		rowsName.add("学号");
		rowsName.add("姓名");
		rowsName.add("性别");
		rowsName.add("选修");
		
		List<CellRangeAddress> addressList = new ArrayList<CellRangeAddress>();
		//跨行跨列  合并单元格    添加CellRangeAddress顺序不能乱
		//班级
		CellRangeAddress address1 = new CellRangeAddress(0,1,0,0);//起始行,结束行,起始列,结束列
		//学号
		CellRangeAddress address2 = new CellRangeAddress(0,1,1,1);//起始行,结束行,起始列,结束列
		//姓名
		CellRangeAddress address3 = new CellRangeAddress(0,1,2,2);//起始行,结束行,起始列,结束列
		//性别
		CellRangeAddress address4 = new CellRangeAddress(0,1,3,3);//起始行,结束行,起始列,结束列
		//选修
		CellRangeAddress address5 = new CellRangeAddress(0,1,4,4);//起始行,结束行,起始列,结束列
		addressList.add(address1);
		addressList.add(address2);
		addressList.add(address3);
		addressList.add(address4);
		addressList.add(address5);
		
		JSONArray title = obj.getJSONObject("data").getJSONArray("title");
		
		for(int i = 0; i < title.size(); i++){
			rowsName.add(title.get(i));
			CellRangeAddress addressx = new CellRangeAddress(0,1,i+5,i+5);//起始行,结束行,起始列,结束列
			addressList.add(addressx);
		}
		
		JSONArray rowsName1 = obj.getJSONObject("data").getJSONArray("head");

		for (int i = 0; i < rowsName1.size(); i++) {//学科是动态的
			rowsName.add(rowsName1.get(i));
			//跨行跨列  合并单元格 每一个学科跨3列
			CellRangeAddress address = new CellRangeAddress(0,0,5+title.size()+3*i,4+title.size()+3*(i+1));//起始行,结束行,起始列,结束列
			addressList.add(address);
		}
		rowsName.add("3门总分");
		rowsName.add("班级名次");
		rowsName.add("年级名次");
		rowsName.add("6门总分");
		rowsName.add("班级名次");
		rowsName.add("年级名次");
		//组装data
        List<JSONArray>  dataList = new ArrayList<JSONArray>();
        for (int i = 0; i < arr.size(); i++) {
           JSONObject arrobj = arr.getJSONObject(i);
           JSONArray arr1 = new JSONArray();
           arr1.add(arrobj.get("className"));
           arr1.add(arrobj.get("stuCode"));
           arr1.add(arrobj.get("stuName"));
           arr1.add(arrobj.get("gender"));
           arr1.add(arrobj.get("selection"));
           JSONArray arr2 = arrobj.getJSONArray("data");
           for (int j = 0; j < arr2.size(); j++) {
        	   arr1.add(arr2.get(j));
           }
           arr1.add(arrobj.get("courseScore"));
           arr1.add(arrobj.get("courseClsRank"));
           arr1.add(arrobj.get("courseGrdRank"));
           arr1.add(arrobj.get("score"));
           arr1.add(arrobj.get("clsRank"));
           arr1.add(arrobj.get("grdRank"));
           
           dataList.add(arr1);
        }
        try {
			export(response,rowsName, dataList, "学生成绩总表(选课后)前100名.xls","学生成绩总表(选课后)前100名",addressList,rowsName1, title);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/*
     * 导出数据
     * */
	public void export(HttpServletResponse response ,JSONArray rowName,List<JSONArray>  dataList,String fileName,String sheetname,List<CellRangeAddress> addressList,JSONArray rowName1, JSONArray title) throws Exception{
        try{
            HSSFWorkbook workbook = new HSSFWorkbook();                        // 创建工作簿对象
            HSSFSheet sheet = workbook.createSheet(sheetname);
            JSONArray subtitle = new JSONArray();
            subtitle.add("卷面");
            subtitle.add("档次");
            subtitle.add("得分");
            // 定义所需列数
            int columnNum = rowName.size();
            int a = rowName1.size()*3+5+title.size();//计算出最后两列在excel中的位置
            int b = rowName1.size()+5+title.size();//计算出前三列加上动态学科后的结果
            //3门总分
    		CellRangeAddress address6 = new CellRangeAddress(0,1,a,a);//起始行,结束行,起始列,结束列
    		addressList.add(address6);
    		//班级名次
    		CellRangeAddress address7 = new CellRangeAddress(0,1,a+1,a+1);//起始行,结束行,起始列,结束列
    		addressList.add(address7);
    		//班级名次
    		CellRangeAddress address8 = new CellRangeAddress(0,1,a+2,a+2);//起始行,结束行,起始列,结束列
    		addressList.add(address8);
            //3门总分
    		CellRangeAddress address9 = new CellRangeAddress(0,1,a+3,a+3);//起始行,结束行,起始列,结束列
    		addressList.add(address9);
    		//班级名次
    		CellRangeAddress address10 = new CellRangeAddress(0,1,a+4,a+4);//起始行,结束行,起始列,结束列
    		addressList.add(address10);
    		//班级名次
    		CellRangeAddress address11 = new CellRangeAddress(0,1,a+5,a+5);//起始行,结束行,起始列,结束列
    		addressList.add(address11);
            //跨行跨列  合并单元格
            for (int i = 0; i < addressList.size(); i++) {
            	sheet.addMergedRegion(addressList.get(i));
			}
            // 创建工作表
            HSSFCellStyle style1 = this.getColumnTopStyle(workbook);//title样式
            HSSFCellStyle style2 = this.getStyle(workbook);//单元格样式对象
            HSSFRow rowRowName = sheet.createRow(0);                // 在索引2的位置创建行(最顶端的行开始的第二行)
            rowRowName.setHeight((short) (25 * 25)); //设置高度
            // 将列头设置到sheet的单元格中
            int t = 0;
            int num = 5+title.size();
            for(int n=0;n<columnNum;n++){
            	if(n<=num){
            		t=n;
            	}else if(n>num&&n<=b){
            		t+=3;
            	}else if(n>b){
            		t+=1;
            	}
                HSSFCell  cellRowName = rowRowName.createCell(t);                //创建列头对应个数的单元格
                cellRowName.setCellType(HSSFCell.CELL_TYPE_STRING);                //设置列头单元格的数据类型
                HSSFRichTextString text = new HSSFRichTextString(rowName.get(n).toString());
                cellRowName.setCellValue(text);                                    //设置列头单元格的值
                cellRowName.setCellStyle(style1);
            }
            HSSFRow rowRowName1 = sheet.createRow(1); 
            rowRowName1.setHeight((short) (20 * 20)); //设置高度
            int k = 5+title.size();//第二行从5开始
            for(int n=0;n<rowName1.size();n++){
            	for (int i = 0; i < subtitle.size(); i++) {
            		HSSFCell  cellRowName = rowRowName1.createCell(k);                //创建列头对应个数的单元格
                    cellRowName.setCellType(HSSFCell.CELL_TYPE_STRING);                //设置列头单元格的数据类型
                    HSSFRichTextString text = new HSSFRichTextString(subtitle.get(i).toString());
                    cellRowName.setCellValue(text); 
                    cellRowName.setCellStyle(style1);
                    k++;
				}
            }
            //将查询出的数据设置到sheet对应的单元格中
            for(int i=0;i<dataList.size();i++){
            	JSONArray arr = dataList.get(i);//遍历每个对象
                HSSFRow row = sheet.createRow(i+2);//创建所需的行数
                row.setHeight((short) (25 * 20)); //设置高度
                for(int j=0; j<arr.size(); j++){
                    HSSFCell  cell = null;   //设置单元格的数据类型
                    if(j == 0){
                        cell = row.createCell(j,HSSFCell.CELL_TYPE_NUMERIC);
                        cell.setCellValue(arr.get(j).toString());    
                    }else{
                        cell = row.createCell(j,HSSFCell.CELL_TYPE_STRING);
                        if(!"".equals(arr.get(j)) && arr.get(j) != null){
                            cell.setCellValue(arr.get(j).toString());                        //设置单元格的值
                        }
                    }
                    cell.setCellStyle(style2);                                    //设置单元格样式
                }
            }
            //让列宽随着导出的列长自动适应
            for (int colNum = 0; colNum < columnNum; colNum++) {
                int columnWidth = sheet.getColumnWidth(colNum) / 256;
                for (int rowNum = 0; rowNum < sheet.getLastRowNum(); rowNum++) {
                    HSSFRow currentRow;
                    //当前行未被使用过
                    if (sheet.getRow(rowNum) == null) {
                        currentRow = sheet.createRow(rowNum);
                    } else {
                        currentRow = sheet.getRow(rowNum);
                    }
                    if (currentRow.getCell(colNum) != null) {
                        HSSFCell currentCell = currentRow.getCell(colNum);
                        if (currentCell.getCellType() == HSSFCell.CELL_TYPE_STRING) {
                            int length = currentCell.getStringCellValue().getBytes().length;
                            if (columnWidth < length) {
                                columnWidth = length;
                            }
                        }
                    }
                }
                if(colNum == 0){
                    sheet.setColumnWidth(colNum, (columnWidth+4) * 128);
                }else{
                    sheet.setColumnWidth(colNum, (columnWidth+4) * 256);
                }
            }
            if(workbook !=null){
                try
                {
	                  response.setContentType("application/octet-stream;charset=utf-8");
	                  response.setHeader("Content-disposition", "attachment;filename="+new String(fileName.getBytes("gbk"), "iso8859-1"));
	          	      response.addHeader("Pargam", "no-cache");
	                  response.addHeader("Cache-Control", "no-cache");
	                  OutputStream out = response.getOutputStream();
	                  workbook.write(out);
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    /* 
     * 列头单元格样式
     */    
	public HSSFCellStyle getColumnTopStyle(HSSFWorkbook workbook) {
            // 设置字体
          HSSFFont font = workbook.createFont();
          //设置字体大小
          font.setFontHeightInPoints((short)11);
          //设置字体名字 
          font.setFontName("Courier New");
          font.setBold(true);//设置是否加粗
          //设置样式; 
          HSSFCellStyle style = workbook.createCellStyle();
          //设置底边框颜色;  
          style.setBottomBorderColor(HSSFColor.BLACK.index);
          //设置左边框颜色; 
          style.setLeftBorderColor(HSSFColor.BLACK.index);
          //设置右边框颜色; 
          style.setRightBorderColor(HSSFColor.BLACK.index);
          //设置顶边框颜色;  
          style.setTopBorderColor(HSSFColor.BLACK.index);
          //在样式用应用设置的字体;  
          style.setFont(font);
          //设置自动换行; 
          style.setWrapText(false);
          //设置单元格背景颜色
          style.setFillForegroundColor(IndexedColors.PALE_BLUE.getIndex());
          style.setAlignment(HorizontalAlignment.CENTER);//水平居中
          style.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中
          return style;
      }
      /*  
     * 列数据信息单元格样式
     */  
	public HSSFCellStyle getStyle(HSSFWorkbook workbook) {
            // 设置字体
            HSSFFont font = workbook.createFont();
            //设置字体大小
            //font.setFontHeightInPoints((short)10);
            //字体加粗
            //font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
            //设置字体名字 
            font.setFontName("Courier New");
            //设置样式; 
            HSSFCellStyle style = workbook.createCellStyle();
            //设置底边框颜色;  
            style.setBottomBorderColor(HSSFColor.BLACK.index);
            //设置左边框颜色; 
            style.setLeftBorderColor(HSSFColor.BLACK.index);
            //设置右边框颜色; 
            style.setRightBorderColor(HSSFColor.BLACK.index);
            //设置顶边框颜色;  
            style.setTopBorderColor(HSSFColor.BLACK.index);
            //在样式用应用设置的字体;  
            style.setFont(font);
            //设置自动换行; 
            style.setWrapText(false);
            style.setAlignment(HorizontalAlignment.CENTER);//水平居中
            style.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中
            return style;
      }
	
	
}

 

 

相关文章: