poi导出excel动态表头并合并

实现图,全场总电位第一级,其他 例行政部为第二层,若没有第三层的第二级如V线总电和污水处理站则合并两列,第三级 例生活区,此上数据为动态数据,根据不同用户不同数据动态变化表头

DEMO代码:

package com.springboot.util;

import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
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.HttpServletResponse;

import org.apache.poi.hssf.usermodel.HSSFBorderFormatting;
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.util.CellRangeAddress;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;


@Controller
public class DynamicExport {

    @RequestMapping(value = "/export")
    @ResponseBody
    public void export(HttpServletRequest request, HttpServletResponse response) throws Exception {
        // excel标题
        String[] title = { "id", "姓名", "手机号", "城市", "县区", "房源", "地铁线", "地铁站", "售价", "面积", "房型", "用途", "权属", "楼层", "朝向",
                "楼龄", "有无电梯", "装修", "咨询时间", "备注" };
        // excel文件名
        String fileName = "购房需求信息表" + System.currentTimeMillis() + ".xls";
        // sheet名
        String sheetName = "购房需求信息表";

        String[][] content = {{ "id", "姓名", "手机号", "城市", "县区", "房源", "地铁线", "地铁站", "售价", "面积", "房型", "用途", "权属", "楼层", "朝向",
            "楼龄", "有无电梯", "装修", "咨询时间", "备注" },{ "id", "姓名", "手机号", "城市", "县区", "房源", "地铁线", "地铁站", "售价", "面积", "房型", "用途", "权属", "楼层", "朝向",
                "楼龄", "有无电梯", "装修", "咨询时间", "备注" }};
        
        // 创建HSSFWorkbook
        HSSFWorkbook wb = getHSSFWorkbook(sheetName, title, content, null);
        // 响应到客户端
        try {
            this.setResponseHeader(response, fileName);
            OutputStream os = response.getOutputStream();
            wb.write(os);
            os.flush();
            os.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //发送响应流方法
    public void setResponseHeader(HttpServletResponse response, String fileName) {
        try {
            try {
                fileName = new String(fileName.getBytes(), "ISO8859-1");
            } catch (UnsupportedEncodingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            response.setContentType("application/octet-stream;charset=ISO8859-1");
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
            response.addHeader("Pargam", "no-cache");
            response.addHeader("Cache-Control", "no-cache");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public static HSSFWorkbook getHSSFWorkbook(String sheetName, String[] title, String[][] values, HSSFWorkbook wb) {

        // 第一步,创建一个HSSFWorkbook,对应一个Excel文件
        if (wb == null) {
            wb = new HSSFWorkbook();
        }

        // 第二步,在workbook中添加一个sheet,对应Excel文件中的sheet
        HSSFSheet sheet = wb.createSheet(sheetName);

        // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制
        HSSFRow row = sheet.createRow(0);

        // 第四步,创建单元格,并设置值表头 设置表头居中
        HSSFCellStyle style = getColumnTopStyle(wb);
        
        //垂直居中
        style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建一个居中格式
        
        // 声明列对象
        HSSFCell cell = null;

        CellRangeAddress callRangeAddress = new CellRangeAddress(0,0,0,26);//起始行,结束行,起始列,结束列
        sheet.addMergedRegion(callRangeAddress);
        cell = row.createCell(0);
        cell.setCellValue("2019年11月用电统计表");
        cell.setCellStyle(style);
        
        

        List<Map<String,Object>> list = new ArrayList<>();
        Map<String,Object> map = new HashMap<>();
        map.put("id", "1");
        map.put("pid", "0");
        map.put("name", "全场总电");
        list.add(map);
        
        map = new HashMap<>();
        map.put("id", "11");
        map.put("pid", "1");
        map.put("name", "二级");
        list.add(map);
        map = new HashMap<>();
        map.put("id", "12");
        map.put("pid", "1");
        map.put("name", "二级2");
        list.add(map);
        map = new HashMap<>();
        map.put("id", "13");
        map.put("pid", "1");
        map.put("name", "二级3");
        list.add(map);
        map = new HashMap<>();
        map.put("id", "14");
        map.put("pid", "1");
        map.put("name", "二级4");
        list.add(map);
        
        
        map = new HashMap<>();
        map.put("id", "131");
        map.put("pid", "13");
        map.put("name", "三级30");
        list.add(map);
        map = new HashMap<>();
        map.put("id", "121");
        map.put("pid", "12");
        map.put("name", "三级20");
        list.add(map);
        map = new HashMap<>();
        map.put("id", "122");
        map.put("pid", "12");
        map.put("name", "三级21");
        list.add(map);
        
        
        map = new HashMap<>();
        map.put("id", "111");
        map.put("pid", "11");
        map.put("name", "三级0");
        list.add(map);
        map = new HashMap<>();
        map.put("id", "112");
        map.put("pid", "11");
        map.put("name", "三级1");
        list.add(map);
        map = new HashMap<>();
        map.put("id", "113");
        map.put("pid", "11");
        map.put("name", "三级2");
        list.add(map);
        map = new HashMap<>();
        map.put("id", "114");
        map.put("pid", "11");
        map.put("name", "三级3");
        list.add(map);
        map = new HashMap<>();
        map.put("id", "115");
        map.put("pid", "11");
        map.put("name", "三级4");
        list.add(map);
        
        HSSFCellStyle style2 = getStyle(wb);

        HSSFRow row2 = sheet.createRow(1);// row(1)第二行
        HSSFRow row3 = sheet.createRow(2);// row(2)第三行
        
        int s = 3;
        int e = 4;
        
        int s2 = 3;
        int s3 = 2;
        
        int i = 1;
        int i2 = 1;
        for (Map<String, Object> maps : list) {
            if (maps.get("pid").equals("0")) {
                CellRangeAddress call = new CellRangeAddress(1,2,1,2);//起始行,结束行,起始列,结束列
                sheet.addMergedRegion(call);
                cell = row2.createCell(1);// cell(2)第二列
                cell.setCellValue(String.valueOf(maps.get("name")));
                cell.setCellStyle(style2);
                List<Map<String,Object>> list2 = treeResultData(list, String.valueOf(maps.get("id")));
                for (Map<String, Object> map2 : list2) {
                    List<Map<String,Object>> list3 = treeResultData(list, String.valueOf(map2.get("id")));
                    
                    if (i2!=1) {
                        s2=s3+1;
                    }
                    int cr = 1;
                    if (list3.size()==0) {
                        s3+=2;
                        cr = 2;
                    }else {
                        s3+=list3.size()*2+1;
                    }
                    
                    CellRangeAddress call2 = new CellRangeAddress(1,cr,s2,s3);//起始行,结束行,起始列,结束列
                    sheet.addMergedRegion(call2);
                    cell = row2.createCell(s);
                    cell.setCellValue(String.valueOf(map2.get("name")));
                    cell.setCellStyle(style2);
                    
                    i2++;
                    for (Map<String, Object> map3 : list3) {
                        CellRangeAddress call5 = new CellRangeAddress(2,2,s,e);//起始行,结束行,起始列,结束列
                        sheet.addMergedRegion(call5);
                        cell = row3.createCell(s);
                        cell.setCellValue(String.valueOf(map3.get("name")));
                        cell.setCellStyle(style2);
                        if (i==list3.size()) {
                            cell = row3.createCell(e+1);
                            cell.setCellValue("实际用电");
                            cell.setCellStyle(style2);
                            s++;
                            e++;
                            i=0;
                        }
                        i++;
                        s+=2;
                        e+=2;
                    }
                }
            }
        }
        
        return wb;
    }
    
    public static List<Map<String,Object>> treeResultData(List<Map<String, Object>> list, String id){
        List<Map<String, Object>> resultList = new ArrayList<>();
        for (Map<String, Object> maps : list) {
            if (maps.get("pid").equals(id)) {
                Map<String,Object> map = new HashMap<>();
                map.put("id", maps.get("id"));
                map.put("pid", maps.get("pid"));
                map.put("name", maps.get("name"));
                resultList.add(map);
            }
        }
        return resultList;
    }

    /*
     * 列头单元格样式
     */
    public static HSSFCellStyle getColumnTopStyle(HSSFWorkbook workbook) {
        // 设置字体
        HSSFFont font = workbook.createFont();

        // 设置字体大小
        font.setFontHeightInPoints((short) 15);
        // 字体加粗
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        // 设置字体名字
        font.setFontName("Courier New");
        // 设置样式
        HSSFCellStyle style = workbook.createCellStyle();
        // 设置低边框
        //style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        // 设置低边框颜色
        //style.setBottomBorderColor(HSSFColor.BLACK.index);
        // 设置右边框
        //style.setBorderRight(HSSFCellStyle.BORDER_THIN);
        // 设置顶边框
        //style.setTopBorderColor(HSSFColor.BLACK.index);
        // 设置顶边框颜色
        //style.setTopBorderColor(HSSFColor.BLACK.index);
        // 在样式中应用设置的字体
        style.setFont(font);
        // 设置自动换行
        style.setWrapText(false);
        // 设置水平对齐的样式为居中对齐;
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        return style;

    }

    public static 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.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        // 设置底边框颜色;
        //style.setBottomBorderColor(HSSFColor.BLACK.index);
        // 设置左边框;
        //style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        // 设置左边框颜色;
        //style.setLeftBorderColor(HSSFColor.BLACK.index);
        // 设置右边框;
        //style.setBorderRight(HSSFCellStyle.BORDER_THIN);
        // 设置右边框颜色;
        //style.setRightBorderColor(HSSFColor.BLACK.index);
        // 设置顶边框;
        //style.setBorderTop(HSSFCellStyle.BORDER_THIN);
        // 设置顶边框颜色;
        //style.setTopBorderColor(HSSFColor.BLACK.index);
        // 在样式用应用设置的字体;
        style.setFont(font);
        // 设置自动换行;
        style.setWrapText(false);
        // 设置水平对齐的样式为居中对齐;
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        // 设置垂直对齐的样式为居中对齐;
        style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        return style;
    }
}

实际应用的代码:

package com.sgcc.epri.platform.util;

import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.text.DecimalFormat;
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.HttpServletResponse;

import org.apache.poi.hssf.usermodel.HSSFBorderFormatting;
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.util.CellRangeAddress;
import org.bouncycastle.pqc.math.linearalgebra.BigIntUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.sgcc.epri.platform.mapper.ElectricityEvaluateMapper;
import com.sgcc.epri.platform.model.responseModel.ResponseParam;
import com.sgcc.epri.platform.service.TreeService;


@Controller
public class DynamicExport {

    @Autowired
    private TreeService treeService;
    
    @Autowired
    ElectricityEvaluateMapper electricityEvaluateMapper;
    
    @RequestMapping(value = "/appSessionDemo")
    @ResponseBody
    public ResponseParam appSessionDemo(HttpServletRequest request, HttpServletResponse response) {
        String sessionId = request.getSession().getId();
        String sessionDemo = (String) request.getSession().getAttribute("demo");
        System.err.println(sessionDemo);
        String demo = request.getParameter("demo");
        System.err.println(demo);
        request.getSession().setAttribute("demo", demo);
        ResponseParam r = new ResponseParam();
        
        Map<String,Object> map = new HashMap<>();
        map.put("returnData", sessionDemo);
        map.put("sessionId", sessionId);
        
        r.setResult(map);
        return r;
    }
    
    @RequestMapping(value = "/export")
    @ResponseBody
    public void export(HttpServletRequest request, HttpServletResponse response) throws Exception {
        String time = request.getParameter("time");
        
        List<Map<String,Object>> treeData = treeService.getTreeData(UserUtil.getUserId(),"01");
        // excel标题
        String[] title = String.valueOf("1号,2号,3号,4号,5号,6号,7号,8号,9号,10号,11号,12号,13号,14号,15号,16号,17号,18号,19号,20号,21号,22号,23号,24号,25号,26号,27号,28号,29号,30号,31号,合计").split(",");
        // excel文件名
        String fileName = "用电详情报表" + System.currentTimeMillis() + ".xls";
        // sheet名
        String sheetName = "用电详情报表";

        String[][] content = {};
        
        // 创建HSSFWorkbook
        HSSFWorkbook wb = getHSSFWorkbook(sheetName, title, content, null, treeData, time);
        // 响应到客户端
        try {
            this.setResponseHeader(response, fileName);
            OutputStream os = response.getOutputStream();
            wb.write(os);
            os.flush();
            os.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //发送响应流方法
    public void setResponseHeader(HttpServletResponse response, String fileName) {
        try {
            try {
                fileName = new String(fileName.getBytes(), "ISO8859-1");
            } catch (UnsupportedEncodingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            response.setContentType("application/octet-stream;charset=ISO8859-1");
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
            response.addHeader("Pargam", "no-cache");
            response.addHeader("Cache-Control", "no-cache");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public HSSFWorkbook getHSSFWorkbook(String sheetName, String[] title, String[][] values, HSSFWorkbook wb, List<Map<String, Object>> treeData, String time) {

        // 第一步,创建一个HSSFWorkbook,对应一个Excel文件
        if (wb == null) {
            wb = new HSSFWorkbook();
        }

        // 第二步,在workbook中添加一个sheet,对应Excel文件中的sheet
        HSSFSheet sheet = wb.createSheet(sheetName);

        // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制
        HSSFRow row = sheet.createRow(0);

        // 第四步,创建单元格,并设置值表头 设置表头居中
        HSSFCellStyle style = getColumnTopStyle(wb);
        
        // 声明列对象
        HSSFCell cell = null;

        // 合并首行为标题使用
        CellRangeAddress callRangeAddress = new CellRangeAddress(0,0,0,30);//起始行,结束行,起始列,结束列
        sheet.addMergedRegion(callRangeAddress);
        cell = row.createCell(0);
        cell.setCellValue(""+time+"用电统计表");
        cell.setCellStyle(style);

        // 获取监测点数据列表
        List<Map<String,Object>> list = treeData;
        
        // 定义样式
        HSSFCellStyle style2 = getStyle(wb);

        HSSFRow row2 = sheet.createRow(1);// row(1)第二行
        HSSFRow row3 = sheet.createRow(2);// row(2)第三行
        HSSFRow row4 = sheet.createRow(3);// row(3)第四行
        
        List<Map<String,Object>> countList = new ArrayList<>();// 存储监测点id和对应详情的位置
        
        int s = 3;
        int e = 4;
        
        int s2 = 3;
        int s3 = 2;
        
        int i = 1;
        int i2 = 1;
        // 便利监测点数据写入表头
        for (Map<String, Object> maps : list) {
            if (maps.get("parentSturctId").equals("0")) {// 判断为总表(0)
                // 合并总表位置并对合并位置赋值
                CellRangeAddress call = new CellRangeAddress(1,2,1,2);// 起始行,结束行,起始列,结束列
                sheet.addMergedRegion(call);
                cell = row2.createCell(1);// cell(2)第二列
                cell.setCellValue(String.valueOf(maps.get("unitName")));
                cell.setCellStyle(style2);
                
                Map<String,Object> countMap = new HashMap<>();
                countMap.put("msId", maps.get("msId"));
                countMap.put("shishuCell", 1);
                countMap.put("valueCell", 2);
                countList.add(countMap);
                
                // 赋值对应位置的明细列头
                cell = row4.createCell(0);
                cell.setCellValue("日期");
                cell.setCellStyle(style2);
                cell = row4.createCell(1);
                cell.setCellValue("示数");
                cell.setCellStyle(style2);
                cell = row4.createCell(2);
                cell.setCellValue("电量");
                cell.setCellStyle(style2);
                
                List<Map<String,Object>> list2 = treeResultData(list, String.valueOf(maps.get("structDetId")));// 获取总表下的监测点信息
                for (Map<String, Object> map2 : list2) {// 循环二级监测点信息
                    List<Map<String,Object>> list3 = treeResultData(list, String.valueOf(map2.get("structDetId")));// 获取三级监测点信息
                    
                    if (i2!=1) {// 判断i2不等于1时则是已经循环过,新合并开始列需获取最后的列+1
                        s2=s3+1;// 获取最后一列并+1作为河北开始列
                    }
                    int cr = 1;// cr默认为1
                    if (list3.size()==0) {// 验证此2级节点无子级
                        s3+=2;// 合并列为两列
                        cr = 2;// 合并行为两行
                        
                        // 给第三级合并标识+2告诉新的开始结束位置
                        s+=2;
                        e+=2;
                    }else {// 若有子级结束行则+=当前查询数据条数*2+1
                        s3+=list3.size()*2+1;
                    }
                    
                    if (cr==2) {// 验证无子级    赋值对应位置的明细列头
                        
                        countMap = new HashMap<>();
                        countMap.put("msId", map2.get("msId"));
                        countMap.put("shishuCell", s2);
                        countMap.put("valueCell", s3);
                        countList.add(countMap);
                        
                        cell = row4.createCell(s2);
                        cell.setCellValue("示数");
                        cell.setCellStyle(style2);
                        cell = row4.createCell(s3);
                        cell.setCellValue("电量");
                        cell.setCellStyle(style2);
                    }
                    
                    // 二级菜单合并赋值
                    CellRangeAddress call2 = new CellRangeAddress(1,cr,s2,s3);//起始行,结束行,起始列,结束列
                    sheet.addMergedRegion(call2);
                    cell = row2.createCell(s2);
                    cell.setCellValue(String.valueOf(map2.get("unitName")));
                    cell.setCellStyle(style2);
                    
                    i2++;// 标识++,说明已开始占位,别占重复位置
                    for (Map<String, Object> map3 : list3) {// 循环三级监测点数据
                        
                        countMap = new HashMap<>();
                        countMap.put("msId", map3.get("msId"));
                        countMap.put("shishuCell", s);
                        countMap.put("valueCell", e);
                        countList.add(countMap);
                        
                        // 赋值对应位置的明细列头
                        cell = row4.createCell(s);
                        cell.setCellValue("示数");
                        cell.setCellStyle(style2);
                        cell = row4.createCell(e);
                        cell.setCellValue("电量");
                        cell.setCellStyle(style2);
                        
                        // 三级菜单合并赋值
                        CellRangeAddress call5 = new CellRangeAddress(2,2,s,e);//起始行,结束行,起始列,结束列
                        sheet.addMergedRegion(call5);
                        cell = row3.createCell(s);
                        cell.setCellValue(String.valueOf(map3.get("unitName")));
                        cell.setCellStyle(style2);
                        // 验证循环是否是最后一次
                        if (i==list3.size()) {// 循环最后一次   +实际用电和总电量的表头写入
                            cell = row3.createCell(e+1);
                            cell.setCellValue("实际用电");
                            cell.setCellStyle(style2);
                            
                            cell = row4.createCell(e+1);
                            cell.setCellValue("总电量");
                            cell.setCellStyle(style2);
                            
                            countMap = new HashMap<>();
                            countMap.put("msId", map2.get("msId"));
                            countMap.put("sumValue", e+1);
                            countList.add(countMap);
                            
                            s++;
                            e++;
                            i=0;
                        }
                        i++;
                        s+=2;
                        e+=2;
                    }
                }
            }
        }
        
        // 获取左侧日期数据
        for (int j = 0; j < title.length; j++) {
            HSSFRow forRow = sheet.createRow(4 + j);// row 赋数据时的行
            rowSetDate(countList,forRow,cell,style2,j,time,title.length,treeData);
            cell = forRow.createCell(0);// createCell赋数据的列
            cell.setCellValue(title[j]);
            cell.setCellStyle(style2);
        }
                
        return wb;
    }
    
    /**
     * an:因为createRow会覆盖同行之前的数据,所以createRow只能用一次,调此方法传递HSSFRow写入值
     * @param countList
     * @param forRow
     * @param cell
     * @param style2
     * @param j2 
     * @param time 
     * @param length 
     * @param treeData 
     * @return 
     */
    public String rowSetDate(List<Map<String,Object>> countList, HSSFRow forRow, HSSFCell cell, HSSFCellStyle style2, int j2, String time, int length, List<Map<String, Object>> treeData) {
        String result = "0";
        String j = String.valueOf(j2+1);
        List<Map<String,Object>> getList = getData(time,length,j2,treeData);
        for (Map<String, Object> map : countList) {
            for (Map<String, Object> map2 : getList) {
                if (map.get("msId").equals(map2.get("msId"))) {
                    if (j.equals(String.valueOf(map2.get("time")))) {
                        if (!"null".equals(String.valueOf(map.get("sumValue")))) {
                            cell = forRow.createCell(Integer.valueOf(String.valueOf(map.get("sumValue"))));// createCell赋数据的列
                            cell.setCellValue(String.valueOf(map2.get("price")));
                            cell.setCellStyle(style2);
                        }else {
                            cell = forRow.createCell(Integer.valueOf(String.valueOf(map.get("shishuCell"))));// createCell赋数据的列
                            cell.setCellValue(String.valueOf(map2.get("shishu")));
                            cell.setCellStyle(style2);
                            cell = forRow.createCell(Integer.valueOf(String.valueOf(map.get("valueCell"))));// createCell赋数据的列
                            cell.setCellValue(String.valueOf(map2.get("price")));
                            cell.setCellStyle(style2);
                        }
                    }
//                    String sumValue = String.valueOf(map.get("sumValue"));
//                    if (sumValue!=null&&!"".equals(sumValue)&&!"null".equals(sumValue)) {
//                         cell = forRow.createCell(Integer.valueOf(String.valueOf(map.get("sumValue"))));// createCell赋数据的列
//                         cell.setCellValue(1);
//                         cell.setCellStyle(style2);
//                    }
                }
            }
        }
        return result;
    }
    
    /**
     * an:模拟数据
     * @param time 
     * @param j2 
     * @param length 
     * @param treeData 
     * @return
     */
    public List<Map<String,Object>> getData(String time, int length, int j2, List<Map<String, Object>> treeData){
        DecimalFormat dcf = new DecimalFormat("0.00");
        List<Map<String,Object>> getList = electricityEvaluateMapper.queryTBMonthElecTricity(UserUtil.getUserId(), time+"-01", time+"-31");
        List<Map<String,Object>> list = new ArrayList<>();
        String msId = null;
        double a = 0;
        for (Map<String, Object> map : getList) {
            Map<String,Object> setMap = new HashMap<>();
            setMap.put("msId", map.get("MS_ID"));
            setMap.put("shishu", map.get("SHISHU")==null?"-":map.get("SHISHU"));
            setMap.put("price", map.get("ELECTRICITY")==null?"-":map.get("ELECTRICITY"));
            setMap.put("time", Integer.valueOf(String.valueOf(map.get("DATA_DATE")).split("-")[2]));
            list.add(setMap);
            int i = 1;
            for (Map<String, Object> map2 :treeData) {
                if (map2.get("msId").equals(map.get("MS_ID"))) {
                    if (!String.valueOf(map.get("MS_ID")).equals(msId)) {
                        a = 0;
                    }
                    msId = String.valueOf(map.get("MS_ID"));
                    a += Double.parseDouble(String.valueOf(map.get("ELECTRICITY")==null?"0":map.get("ELECTRICITY")));
                }
                if (i==treeData.size()) {
                    Map<String,Object> setMap2 = new HashMap<>();
                    setMap2.put("msId", msId);
                    setMap2.put("shishu", "");
                    setMap2.put("price", dcf.format(a));
                    setMap2.put("time", length);
                    list.add(setMap2);
                }
                i++;
            }
        }
        
        
//        List<Map<String,Object>> list = new ArrayList<>();
//        for (int i = 1; i <= 12; i++) {
//            Map<String,Object> map = new HashMap<>();
//            map.put("time", i);
//            map.put("price", "2"+i);
//            map.put("shishu", "2"+i);
//            map.put("msId", "1000010000232435");
//            list.add(map);
//            map = new HashMap<>();
//            map.put("time", i);
//            map.put("price", "3"+i);
//            map.put("shishu", "3"+i);
//            map.put("msId", "1000010000232447");
//            list.add(map);
//        }
//        Map<String,Object> map = new HashMap<>();
//        map.put("time", 13);
//        map.put("price", "858");
//        map.put("shishu", "");
//        map.put("msId", "1000010000232435");
//        list.add(map);
//        map = new HashMap<>();
//        map.put("time", 13);
//        map.put("price", "1248");
//        map.put("shishu", "");
//        map.put("msId", "1000010000232447");
//        list.add(map);
        
        return list;
    }
    
    /**
     * an:根据id获得子级数据
     * @param list
     * @param id
     * @return
     */
    public static List<Map<String,Object>> treeResultData(List<Map<String, Object>> list, String id){
        List<Map<String, Object>> resultList = new ArrayList<>();
        for (Map<String, Object> maps : list) {
            if (maps.get("parentSturctId").equals(id)) {
                Map<String,Object> map = new HashMap<>();
                map.put("structDetId", maps.get("structDetId"));
                map.put("parentSturctId", maps.get("parentSturctId"));
                map.put("unitName", maps.get("unitName"));
                map.put("msId", maps.get("msId"));
                resultList.add(map);
            }
        }
        return resultList;
    }

    /*
     * 列头单元格样式
     */
    public static HSSFCellStyle getColumnTopStyle(HSSFWorkbook workbook) {
        // 设置字体
        HSSFFont font = workbook.createFont();

        // 设置字体大小
        font.setFontHeightInPoints((short) 15);
        // 字体加粗
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        // 设置字体名字
        font.setFontName("Courier New");
        // 设置样式
        HSSFCellStyle style = workbook.createCellStyle();
        // 设置低边框
        //style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        // 设置低边框颜色
        //style.setBottomBorderColor(HSSFColor.BLACK.index);
        // 设置右边框
        //style.setBorderRight(HSSFCellStyle.BORDER_THIN);
        // 设置顶边框
        //style.setTopBorderColor(HSSFColor.BLACK.index);
        // 设置顶边框颜色
        //style.setTopBorderColor(HSSFColor.BLACK.index);
        // 在样式中应用设置的字体
        style.setFont(font);
        // 设置自动换行
        style.setWrapText(false);
        // 设置水平对齐的样式为居中对齐;
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        return style;

    }

    public static 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.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        // 设置底边框颜色;
        //style.setBottomBorderColor(HSSFColor.BLACK.index);
        // 设置左边框;
        //style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        // 设置左边框颜色;
        //style.setLeftBorderColor(HSSFColor.BLACK.index);
        // 设置右边框;
        //style.setBorderRight(HSSFCellStyle.BORDER_THIN);
        // 设置右边框颜色;
        //style.setRightBorderColor(HSSFColor.BLACK.index);
        // 设置顶边框;
        //style.setBorderTop(HSSFCellStyle.BORDER_THIN);
        // 设置顶边框颜色;
        //style.setTopBorderColor(HSSFColor.BLACK.index);
        // 在样式用应用设置的字体;
        style.setFont(font);
        // 设置自动换行;
        style.setWrapText(false);
        // 设置水平对齐的样式为居中对齐;
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        // 设置垂直对齐的样式为居中对齐;
        style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        return style;
    }
}
 

发布了19 篇原创文章 · 获赞 12 · 访问量 1868

猜你喜欢

转载自blog.csdn.net/AnNanDu/article/details/103729332