缘起:应业务需求,提供excel导入的方式保存数据,其实excel导入导出功能很常见,之前也做过很多次,一直忘记记录,写个文章当备份使用

            操作excel的常见两种方式大家应该都知道,jxl 和 poi,我就不做比较了,这里我选用的是Apache POI,因为想支持.xlsx格式的excel版本

            做excel导入之前,想先做一个excel模板导出功能,方便业务使用

            先写了个测试类,导入poi 的jar包,这里我用的3.9版本           

/**
     * Description : 获取出借方案导入excel
     * @return HSSFWorkbook
     */
    public static HSSFWorkbook getLendPlanImportExcel() {
        String[] hssfCellValues = new String[]{"序号", "到期日期(如:20180415)", "计划名称", "收益结算类型", "当前期望收益率单利(不带%号,如:7.34)", "起投金额(单位:元)", "募集总金额(单位:元)", "初始状态", "推荐", "转投购买", "定制购买"};

        //创建Excel工作簿对象
        HSSFWorkbook hssfWorkbook = new HSSFWorkbook();
        //创建Excel的sheet
        HSSFSheet hssfSheet = hssfWorkbook.createSheet("出借计划生成方案导入");
        //设置默认宽度
        hssfSheet.setDefaultColumnWidth(10);
        //设置默认高度
        hssfSheet.setDefaultRowHeightInPoints(15);
        //设置第二列的宽度
        hssfSheet.setColumnWidth(1, 6000);
        //设置第三列的宽度
        hssfSheet.setColumnWidth(2, 6000);
        //设置第五列的宽度
        hssfSheet.setColumnWidth(4, 10000);
        //设置第六列的宽度
        hssfSheet.setColumnWidth(5, 5000);
        //设置第七列的宽度
        hssfSheet.setColumnWidth(6, 5000);


        // 收益结算类型下拉列表数据
        String[] clearingManners = new String[]{"到期支付", "按月支付"};
        // 初始状态下拉列表数据
        String[] states = new String[]{"启用", "禁用"};
        // 初始推荐状态下拉列表数据
        String[] recommendedStates = new String[]{"推荐", "未推荐"};
        // 初始状态下拉列表数据
        String[] isTransfers = new String[]{"可", "不可"};
        // 初始状态下拉列表数据
        String[] isCustomizes = new String[]{"可", "不可"};

        Map<Integer, String[]> map = new HashMap<>();
        map.put(3, clearingManners);
        map.put(7, states);
        map.put(8, recommendedStates);
        map.put(9, isTransfers);
        map.put(10, isCustomizes);

        Set<Map.Entry<Integer, String[]>> set = map.entrySet();
        Iterator<Map.Entry<Integer, String[]>> iterator = set.iterator();
        while (iterator.hasNext()) {
            Map.Entry<Integer, String[]> item = iterator.next();
            // 设置第一列的1-100行为下拉列表
            CellRangeAddressList clearingMannerAddressList = new CellRangeAddressList(1, 99, item.getKey(), item.getKey());
            // 创建下拉列表数据
            DVConstraint clearingMannerConstraint = DVConstraint.createExplicitListConstraint(item.getValue());
            // 绑定
            HSSFDataValidation clearingMannerValidation = new HSSFDataValidation(clearingMannerAddressList, clearingMannerConstraint);
            hssfSheet.addValidationData(clearingMannerValidation);
        }

        //创建一个样式
        HSSFCellStyle hssfCellStyle = hssfWorkbook.createCellStyle();
        // 设置这些样式
        hssfCellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
        hssfCellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中

        // 背景色
        hssfCellStyle.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);
        hssfCellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        hssfCellStyle.setFillBackgroundColor(HSSFColor.GREY_25_PERCENT.index);

        // 设置边框
        hssfCellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        hssfCellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        hssfCellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
        hssfCellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
        // 自动换行
//        hssfCellStyle.setWrapText(true);

        // 生成一个字体
        HSSFFont font = hssfWorkbook.createFont();
        font.setFontHeightInPoints((short) 11);
        font.setColor(HSSFColor.BLACK.index);
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        font.setFontName("微软雅黑");
        // 把字体 应用到当前样式
        hssfCellStyle.setFont(font);

        //创建Excel的行,在sheet中添加表头第1行
        HSSFRow hssfRow = hssfSheet.createRow(0);
        //创建Excel单元格
        HSSFCell hssfCell;
        for (int i = 0; i < hssfCellValues.length; i++) {
            hssfCell = hssfRow.createCell(i);
            hssfCell.setCellValue(hssfCellValues[i]);
            hssfCell.setCellStyle(hssfCellStyle);
        }

        //创建excel第2到100行
        for (int i = 1; i <= 100; i++) {
            //行
            HSSFRow row = hssfSheet.createRow(i);
            //单元格
            HSSFCell cell;
            //创建一个样式
            HSSFCellStyle style = hssfWorkbook.createCellStyle();
            // 设置这些样式
            style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
            style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
            // 设置边框
            style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
            style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
            style.setBorderRight(HSSFCellStyle.BORDER_THIN);
            style.setBorderTop(HSSFCellStyle.BORDER_THIN);

            for (int j = 0; j < hssfCellValues.length; j++) {
                cell = row.createCell(j);
                String cellValue = "";
                switch (j) {
                    case 0:
                        cellValue = String.valueOf(i);
                        break;
                    case 3:
                        cellValue = "到期支付";
                        break;
                    case 7:
                        cellValue = "启用";
                        break;
                    case 8:
                        cellValue = "未推荐";
                        break;
                    case 9:
                        cellValue = "可";
                        break;
                    case 10:
                        cellValue = "可";
                        break;
                }
                cell.setCellValue(cellValue);
                cell.setCellStyle(style);
            }
        }
        return hssfWorkbook;
    }

测试一下导出到本地

public static void main(String[] args) {
        HSSFWorkbook hssfWorkbook = ExcelUtil.getLendPlanImportExcel();
        try {
            FileOutputStream fileOut = new FileOutputStream("/Users/JustWyx/Downloads/test.xls");
            hssfWorkbook.write(fileOut);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

导出后的样式

java poi 导入 javapoi导入模版_java

接下来就可以放入项目中了,添加下载链接

<a href="../excel/getLendPlanImportExcel.do">获取导入出借方案模版</a>

controller

@RequestMapping(value = "/getLendPlanImportExcel", method = RequestMethod.GET)
    public void getLendPlanImportExcel(HttpServletRequest request, HttpServletResponse response) throws IOException {
        HSSFWorkbook hssfWorkbook = iLendPlanExcelService.getLendPlanImportExcel();
        OutputStream output = response.getOutputStream();
        response.addHeader("Content-Disposition", "inline;filename=" +
                URLEncoder.encode("出借计划数据","UTF-8") + new SimpleDateFormat("yyyyMMdd").format(new Date()) + ".xls");
        response.setContentType("application/msexcel");
        hssfWorkbook.write(output);
        output.close();
    }

点击链接下载,如图

java poi 导入 javapoi导入模版_java poi 导入_02