栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java POI Excel导出自定义模板

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java POI Excel导出自定义模板

一、需求

有excel需要导出模板如下。 excel模板导出什么样的标题也是根据前端选项进行配置的。除此之外,每一行都是不固定的标题,因此面临了很大的困难。

二、解决办法:

利用java poi,自定义编写每一个单元格(业务方面省略)

依赖包:

        
            org.apache.poi
            poi-ooxml
            3.17
        
        
            org.apache.poi
            poi-ooxml-schemas
            3.17
        
        
            org.apache.poi
            poi
            3.17
        
三、具体实现

流式数据导出:

        XSSFWorkbook wb = new XSSFWorkbook();//创建工作薄

        OutputStream os = null;
        try {
            String sheetName = "template";
            // 输出Excel文件
            os = response.getOutputStream();
//            response.setContentType("application/x-download");
//            response.setCharacterEncoding("UTF-8");
            response.setContentType("application/vnd.ms-excel");
            response.setCharacterEncoding("utf8");
            response.setHeader("Content-Disposition", "attachment;filename=" + sheetName + ".xlsx");
            wb.write(os);
            os.flush();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();

设置单元格格式:

		XSSFWorkbook wb = new XSSFWorkbook();//创建工作薄

        XSSFCellStyle style = wb.createCellStyle();
//        style.setAlignment(XSSFCellStyle.); // 创建一个居中格式
        //字体样式
        XSSFFont fontStyle = wb.createFont();
        fontStyle.setFontName("微软雅黑");
        fontStyle.setFontHeightInPoints((short) 12);
        fontStyle.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);
        style.setFont(fontStyle);

		// 设置列宽,第0列,列宽为8000
		sheet1.setColumnWidth(0, 8000); //设置每列的列宽
		// 生成单元格的颜色,水平对齐等
		XSSFCellStyle titleStyle = createCellStyle(wb, CellColorStyleEnum.SECONDARY_TITLE, HorizontalAlignment.LEFT);
		// 创建新行,行号为0
        XSSFRow rowFirst = sheet.createRow(0);
        // 创建单元格(注意需要用到的最好创建一下,因为不然读取会读取到null)
        // 创建新单元格,单元格为该行的第0个单元格
        XSSFCell cell1 = rowFirst.createCell(0);
		// 设置单元格格式
        cell1.setCellStyle(titleStyle);
        //往单元格里写数据
        cell1.setCellValue("哈哈哈哈"); 

生成单元格格式方法:

    private enum CellColorStyleEnum {
        SECONDARY_TITLE(1, "副标题颜色", "#A9D08E"),
        THIRD_TITLE(2, "三级标题颜色", "#C6E0B4"),
        FOURTH_TITLE(3, "四级标题颜色", "#E2EFDA"),
        LEFT_ZONE(4, "左侧区域颜色", "#F2F2F2");

        private CellColorStyleEnum(Integer code, String type, String colorValue) {
            this.code = code;
            this.type = type;
            this.colorValue = colorValue;
        }

        @EnumValue
        public int code;

        @JsonValue
        public String type;

        // 颜色色号
        public String colorValue;

        public Integer getCode() {
            return this.code;
        }

        @JSONField
        public String getType() {
            return this.type;
        }

  
        public Integer getValue() {
            return this.getCode();
        }
    }


    
    private XSSFCellStyle createCellStyle(XSSFWorkbook wb, CellColorStyleEnum cellColorStyleEnum, HorizontalAlignment horizontalAlignment) {
        String colorValue = cellColorStyleEnum.colorValue;
        int r = Integer.parseInt(colorValue.substring(1, 3), 16);
        int g = Integer.parseInt(colorValue.substring(3, 5), 16);
        int b = Integer.parseInt(colorValue.substring(5, 7), 16);
        XSSFCellStyle style = wb.createCellStyle();
        style.setFillForegroundColor(new XSSFColor(new java.awt.Color(r, g, b)));
        style.setFillPattern(FillPatternType.SOLID_FOREGROUND);

        style.setAlignment(horizontalAlignment);

        return style;
    }

数据读取与写入:

        XSSFWorkbook wb = new XSSFWorkbook();//创建工作薄

        //表头样式
        XSSFCellStyle style = wb.createCellStyle();
//        style.setAlignment(XSSFCellStyle.); // 创建一个居中格式
        //字体样式
        XSSFFont fontStyle = wb.createFont();
        fontStyle.setFontName("微软雅黑");
        fontStyle.setFontHeightInPoints((short) 12);
//        fontStyle.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);
        style.setFont(fontStyle);

        //新建sheet
        XSSFSheet sheet = wb.createSheet("Sheet1");
                //生成sheet1内容
        XSSFRow rowFirst = sheet.createRow(rowIndex);//第一个sheet的第一行为标题

        XSSFCell cell = rowFirst.createCell(TYPE_INDEX); //获取第一行的每个单元格
//        sheet.setColumnWidth(TYPE_INDEX, 4000); //设置每列的列宽
//        cell.setCellStyle(style); //加样式
        cell.setCellValue(title); //往单元格里写数据

单元格读取,个人人为最好直接读取为String类型,然后根据需要进行类型转换,不然直接读取Integer等容易出问题:

	String str = getSheetCellString(sheet, i, j);
    
    public String getSheetCellString(XSSFSheet sheet, int rowIndex, int colIndex) {
        if (Objects.isNull(sheet)) {
            return Constant.EMPTY_STRING;
        }

        XSSFRow row = sheet.getRow(rowIndex);
        if (Objects.isNull(row)) {
            return Constant.EMPTY_STRING;
        }
        XSSFCell cell = row.getCell(colIndex);
        String strValue = Objects.isNull(cell) ? Constant.EMPTY_STRING : cell.toString();

        return strValue;
    }

下拉框设置:

// 设置单位
                sheet.addValidationData(setDataValidation(wb, sheet, arr, rowIndex, rowIndex, UNIT_COL_INDEX, UNIT_COL_INDEX)); //超过255个报错
                
    
    private static DataValidation setDataValidation(XSSFWorkbook wb, Sheet sheet, String[] textList, int firstRow, int endRow, int firstCol, int endCol) {

        // 如果下拉框长度小于255,可以直接添加约束
        if (String.join(",", textList).length() < 255) {
            DataValidationHelper helper = sheet.getDataValidationHelper();
            //加载下拉列表内容
            DataValidationConstraint constraint = helper.createExplicitListConstraint(textList);
            //DVConstraint constraint = new DVConstraint();
            constraint.setExplicitListValues(textList);

            //设置数据有效性加载在哪个单元格上。四个参数分别是:起始行、终止行、起始列、终止列
//        CellRangeAddressList regions = new CellRangeAddressList((short) firstRow, (short) endRow, (short) firstCol, (short) endCol);
            CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol);

            //数据有效性对象
            DataValidation data_validation = helper.createValidation(constraint, regions);
            //DataValidation data_validation = new DataValidation(regions, constraint);

            return data_validation;
        } else {
            // 如果下拉框长度大于255,需要建立隐藏sheet来加载下拉框
            //获取所有sheet页个数
            int sheetTotal = wb.getNumberOfSheets();
            String hiddenSheetName = "hiddenSheet" + sheetTotal;
            XSSFSheet hiddenSheet = (XSSFSheet) wb.createSheet(hiddenSheetName);
            Row row;
            int column = 0;
            String columnStr = "A";
            //写入下拉数据到新的sheet页中
            for (int i = 0; i < textList.length; i++) {
                row = hiddenSheet.createRow(i);
                Cell cell = row.createCell(column);
                cell.setCellValue(textList[i]);
            }
            //获取新sheet页内容
//            String strFormula = hiddenSheetName + "!$" + column + "$1:$" + column + "$65535";
            String strFormula = hiddenSheetName + "!$" + columnStr + "$1:$" + columnStr + "$65535";
            XSSFDataValidationConstraint constraint = new XSSFDataValidationConstraint(DataValidationConstraint.ValidationType.LIST, strFormula);
            // 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列
            CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol);
            // 数据有效性对象
            DataValidationHelper help = new XSSFDataValidationHelper((XSSFSheet) sheet);
            DataValidation validation = help.createValidation(constraint, regions);
//            sheet.addValidationData(validation);
            //将新建的sheet页隐藏掉
            wb.setSheetHidden(sheetTotal, true);
            return validation;
        }
    }

参考文献:
java动态生成带下拉框的Excel导入模板
POI excel添加数据有效性验证以及解决DataValidation超长的问题
java poi 自定义颜色_POI将单元格背景设置为自定义颜色
POI 设置Excel单元格背景色(setFillForegroundColor 与 setFillPattern 的使用)
java中poi导出Excel表格(前台流文件接收)
java POI 单元格格式设置居中
POI中设置Excel单元格格式样式(居中,字体,边框等)
EasyPoi导出Excel带下拉框,值超过255报错问题
阿里的easyexcel导出 下拉列表超过255个字 解决办法

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/877595.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号