1. 程式人生 > >POI的使用程式碼片段

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

本案例不能實現單元格內容的自適應寬  -- 有解決方法的請留言