POI的使用代码片段

 @RequestMapping("/grossExcel")
    @ResponseBody
    public void grossExcel(Integer type, String id, String startime, String endtime, Integer value) throws Exception {
//        进行数据的获取
//        类型说明  1:本天  2:本周  3:本月   4:本年  5:自定义年   6:自定义月  7: 自定义天 -------------  数据的获取
        ArrayList<Object> objects = null;
        if (type == 1 && "".equals(startime) && "".equals(endtime)) {
            objects = jtlService.tianonClickon(id);
        } else if (type == 2 && "".equals(startime) && "".equals(endtime)) {
            objects = jtlService.tianonClicktow(id);
        } else if (type == 3 && "".equals(startime) && "".equals(endtime)) {
            objects = jtlService.tianonClickyue(id);
        } else if (type == 4 && "".equals(startime) && "".equals(endtime)) {
            objects = jtlService.tianonClicknian(id);
        } else if (type == 5 && !"".equals(startime) && !"".equals(endtime)) {
            objects = jtlService.collectNianClick(id, startime, endtime);
        } else if (type == 6 && !"".equals(startime) && !"".equals(endtime)) {
            objects = jtlService.collectYueClick(id, startime, endtime);
        } else if (type == 7 && !"".equals(startime) && !"".equals(endtime)) {
            objects = jtlService.collectTianClick(id, startime, endtime);
        }
        List<Map<String, Object>> maps = new ArrayList<>();

        Map<String, Object> hashMap = new HashMap<>();
        if (value == 1) {
//            类型   设置的是在下面获取数据的时候,名称和值  具体的数据
            hashMap.put("time", getString(objects.get(0).toString()));
            hashMap.put("sxh", "上行");
            hashMap.put("flowTotal", getString(objects.get(1).toString()));
            hashMap.put("tonsTotal", getString(objects.get(2).toString()));
            maps.add(hashMap);

            Map<String, Object> hashMap2 = new HashMap<>();
            hashMap2.put("time", getString(objects.get(0).toString()));
            hashMap2.put("sxh", "下行");
            hashMap2.put("flowTotal", getString(objects.get(3).toString()));
            hashMap2.put("tonsTotal", getString(objects.get(4).toString()));
            maps.add(hashMap2);
        } else if (value == 2) {
//            总量
            hashMap.put("time", getString(objects.get(0).toString()));
            hashMap.put("sxh", "合计");
            hashMap.put("flowTotal", getString(objects.get(6).toString()));
            hashMap.put("tonsTotal", getString(objects.get(5).toString()));
            maps.add(hashMap);
        }


//  标题下面的文字
        List<String> headers = new ArrayList<>();
        headers.add("查询时间");
        headers.add("上下行");
        headers.add("流量总计(艘)");
        headers.add("总准载吨位(吨)");
        exportExcel(maps, headers, value);
    }

    private String getString(String objects) {
        int length = objects.length();
        return objects.substring(1, length - 1);
    }

    /**
     * 导出Excel
     * <p>
     * <p>
     * <p>
     * (船舶登记数据List)
     * <p>
     * (表头)
     *
     * @return
     * @throws Exception
     * @author huangan
     */
    @SuppressWarnings({"rawtypes", "deprecation"})
    public void exportExcel(List<Map<String, Object>> data, List<String> headers, Integer value) throws Exception {
//------------------首先创建工作簿
        HSSFWorkbook workbook = new HSSFWorkbook();
        // 生成一个表格标题
        HSSFSheet sheet = null;
        if (value == 1) {
            sheet = workbook.createSheet("类型数据");
        } else if (value == 2) {
            sheet = workbook.createSheet("总量数据");
        } else {
            sheet = workbook.createSheet("汇总数据");
        }

        // 生成一个样式
        HSSFCellStyle style = workbook.createCellStyle();
        // 设置这些样式
        style.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);
        style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        style.setBorderRight(HSSFCellStyle.BORDER_THIN);
        style.setBorderTop(HSSFCellStyle.BORDER_THIN);
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);

        // 生成并设置另一个样式  表示的是内容的大小
        HSSFCellStyle style2 = workbook.createCellStyle();
        style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        style2.setBorderRight(HSSFCellStyle.BORDER_THIN);
        style2.setBorderTop(HSSFCellStyle.BORDER_THIN);
        style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);


        // 设置标题下一列的文字的 第一个单元格的宽度
        sheet.setColumnWidth(0, 12 * 256);
//         设置标题下一列的文字的  其他单元格宽度
        for (int index = 0; index < headers.size(); index++) {
            if (index != 2) {
                sheet.setColumnWidth(index,  20 * 256);
            }
        }
        sheet.setColumnWidth(2, 20 * 260);
//        设置大的标题的数据
        HSSFCellStyle style3 = workbook.createCellStyle();
        style3.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        style3.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        HSSFRow row1 = sheet.createRow(0);
        row1.setHeight((short) 600);
// 标题字体的大小
        HSSFFont font = workbook.createFont();
        font.setFontHeightInPoints((short) 16);
        style3.setFont(font);
//        单元格合并  用于合并单元格的    开始行  结束行  开始列   结束列
        sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 3));

        //设置标题数据
        HSSFRichTextString string = null;
//    row1  表示第一行  然后创建第0列 
        HSSFCell cell1 = row1.createCell(0);
        if (value == 1) {
            string = new HSSFRichTextString("类型数据");
        } else if (value == 2) {
            string = new HSSFRichTextString("总量数据");
        } else {
            string = new HSSFRichTextString("汇总数据");
        }
//     创建的内容
        cell1.setCellValue(string);
//     创建的时候的样式
        cell1.setCellStyle(style3);


        //  创建第二行 
        HSSFRow row = sheet.createRow(1);
//        第二行里面的数据
        for (short j = 0; j < headers.size(); j++) {
            HSSFCell cell = row.createCell(j);
            cell.setCellStyle(style);
            HSSFRichTextString text = new HSSFRichTextString(headers.get(j));
            cell.setCellValue(text);
        }


        if (data.size() > 0) {
            // 取出的船舶首录数据的条数
            int cbslNumbet = data.size();
//            将样式,数据,传递进行,进行表格的生成
            loopCbdjData(data.size(), data, sheet, row, headers, style2);
        }

        HttpServletResponse response = response();
        response.setContentType("application nd.ms-excel;charset=gb2312");
        response.setCharacterEncoding("UTF-8");
//        下载的文件名称
        String queryName = "";
        if (value == 1) {
            queryName = "流量汇总分析-类型数据";
        } else if (value == 2) {
            queryName = "流量汇总分析-总量数据";
        } else {
            queryName = "流量汇总分析";
        }

        queryName = URLEncoder.encode(queryName, "UTF-8");
        queryName += ".xls";
        response.addHeader("Content-Disposition", "attachment;filename="
                + new String(queryName.getBytes("UTF-8"), "GBK"));
        OutputStream out = response.getOutputStream();
        workbook.write(out);
        out.close();
    }

    @SuppressWarnings("rawtypes")
    public void loopCbdjData(int number, List<Map<String, Object>> data, HSSFSheet sheet,
                             HSSFRow row, List<String> headers, HSSFCellStyle style2)
            throws Exception {
        for (int i = 0; i < number; i++) {
            Map mapCbdj = (Map) data.get(i);
            // 从第三行开始(第一行是空的,第二行是标题)
            row = sheet.createRow(i + 2);
            // 登记号
            Object[] obj = new Object[headers.size()];
//          查询时间
            obj[0] = mapCbdj.get("time");
            createCell(row, 0, obj[0].toString(), style2);
            // 上下行
            obj[1] = mapCbdj.get("sxh");
            createCell(row, 1, obj[1].toString(), style2);
//            流量总计
            obj[2] = mapCbdj.get("flowTotal");
            createCell(row, 2, obj[2].toString(), style2);
//            设置总准载吨位
            obj[3] = mapCbdj.get("tonsTotal");
            createCell(row, 3, obj[3].toString(), style2);
        }
    }
    //update by panqh 2017-05-10 end

    /**
     * 给单元格赋值
     *
     * @param row
     * @param index
     * @param value
     * @param normalStyle
     */
    private static void createCell(HSSFRow row, int index, String value,
                                   HSSFCellStyle normalStyle) {
        // 创建单元格
        HSSFCell cell = row.createCell(index);
        // 给第一个单元格赋值
        if (value != null) {
            cell.setCellValue(value);
        } else {
            cell.setCellValue("");
        }
        // 设置Style
        cell.setCellStyle(normalStyle);
    }
    // add by shanggq 2018/10/8 end

本案例不能实现单元格内容的自适应宽  -- 有解决方法的请留言

猜你喜欢

转载自blog.csdn.net/weixin_38297879/article/details/83011077