使用poi导出excel自动合并指定列

一、效果图


二、js代码

$("body").on("click", "#btn_print", function () {
        	assessEvaluationSummaryPrint();
        });
function assessEvaluationSummaryPrint() {
    	var arr_columns = assemble_dg_columns();
    	var key_columns = [];
    	var value_columns = [];
        for (var i = 0; i < arr_columns.length; i++) {
            if(NOTNULL(arr_columns[i].title)&&arr_columns[i].title!="id"){
            	key_columns.push(arr_columns[i].field);
                value_columns.push(arr_columns[i].title);
            }
        }
    	window.location.href= "jee/VAssessEvaluationSummaryC/exportExecl?key_columns="+key_columns+"&value_columns="+value_columns;
    }

三、后台代码

(1)controller

@RequestMapping(value="jee/VAssessEvaluationSummaryC")
@Controller
public class VAssessEvaluationSummaryController extends BaseEntityController<VAssessEvaluation>{

	public VAssessEvaluationSummaryController(){
		super(VAssessEvaluation.class);
	}
	
	@Resource
	private VAssessEvaluationSummaryService vAssessEvaluationSummaryService;

	
	@ResponseBody
	@SystemControllerLog(description="考核评价汇总--导出功能")
	@RequestMapping(value="exportExecl")
	public ReturnDatas exportExecl(String[] key_columns,String[] value_columns,HttpServletResponse response){
		ReturnDatas returnDatas = ReturnDatas.getSuccessReturnDatas();
		try {
			response.setCharacterEncoding("UTF-8");
            response.setContentType("application/msexcle");   
            response.setHeader("content-disposition", "attachment;filename=test.xlsx");
            HSSFWorkbook workbook = vAssessEvaluationSummaryService.exportExecl(key_columns,value_columns);
            //写入Excel文件  
            OutputStream outputStream =  response.getOutputStream();  
            workbook.write(outputStream);  
            outputStream.close();  
			returnDatas.setStatus(ReturnDatas.SUCCESS);
			return returnDatas;
		} catch (Exception e) {
			e.printStackTrace();
			LogUtil.error("考核评价汇总--导出功能异常:"+e.getMessage(),e);
			returnDatas.setStatus(ReturnDatas.ERROR);
			returnDatas.setMessage("考核评价汇总--导出功能异常。");
		}
		return returnDatas;
	}
}

(2)service

@Service("vAssessEvaluationSummaryService")
public class VAssessEvaluationSummaryServiceImpl implements VAssessEvaluationSummaryService {
	private List<VAssessEvaluation> list;
	@Resource
	private IbaseInfoService baseInfoService;
	
	/**
	 * 
	 * @Description 考核评价汇总--查询操作 
	 * @param rows
	 * @param page
	 * @param sort
	 * @param order
	 * @param key
	 * @param start_time
	 * @param end_time
	 * @param id_postduty
	 * @param question_type
	 * @return PageResult
	 * @throws Exception 
	 *
	 */
	@Override
	public PageResult listAllVassessEvaluationSummary(int rows,int page,String sort, String order,String key,String start_time, String end_time,
			String id_postduty,String question_type) throws Exception {
		if(StringUtils.isBlank(key)) {
			key = "";
		}
		List<Object> ls_param = new ArrayList<Object>();
		String hql = "select u from VAssessEvaluation u where (del_flag is null or del_flag != '1')";
		String hqlCount = "select count(u) from VAssessEvaluation u where (del_flag is null or del_flag != '1')";
		if(StringUtils.isNotBlank(key)) {
			hql+= " and ( instr(type,?) > 0 or instr(updateuser,?)>0 or instr(updatetime,?)>0 )";
			hqlCount += " and ( instr(type,?) > 0 or instr(updateuser,?)>0 or instr(updatetime,?)>0 )";
			ls_param.add(key);
			ls_param.add(key);
			ls_param.add(key);
		}
		if(StringUtils.isNotBlank(start_time)) {
			hql += " and find_date >= ?";
			hqlCount += " and find_date >= ?";
			ls_param.add(start_time);
		}
		if(StringUtils.isNotBlank(end_time)) { 
			hql += " and find_date <= ?";
			hqlCount += " and find_date <= ?";
			ls_param.add(end_time);
		}
		if(StringUtils.isNotBlank(question_type)) { 
			hql += " and id_question_type = ?";
			hqlCount += " and id_question_type = ?";
			ls_param.add(question_type);
		}
		if(StringUtils.isNotBlank(id_postduty)) { 
			hql += " and id_postduty = ?";
			hqlCount += " and id_postduty = ?";
			ls_param.add(id_postduty);
		}
		if(StringUtils.isNotBlank(sort)&&StringUtils.isNotBlank(order)) {
			hql += " order by " + sort + " " + order;
		}
		list = baseInfoService.listQueryByHql(hql,ls_param,rows,page);
		Object total = baseInfoService.getObjectByHql(hqlCount,ls_param);
		PageResult result = new PageResult();
		if (list != null) {
			result.setRows(list);
			if (total != null) {
				result.setTotal(Integer.parseInt(total.toString()));
			} else {
				result.setTotal(0);
			}
		}
		return result;
	}
	
	/**
	 * 
	 * @Description 考核评价汇总--导出功能 
	 * @param key_columns
	 * @param value_columns
	 * @return HSSFWorkbook
	 * @throws Exception 
	 *
	 */
	@Override
	public HSSFWorkbook exportExecl(String[] key_columns, String[] value_columns) throws Exception {
		List<List<String>> list1 = new ArrayList<>();
		for (VAssessEvaluation v : list) {
			List<String> list2 = new ArrayList<>();
			for (int i = 0; i < key_columns.length; i++) {
				String field = ExportUtil.getFiled(v, key_columns[i]);
				if("performance".equals(key_columns[i])){
					if(v.getPerformance()!=0) {
						list2.add("-"+field);
					}else {
						list2.add(field);
					}
				}else {
					list2.add(field);
				}
			}
			list1.add(list2);
		}
		int[] arr = {1,2,3}; //要合并的列,从0开始
		int judge = 10; //判断字段,没有则为-1
		return ExportUtil.exportAutoCell("考核评价汇总",key_columns,value_columns,list1,arr,judge);
	}
	
}

(3)导出工具类

public class ExportUtil {
    
    /**
     * 
     * @Date 2018年6月19日 下午3:46:27
     * @Description 导出自动合并单元格 
     * @Fcunction exportAutoCell
     * @param sheetName
     * @param key_columns
     * @param value_columns
     * @param list
     * @param field_arr
     * @param judge
     * @return HSSFWorkbook
     *
     */
    public static HSSFWorkbook exportAutoCell(String sheetName,String[] key_columns,String[] value_columns,List<List<String>> list,int[] field_arr,int judge){
        //创建一个Excel文件
        HSSFWorkbook workbook = new HSSFWorkbook();
        //创建一个工作表
        HSSFSheet sheet = workbook.createSheet(sheetName);
        //添加表头行
        HSSFRow hssfRow = sheet.createRow(0);
        //设置单元格格式
        HSSFCellStyle cellStyle = workbook.createCellStyle();
        //设置单元格边框
        cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
        cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
        cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); //水平居中
        cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); //垂直居中
        for (int i = 0; i < value_columns.length; i++) {
        	//添加表头内容
            HSSFCell headCell = hssfRow.createCell(i);
            headCell.setCellValue(value_columns[i]);
            headCell.setCellStyle(cellStyle);
		}
        //把数据添加到excel
        for (int i = 0; i < list.size(); i++) { //每一行
        	hssfRow = sheet.createRow(i + 1);
        	for (int j = 0; j < list.get(i).size(); j++) { //每一行的每一格
        		//创建单元格,并设置值
        		HSSFCell cell = hssfRow.createCell(j);
        		cell.setCellValue(list.get(i).get(j));
        		cell.setCellStyle(cellStyle);
				
			}
        }
        //自动合并
        for (int i = list.size()-1; i <= 1; i--) { //每一行(从上往下遍历如果第三行和前两行合并过的合并,合并效果差,所以倒着遍历)
        	for (int k = 0; k < field_arr.length; k++) {
        		int field = field_arr[k]; //要排序的字段
        		if(list.get(i).get(field).equals(list.get(i-1).get(field))){ //相邻的上下两行
        			int rowspan = 2;
        			for (int j = 2; i-j >= 0; j++) { //判断上下多行内容一样
        				if(!list.get(i).get(field).equals(list.get(i-j).get(field))){
        					break;
        				}else{
        					if(judge!=-1) {
        						if(!list.get(i).get(judge).equals(list.get(i-j).get(judge))){
        							break;
        						}
        					}
        					rowspan = j+1;
        				}
        			}
        			sheet.addMergedRegion(new CellRangeAddress(i-rowspan+2, i+1, field, field)); 
        		}
        	}
        }
        return workbook;
    }
    
    
    /**
     * 
     * @Author zhangshizhe
     * @Date 2018年6月15日 下午1:53:52
     * @Description 利用反射获取get方法 
     * @Fcunction getFiled
     * @param object
     * @param field
     * @return String
     *
     */
    public static String getFiled(Object object, String field) {
        Class<? extends Object> clazz  = object.getClass();
        PropertyDescriptor pd = null;
        Method getMethod = null;
        try {
            pd = new PropertyDescriptor(field, clazz);
            if (null != pd) {
                // 获取field属性的get方法
                getMethod = pd.getReadMethod();
                Object invoke = getMethod.invoke(object);
                if(invoke==null) {
                	invoke = "";
                }
                return invoke.toString();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }
    
}

注:合并导org.apache.poi.ss.util.CellRangeAddress包,org.apache.poi.hssf.util.CellRangeAddress包已废弃;

import org.apache.poi.ss.util.CellRangeAddress;

合并addMergedRegion方法四个属性分别是(开始行,结束行,开始列,结束列)

sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, 1)); 

猜你喜欢

转载自blog.csdn.net/qq_15260315/article/details/80736422