poi生成excel模板文件,(下拉框,日期格式,合并单元格,内容换行,设置列宽)

工作中需要用java代码生成excel文件,所以就到网上查了一下,做下总结:代码如下

private List list=new ArrayList();

        cellmap.add("第一列");
        cellmap.add("第二列");
        cellmap.add(" 第三列");
        cellmap.add("第四列");
        cellmap.add("第五列");
        cellmap.add( "第六列");
        cellmap.add("第七列");

/**
     * 导出excel模板
     * @param rootpath  导出路径
     * @return
     * @throws IOException
     * @throws ClassNotFoundException
     */
    public String ExcelOut(String rootpath) throws IOException, ClassNotFoundException {
        //数据总行数  
        int rows = 500;
        //生成下拉框内容
        String [] vehicles={"员工车辆","外协车辆","货运车辆","公司班车"};
      
        //创建工作簿
        HSSFWorkbook workbook = new HSSFWorkbook();
        org.apache.poi.hssf.usermodel.HSSFSheet sheet = workbook.createSheet("车辆信息录入");
        
        HSSFCellStyle style = workbook.createCellStyle(); // 样式对象   

        style.setWrapText(true);//自动换行
        //水平居中
        style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 垂直   
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 水平 
         //字体格式
        HSSFFont fonttitle1 = workbook.createFont(); 
        fonttitle1.setFontName("宋体");
        fonttitle1.setFontHeightInPoints((short) 10);
        style.setFont(fonttitle1);
        
        //excel模板
        int c =0;
        HSSFRow row = sheet.createRow(0);//第一行

        //设置列宽  这里我只是把需要的两列设置了宽度   sheet.getColumnWidth(6)  获取第七列的宽度

       //网上查的可以自动设置列宽 但是不是我想要的模式,我做的是模板,导出后插入的数据列宽不会自动变,只好设置固定列宽

        //设置列宽
        sheet.setColumnWidth(6,sheet.getColumnWidth(6)*17/13);
        sheet.setColumnWidth(9,sheet.getColumnWidth(9)*18/5);

/*sheet.autoSizeColumn(i); (版本不能太老)
sheet.autoSizeColumn(i, true);(合并的单元格使用)
sheet.setColumnWidth(i, “列名”.getBytes().length*2*256);(中文适用)
公式单元格自适应的是公式,将值算出后再设置:
HSSFFormulaEvaluator evaluator = new HSSFFormulaEvaluator(sheet.getWorkbook());
CellValue cell71Val = evaluator.evaluate(cell71);
cell71.setCellValue(cell71Val.getNumberValue());*/

       


        for (String s:list) {

            //把list中的值循环写入第一行
            HSSFCell cell = row.createCell(c); //第c列
            cell.setCellStyle(style);
            cell.setCellValue(s);
            c++;
        }
        //日期格式  这里我的模板内容从第二行开始,循环设置第6列的单元格为日期格式
        for(int a=1;a<=rows;a++){
            org.apache.poi.hssf.usermodel.HSSFCell cell = sheet.createRow(a).createCell(5);

             //日期格式
            HSSFDataFormat format= workbook.createDataFormat();
            style.setDataFormat(format.getFormat("yyyy-MM-dd"));
            cell.setCellStyle(style);
        }

          String specification = "hello\r\n   world";//     \r\n  换行
          // 合并单元格
         CellRangeAddress cra =new CellRangeAddress(2, 15, 12, 17); // 起始行, 终止行, 起始列, 终止列
         sheet.addMergedRegion(cra);

         cell.setCellValue(specification);

         //显示结果为hello

         //                    world


        //生成下拉列表   起始行  列均从0开始
        CellRangeAddressList vehicle = new CellRangeAddressList(1, rows, 4, 4);//起始行,终止行,起始列,终止列
        // 创建下拉列表数据
        DVConstraint constraint_v = DVConstraint.createExplicitListConstraint(vehicles);
        // 绑定
        HSSFDataValidation dataValidation_v = new HSSFDataValidation(vehicle, constraint_v);
        //对sheet页生效
        sheet.addValidationData(dataValidation_v);

        //写入文件
        FileOutputStream fileOut;
        try{
            fileOut = new FileOutputStream("E:\\aaaa.xls");//保存的文件路径
            workbook.write(fileOut);
            fileOut.close();
        }catch(Exception e){
            e.printStackTrace();
        }
        System.out.println(path);
        return path;
    }

    第五列  从第二行到500行  单元格全是下拉框
    poi生成excel模板文件,(下拉框,日期格式,合并单元格,内容换行,设置列宽)_第1张图片


第六列日期格式   输入日期                                     自动转换为设置的日期格式 读出的数据可直接插入数据库中的Date

poi生成excel模板文件,(下拉框,日期格式,合并单元格,内容换行,设置列宽)_第2张图片                              poi生成excel模板文件,(下拉框,日期格式,合并单元格,内容换行,设置列宽)_第3张图片

你可能感兴趣的:(poi生成excel模板文件,(下拉框,日期格式,合并单元格,内容换行,设置列宽))