欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

POI的使用代码片段

程序员文章站 2022-03-06 22:21:42
...
 @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

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

相关标签: POI