package cn.ffcs.system.controller;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import jxl.*;
import jxl.read.biff.BiffException;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import com.alibaba.dubbo.config.annotation.Reference;
import cn.ffcs.system.common.StringUtils;
import cn.ffcs.uam.service.StatisticsService;
/**
* 综合统计数据导入管理
* */
@Controller
@RequestMapping(value="/admin/statistics/excel")
public class StatisticsImportController {
@Reference(registry = "real-registry")
private StatisticsService statisticsService;
private String[] statisticsCols = {
"TITLE","UNIT","S1","S2","S3", "S4","STYPE",
"REMARK","SYEAR","SMONTH","OPDATE","TREE_ID"
};
SimpleDateFormat formate = new SimpleDateFormat("yyyy/MM/dd");
private int listLimits = 200;
@RequestMapping(value="/doImport", method=RequestMethod.POST)
@SuppressWarnings({ "rawtypes", "unchecked"})
public String doImport(HttpSession session, HttpServletRequest request,
@RequestParam("excelFile") MultipartFile excelFile, ModelMap map) {
String returnPage = "/statistics/importResult.ftl";
Workbook rwb = null;
WorkbookSettings wbs = new WorkbookSettings();
//String rootFolder = Constants.RESOURSE_SAVE_ROOT_PATH+"statistics/import-failure";
String path = request.getSession().getServletContext().getRealPath("upload");
String fileName = excelFile.getOriginalFilename();
wbs.setEncoding("UTF-8");
//wbs.setWriteAccess(null);
//wbs.setUseTemporaryFileDuringWrite(true);
File targetFile = new File(path, fileName);
if(!targetFile.exists()){
targetFile.mkdirs();
}
try {
excelFile.transferTo(targetFile);
} catch (Exception e) {
e.printStackTrace();
}
//wbs.setTemporaryFileDuringWriteDirectory(targetFile);//临时文件夹的位置
try{
rwb = Workbook.getWorkbook(targetFile, wbs);
Sheet sheet = rwb.getSheet(0);
if(sheet.getRows()<2){
map.put("tipErrMessage", "没有需要导入的数据");
return returnPage;
}
List list = null;
int rows = sheet.getRows();
int index = 0;
for(int i = 0; i < rows; i++) {
String checkStatus = "";
Cell[] cells = sheet.getRow(i);
if(!isEmptyRow(cells)) {//检查非空行的数据
checkStatus = checkRow(cells); //检查数据有效性
}
if(new StringUtils().isEmpty(checkStatus)) continue;
else {
map.addAttribute("tipErrMessage", "导入失败,第"+(i+1)+"行,"+checkStatus);
return returnPage;
}
}
//int records = this.getRightRows(sheet) - 1;//正确记录数 = 总记录数 - 空行 - 表头
for(int i = 1; i < sheet.getRows(); i++){
Cell[] cells = sheet.getRow(i);
if(index == 0) list = new ArrayList();
if(!isEmptyRow(cells)) {//跳过空行
Map rowMap = new HashMap<String,String>();
for(int j = 0; j < statisticsCols.length; j++) {
String colName = statisticsCols[j];
String colValue = "";
try {
Cell cell = sheet.getCell(j,i);
if(cell.getType() == CellType.DATE){
DateCell dateCell = (DateCell)cell;
colValue = formate.format(dateCell.getDate());
} else if(cell.getType() == CellType.EMPTY) {
colValue = "";
} else {
colValue = cell.getContents().trim();
colValue = colValue.replaceAll("\"","");
}
if("OPDATE".equals(colName)) { //检查日期
colValue = colValue.toString().replaceAll("-","/");
colValue = formate.format(formate.parse(colValue.toString()));
}
rowMap.put(colName, colValue);
}catch(Exception e){
}
}
list.add(rowMap);
index++;
}
}
rwb.close();
if(list.size() > 0){
int temp = statisticsService.insertByExcel(list);
map.addAttribute("tipErrMessage", temp !=0 ? "导入成功,共导入"+temp+"条数据":"导入失败");
}
}catch(IOException e){
return returnPage;
}catch(BiffException e) {
map.addAttribute("tipErrMessage", "excel版本错误!请使用2003版excel");
return returnPage;
}
return returnPage;
}
/**
* 计算出去掉空行后的行数
* @param sheet
* @return
*/
private int getRightRows(Sheet sheet){
int cols = sheet.getColumns();
int rows = sheet.getRows();
int nullcellNum;
int afterRows = rows;
for(int i = 0; i < rows; i++){
nullcellNum = 0;
for(int j = 0; j < cols; j++){
String val = sheet.getCell(j, i).getContents();
if(StringUtils.isEmpty(val)){
nullcellNum ++;
}
}
if(nullcellNum >= cols){
afterRows --;
}
}
return afterRows;
}
/**
* 检查是否是空行
* @param cells
* @return
*/
public boolean isEmptyRow(Cell[] cells){
if(cells == null || cells.length == 0) return true;
for(int j = 0; j < cells.length; j++) {
Cell cell = cells[j];
if((cell.getType() != CellType.EMPTY) && !"".equals(cell.getContents().trim())) {
return false;
}
}
return true;
}
/**
* 检查excel行是否有效
* @param cells
* @param impType
* @return
*/
@SuppressWarnings("unused")
private String checkRow(Cell[] cells){
StringUtils stringUtils = new StringUtils();
if(cells == null || cells.length == 0) return "空行";
for(int i = 0; i < cells.length; i++) {
String colName = getColNameByIndex(statisticsCols,i);
String celValue = cells[i].getContents();
if("TITLE".equals(colName) && stringUtils.isEmpty(celValue)){
return "指标不能为空";
}
if("STYPE".equals(colName) && stringUtils.isEmpty(celValue)){
return "类型不能为空";
}
if("SYEAR".equals(colName) && stringUtils.isEmpty(celValue)){
return "年份不能为空";
}
if("SMONTH".equals(colName) && stringUtils.isEmpty(celValue)){
return "月份不能为空";
}
if("OPDATE".equals(colName) && stringUtils.isEmpty(celValue)){
return "导入时间不能为空";
}
if("TREE_ID".equals(colName) && stringUtils.isEmpty(celValue)){
return "树节点不能为空";
}
}
return "";
}
@SuppressWarnings("unused")
private String getColNameByIndex(String[] colName,int index){
if((0<= index) && (index <colName.length)) {
return colName[index];
}
return "";
}
}
</pre><pre name="code" class="java">
Excel模板:
指标 | 单位 | 现价 | 不变价 | 比上年同期增长% | S4 | 类型 | 备注 | 年份 | 月份 | 导入时间 | 树节点 |
地区生产总值 | 万元 | 30 | 30 | 30 | s1 | 2014 | 11 | 2014/8/21 | 15 | ||
第一产业 | 万元 | 3 | 3 | 3 | s1 | 2014 | 11 | 2014/8/21 | 2 | ||
农林牧渔业 | 万元 | 3 | 3 | 3 | s1 | 2014 | 11 | 2014/8/21 | 3 | ||
第二产业 | 万元 | 6 | 6 | 6 | s1 | 2014 | 11 | 2014/8/21 | 4 | ||
工业 | 万元 | 3 | 3 | 3 | s1 | 2014 | 11 | 2014/8/21 | 5 | ||
建筑业 | 万元 | 3 | 3 | 3 | s1 | 2014 | 11 | 2014/8/21 | 6 | ||
第三产业 | 万元 | 21 | 21 | 21 | s1 | 2014 | 11 | 2014/8/21 | 7 | ||
交通运输、仓储和邮政业 | 万元 | 3 | 3 | 3 | s1 | 2014 | 11 | 2014/8/21 | 8 | ||
批发和零售业 | 万元 | 3 | 3 | 3 | s1 | 2014 | 11 | 2014/8/21 | 9 | ||
住宿和餐饮业 | 万元 | 3 | 3 | 3 | s1 | 2014 | 11 | 2014/8/21 | 10 | ||
金融业 | 万元 | 3 | 3 | 3 | s1 | 2014 | 11 | 2014/8/21 | 11 | ||
房地产业 | 万元 | 3 | 3 | 3 | s1 | 2014 | 11 | 2014/8/21 | 12 | ||
营利性服务业 | 万元 | 3 | 3 | 3 | s1 | 2014 | 11 | 2014/8/21 | 13 | ||
非营利性服务业 | 万元 | 3 | 3 | 3 | s1 | 2014 | 12 | 2014/8/21 | 14 |