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":"请求成功"}
主要业务逻辑
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;
}
}