ExcelUtil 生成excel工具

本文介绍了一个强大的Excel工具类,包括创建、读取、格式化Excel文件的方法。涵盖单元格样式设置、表格生成、数据读写及合并单元格等功能,适用于批量数据处理。
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment;

import java.util.List;
import java.util.Map;

public class ExcelUtil {

    /**
     * 生成Excel workbook工具类,后去workbook后,可以直接调用OutputStream out = response.getOutputStream();workbook.write(out);返回
     * @param headers
     * @param contents
     * @return
     */
    public static HSSFWorkbook buildExcel(Map<String, String> headers, List<Map<String, String>> contents) {
        HSSFWorkbook workbook = new HSSFWorkbook(); // 创建一个excel
        HSSFSheet sheet = workbook.createSheet("Sheet1");// 新建sheet页

        HSSFCellStyle cellStyle = workbook.createCellStyle(); // 新建单元格样式
        cellStyle.setFillForegroundColor((short) 13);// 设置背景色
        cellStyle.setAlignment(HorizontalAlignment.CENTER);//水平居中
        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中
        cellStyle.setWrapText(true);// 设置自动换行

        //设置标题
        HSSFRow titleRow = sheet.createRow(0);
        int[] i = {0};
        headers.forEach((key, val) -> titleRow.createCell(i[0]++).setCellValue(val));

        //设置内容
        int row = 1; int[] j = {0};
        for (Map<String, String> data : contents) {
            HSSFRow hssfRow = sheet.createRow(row++);
            j[0] = 0;
            headers.forEach((key, v) -> {
                String val = data.get(key);
                hssfRow.createCell(j[0]++).setCellValue(val);
            });
        }

        return workbook;
    }
}
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
import java.util.Map.Entry;

import lombok.val;
import org.apache.commons.collections.CollectionUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.*;

import com.entity.SheetHolder;

import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class ExcelUtil {

    /**
     * 创建样式库
     * @param wb 工作簿
     * @return 样式库Map
     */
    public static Map<String, XSSFCellStyle> createStyles(XSSFWorkbook wb) {
        Map<String, XSSFCellStyle> styles = new HashMap<>(16);
        XSSFDataFormat fmt = wb.createDataFormat();

        //创建字体对象
        Font font = wb.createFont();
        font.setFontName("微软雅黑");
        font.setFontHeightInPoints((short)10);
        font.setColor(HSSFColor.HSSFColorPredefined.BLACK.getIndex());

        //设置字体
        XSSFFont fontRed = wb.createFont();
        fontRed.setFontName("微软雅黑");
        fontRed.setFontHeightInPoints((short)10);
        fontRed.setColor(HSSFColor.HSSFColorPredefined.RED.getIndex());

        XSSFFont fontGreen = wb.createFont();
        fontGreen.setFontName("微软雅黑");
        fontGreen.setFontHeightInPoints((short)10);
        fontGreen.setColor(HSSFColor.HSSFColorPredefined.GREEN.getIndex());


        XSSFCellStyle style1 = wb.createCellStyle();
        style1.setAlignment(HorizontalAlignment.RIGHT);
        style1.setDataFormat(fmt.getFormat("0.00%"));
        style1.setFont(font);
        styles.put("percent", style1);

        XSSFCellStyle style2 = wb.createCellStyle();
        style2.setAlignment(HorizontalAlignment.CENTER);
        style2.setDataFormat(fmt.getFormat("0.0X"));
        style2.setFont(font);
        styles.put("coeff", style2);

        XSSFCellStyle style3 = wb.createCellStyle();
        style3.setAlignment(HorizontalAlignment.RIGHT);
        style3.setDataFormat(fmt.getFormat("$#,##0.00"));
        style3.setFont(font);
        styles.put("currency", style3);

        XSSFCellStyle style4 = wb.createCellStyle();
        style4.setAlignment(HorizontalAlignment.RIGHT);
        style4.setDataFormat(fmt.getFormat("mmm dd"));
        style4.setFont(font);
        styles.put("date", style4);

        XSSFCellStyle style5 = wb.createCellStyle();
        XSSFFont headerFont = wb.createFont();
        style5.setFont(headerFont);
        style5.setAlignment(HorizontalAlignment.CENTER);
        style5.setFont(font);
        styles.put("header", style5);

        XSSFCellStyle style6 = wb.createCellStyle();
        style6.setAlignment(HorizontalAlignment.CENTER);
        style6.setFont(font);
        styles.put("center", style6);

        XSSFCellStyle style7 = wb.createCellStyle();
        style7.setAlignment(HorizontalAlignment.RIGHT);
        style7.setDataFormat(fmt.getFormat("#,##0"));
        style7.setFont(font);
        styles.put("long", style7);

        XSSFCellStyle styleRed = wb.createCellStyle();
        styleRed.setFont(fontRed);
        styles.put("red", styleRed);

        XSSFCellStyle styleGreen = wb.createCellStyle();
        styleGreen.setFont(fontGreen);
        styles.put("green",styleGreen);

        XSSFCellStyle defaultStyle = wb.createCellStyle();
        defaultStyle.setAlignment(HorizontalAlignment.CENTER);
        defaultStyle.setFont(font);
        //前景填充色
        styles.put("defaultStyle", defaultStyle);


        return styles;
    }
    /**
     * 设置单元格的值 - 替换上面方法
     * @param cell   单元格
     * @param object 属性所对应的值
     * @param type   该值的类型
     */
    public static void setCellData(Cell cell, Map<String, XSSFCellStyle> styleMap, Object object, String type) {
        try {
            if(object == null){
                return;
            }
            if ("currency".equals(type)) {
                double currency = Double.parseDouble(object.toString());
                cell.setCellValue(DigestUtils.formatDouble(currency));
                XSSFCellStyle style = styleMap.get("currency");
                cell.setCellStyle(style);
            } else if ("percent".equals(type)) {
                double dVal = Double.parseDouble(object.toString());
                cell.setCellValue(DigestUtils.formatDouble(dVal, 4));
                cell.setCellType(CellType.NUMERIC);
                XSSFCellStyle style = styleMap.get("percent");
                cell.setCellStyle(style);
            } else if ("long".equals(type)) {
                long v = Long.parseLong(object.toString());
                cell.setCellValue(v);
                cell.setCellType(CellType.NUMERIC);
                XSSFCellStyle style = styleMap.get("long");
                cell.setCellStyle(style);
            } else if ("number".equals(type)) {
                cell.setCellValue(new Double(object.toString()));
                cell.setCellType(CellType.NUMERIC);
            }  else if("red".equals(type)){
                cell.setCellValue(String.valueOf(object));
                cell.setCellType(CellType.STRING);
                XSSFCellStyle style = styleMap.get("red");
                cell.setCellStyle(style);
            } else if("green".equals(type)){
                cell.setCellValue(String.valueOf(object));
                cell.setCellType(CellType.STRING);
                XSSFCellStyle style = styleMap.get("green");
                cell.setCellStyle(style);
            }  else {
                cell.setCellValue(String.valueOf(object));
                cell.setCellType(CellType.STRING);
                XSSFCellStyle style = styleMap.get("defaultStyle");
                cell.setCellStyle(style);
            }
        }catch (Exception ex){
            log.info("赋值单元格出错",ex);
        }
    }

    /**
     * 根据表头Map来创建表格头部信息
     *
     * @param sheet       表格
     * @param styleHeader 表格头部样式
     * @param headMap     表格头部内容
     */
    public static void createSheetHead(XSSFSheet sheet, XSSFCellStyle styleHeader, HashMap<String, String> headMap) {
        XSSFRow row = sheet.createRow(0);
        XSSFCell cell;
        //在EXCEL的第一行建立各列的标题
        int cellIndex = 0;
        for (Map.Entry<String, String> entry : headMap.entrySet()) {
            cell = row.createCell(cellIndex);
            cell.setCellValue(entry.getValue());
            cell.setCellStyle(styleHeader);
            cellIndex++;
        }
    }



    /**
     * 生成Excel workbook工具类,后去workbook后,可以直接调用OutputStream out =
     * response.getOutputStream();workbook.write(out);返回
     * 
     * @param headers
     * @param contents
     * @return
     */
    public static HSSFWorkbook buildExcel(Map<String, String> headers, List<Map<String, String>> contents) {
        HSSFWorkbook workbook = new HSSFWorkbook(); // 创建一个excel
        HSSFSheet sheet = workbook.createSheet("Sheet1");// 新建sheet页

        HSSFCellStyle cellStyle = workbook.createCellStyle(); // 新建单元格样式
        cellStyle.setFillForegroundColor((short) 13);// 设置背景色
        cellStyle.setAlignment(HorizontalAlignment.CENTER);// 水平居中
        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 垂直居中
        cellStyle.setWrapText(true);// 设置自动换行

        // 设置标题
        HSSFRow titleRow = sheet.createRow(0);
        int[] i = { 0 };
        headers.forEach((key, val) -> titleRow.createCell(i[0]++).setCellValue(val));

        // 设置内容
        int row = 1;
        int[] j = { 0 };
        for (Map<String, String> data : contents) {
            HSSFRow hssfRow = sheet.createRow(row++);
            j[0] = 0;
            headers.forEach((key, v) -> {
                String val = data.get(key);
                hssfRow.createCell(j[0]++).setCellValue(val);
            });
        }

        return workbook;
    }

    /**
     * 同表头,多个表格
     * @param headers
     * @param contents
     * @return
     */
    public static HSSFWorkbook buildExcel(Map<String, String> headers, Map<Object,List<Map<String, String>>> contents) {
        HSSFWorkbook workbook = new HSSFWorkbook(); // 创建一个excel
        HSSFSheet sheet = workbook.createSheet("Sheet1");// 新建sheet页

        HSSFCellStyle cellStyle = workbook.createCellStyle(); // 新建单元格样式
        cellStyle.setFillForegroundColor((short) 13);// 设置背景色
        cellStyle.setAlignment(HorizontalAlignment.CENTER);// 水平居中
        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 垂直居中
        cellStyle.setWrapText(true);// 设置自动换行

        int row = 0;
        for(Object key:contents.keySet()){
            // 设置标题
            HSSFRow titleRow = sheet.createRow(row);
            int[] i = { 0 };
            headers.forEach((k, val) -> titleRow.createCell(i[0]++).setCellValue(val));

            row = row+1;
            List<Map<String, String>> oneContent = contents.get(key);
            // 设置内容
            int[] j = { 0 };
            for (Map<String, String> data : oneContent) {
                HSSFRow hssfRow = sheet.createRow(row++);
                j[0] = 0;
                headers.forEach((k, v) -> {
                    String val = data.get(k);
                    hssfRow.createCell(j[0]++).setCellValue(val);
                });
            }
            //设置完一块个表格后,分隔行
            int r = row++;
            sheet.addMergedRegion(new CellRangeAddress(r, r, 0, oneContent.get(0).size()));
        }

        return workbook;
    }
    /**
     * 读取excel
     * 
     * @param filePath
     * @return
     */
    public static Workbook readExcel(String filePath) {
        Workbook wb = null;
        if (filePath == null) {
            return null;
        }
        String subfix = filePath.substring(filePath.lastIndexOf("."));
        InputStream is = null;
        try {
            is = new FileInputStream(filePath);
            if (".xls".equals(subfix)) {
                return wb = new HSSFWorkbook(is);
            } else if (".xlsx".equals(subfix)) {
                return wb = new XSSFWorkbook(is);
            } else {
                return wb = null;
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return wb;
    }

    /**
     * 读取表格字段
     * 
     * @param wb
     * @return
     */
    public static List<String> readColumnKeys(Workbook wb) {
        List<String> list = new ArrayList<String>();
        if (wb == null) {
            return list;
        }
        // 获取第一个sheet
        Sheet sheet = wb.getSheetAt(0);
        if (sheet == null) {
            return list;
        }
        // 获取最大行数
        int rowSize = sheet.getPhysicalNumberOfRows();
        if (rowSize < 1) {
            return list;
        }
        // 获取第一行
        Row row = sheet.getRow(0);
        // 获取最大列数
        int columnSize = row.getPhysicalNumberOfCells();
        for (int i = 0; i < columnSize; i++) {
            list.add(row.getCell(i).toString());
        }
        return list;
    }

    /**
     * 读取总行数
     * 
     * @param wb
     * @return
     */
    public static int readRowSize(Workbook wb) {
        if (wb == null) {
            return 0;
        }
        // 获取第一个sheet
        Sheet sheet = wb.getSheetAt(0);
        if (sheet == null) {
            return 0;
        }
        // 获取最大行数
        return sheet.getPhysicalNumberOfRows();
    }

    /**
     * 读取单元格值
     * 
     * @param cell
     * @return
     */
    public static String readCellValue(Cell cell) {
        if (cell == null) {
            return "";
        }
        cell.setCellType(CellType.STRING);
        return cell.toString();
    }

    /**
     * 生成Excel workbook工具类,后去workbook后,可以直接调用OutputStream out =
     * response.getOutputStream();workbook.write(out);返回
     * 
     * @param headers
     * @param contents
     * @return
     */
    public static HSSFWorkbook buildExcelWithMerge(Map<String, String> headers, List<Map<String, String>> contents,
            Set<String> mergeColumns) {
        HSSFWorkbook workbook = new HSSFWorkbook(); // 创建一个excel
        HSSFSheet sheet = workbook.createSheet("Sheet1");// 新建sheet页

        HSSFCellStyle cellStyle = workbook.createCellStyle(); // 新建单元格样式
        cellStyle.setFillForegroundColor((short) 13);// 设置背景色
        cellStyle.setAlignment(HorizontalAlignment.CENTER);// 水平居中
        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 垂直居中
        cellStyle.setWrapText(true);// 设置自动换行

        // 设置标题
        HSSFRow titleRow = sheet.createRow(0);
        int[] i = { 0 };
        headers.forEach((key, val) -> titleRow.createCell(i[0]++).setCellValue(val));

        boolean enableMerge = CollectionUtils.isEmpty(mergeColumns) == false;
        // 设置内容
        int row = 1;
        int[] j = { 0 };

        Map<String, MergeHolder> mergeRowMap = new HashMap<String, MergeHolder>();
        for (Map<String, String> data : contents) {
            if (enableMerge) {
                String key = getRepeatColumnMapKey(data, mergeColumns);
                MergeHolder holder = mergeRowMap.get(key);
                if (holder == null) {
                    holder = new MergeHolder();
                    holder.setBeginRow(row);
                } else {
                    holder.setEndRow(row);
                }
                mergeRowMap.put(key, holder);
            }
            HSSFRow hssfRow = sheet.createRow(row++);
            j[0] = 0;
            headers.forEach((key, v) -> {
                String val = data.get(key);
                hssfRow.createCell(j[0]++).setCellValue(val);
            });
        }

        // 合并日期占两行(4个参数,分别为起始行,结束行,起始列,结束列)
        // 行和列都是从0开始计数,且起始结束都会合并
        if (enableMerge) {
            List<Integer> columnNums = new ArrayList<Integer>();
            int columnAt = 0;
            for (Entry<String, String> header : headers.entrySet()) {
                if (mergeColumns.contains(header.getKey())) {
                    columnNums.add(columnAt);
                }
                columnAt++;
            }
            for (Entry<String, MergeHolder> item : mergeRowMap.entrySet()) {
                MergeHolder holder = item.getValue();
                if (holder == null || holder.getBeginRow() < 0 || holder.getEndRow() < 0) {
                    continue;
                }
                for (Integer colAt : columnNums) {
                    log.info("merge, beginRow:{}, endRow:{}, beginCol:{}, endCol:{}", holder.getBeginRow(),
                            holder.getEndRow(), colAt, colAt);
                    sheet.addMergedRegion(new CellRangeAddress(holder.getBeginRow(), holder.getEndRow(), colAt, colAt));
                }
            }
        }

        return workbook;
    }

    /**
     * 复杂表格,例如叠拼的表格
     * 采用 传入加工过的workbook 继续附加其他表格
     * @param headers
     * @param contents
     * @return
     */
    public static HSSFWorkbook buildDiepinExcel(HSSFWorkbook workbook, int starRowIndex, List<LinkedHashMap<String, Object>> headers, List<LinkedHashMap<String, String>> contents) {
        HSSFSheet sheet = workbook.getSheet("Sheet1");
        if(sheet==null){
            sheet = workbook.createSheet("Sheet1");// 新建sheet页
        }

        HSSFCellStyle cellStyle = workbook.createCellStyle(); // 新建单元格样式
        cellStyle.setFillForegroundColor((short) 13);// 设置背景色
        cellStyle.setAlignment(HorizontalAlignment.CENTER);// 水平居中
        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 垂直居中
        cellStyle.setWrapText(true);// 设置自动换行

        // 设置标题
        if(headers!=null){
            for(Map<String, Object> m:headers){//每一行head
                int[] i = { 0 };
                HSSFRow titleRow = sheet.createRow(starRowIndex);
                Object col = m.get("col");
                if(col ==null){
                    m.forEach((key, val) -> titleRow.createCell(i[0]++).setCellValue(val.toString()));
                }else{
                    for(String k:m.keySet()){
                        if(!k.equals("col")){
                            titleRow.createCell(i[0]++).setCellValue(m.get(k).toString());
                            sheet.addMergedRegion(new CellRangeAddress(starRowIndex,starRowIndex, i[0]-1, i[0]+(Integer)col));
                        }
                    }

                }
                starRowIndex++;
            }
        }

        // 设置内容
        int row = starRowIndex;
        int[] j = { 0 };

        for (Map<String, String> data : contents) {
            HSSFRow hssfRow = sheet.createRow(row++);
            j[0] = 0;
            data.forEach((key, v) -> {
                hssfRow.createCell(j[0]++).setCellValue(v);
            });
        }

        return workbook;
    }


    private static String getRepeatColumnMapKey(Map<String, String> data, Set<String> mergeColumns) {
        StringBuilder sb = new StringBuilder();
        for (String col : mergeColumns) {
            sb.append(data.get(col));
        }
        return sb.toString();
    }

    @Getter
    @Setter
    public static class MergeHolder {
        private int beginRow;

        private int endRow;

        public MergeHolder(int beginRow, int endRow) {
            this.beginRow = beginRow;
            this.endRow = endRow;
        }

        public MergeHolder() {
            this(-1, -1);
        }
    }

    /**
     * 1次导出多个sheet页
     * 
     * @param list
     * @return
     */
    public static HSSFWorkbook buildExcel(List<SheetHolder> list) {
        HSSFWorkbook workbook = new HSSFWorkbook(); // 创建一个excel
        
        // 多个sheet页
        for (SheetHolder holder : list) {
            HSSFSheet sheet = workbook.createSheet(holder.getSheetName());// 新建sheet页
            
            HSSFCellStyle cellStyle = workbook.createCellStyle(); // 新建单元格样式
            cellStyle.setFillForegroundColor((short) 13);// 设置背景色
            cellStyle.setAlignment(HorizontalAlignment.CENTER);// 水平居中
            cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 垂直居中
            cellStyle.setWrapText(true);// 设置自动换行
            
            // 设置标题
            HSSFRow titleRow = sheet.createRow(0);
            int[] i = { 0 };
            Map<String, String> headers = holder.getHeaders();
            headers.forEach((key, val) -> titleRow.createCell(i[0]++).setCellValue(val));
            
            // 百分比格式
            HSSFCellStyle percentStyle = workbook.createCellStyle();
            percentStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.00%"));
            
            // 设置内容
            int row = 1;
            int[] j = { 0 };
            List<Map<String, String>> contents = holder.getContents();
            boolean hasPercentColumn = holder.getPercentColumnBegin() != null;
            int percentBegin = hasPercentColumn ? holder.getPercentColumnBegin() : Integer.MAX_VALUE;
            
            boolean hasNumberColumn = holder.getNumberColumnBegin() != null;
            int numberBegin = hasNumberColumn ? holder.getNumberColumnBegin() : Integer.MAX_VALUE;
            for (Map<String, String> data : contents) {
                HSSFRow hssfRow = sheet.createRow(row++);
                j[0] = 0;
                headers.forEach((key, v) -> {
                    String val = data.get(key);
                    HSSFCell cell = null;
                    if (hasPercentColumn && j[0] >= percentBegin) {
//                         log.info("percent key:{}, val:{}", key, val);
                        cell = hssfRow.createCell(j[0]);
                        cell.setCellStyle(percentStyle);
                        if (val.endsWith("%")) {
                            cell.setCellValue(Double.valueOf(val.substring(0, val.length() - 1)) / 100);
                        } else {
                            cell.setCellValue(Double.valueOf(val));
                        }
                    } else if (hasNumberColumn && j[0] >= numberBegin) {
//                         log.info("number key:{}, val:{}", key, val);
                        if (val.contains(",")) {
                            val = val.replaceAll(",", "");
                        }
                        cell = hssfRow.createCell(j[0], CellType.NUMERIC);
                        cell.setCellValue(Integer.valueOf(val));
                    } else {
                        cell = hssfRow.createCell(j[0]);
                        cell.setCellValue(val);
                    }
                    j[0]++;
                    
//                    hssfRow.createCell(j[0]++).setCellValue(val);
                });
            }
        }
        
        return workbook;
    }
    
    /**
     * 1次导出多个sheet页,单元格可以使用格式
     * 
     * @param list
     * @return
     */
    public static HSSFWorkbook buildExcelUseStype(List<SheetHolder> list) {
        HSSFWorkbook workbook = new HSSFWorkbook(); // 创建一个excel
        
        // 多个sheet页
        for (SheetHolder holder : list) {
            HSSFSheet sheet = workbook.createSheet(holder.getSheetName());// 新建sheet页
            
            HSSFCellStyle cellStyle = workbook.createCellStyle(); // 新建单元格样式
            cellStyle.setFillForegroundColor((short) 13);// 设置背景色
            cellStyle.setAlignment(HorizontalAlignment.CENTER);// 水平居中
            cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 垂直居中
            cellStyle.setWrapText(true);// 设置自动换行
            
            // 设置标题
            HSSFRow titleRow = sheet.createRow(0);
            int[] i = { 0 };
            Map<String, String> headers = holder.getHeaders();
            headers.forEach((key, val) -> titleRow.createCell(i[0]++).setCellValue(val));
            
            // 百分比格式
            HSSFCellStyle percentStyle = workbook.createCellStyle();
            percentStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.00%"));
            
            // 设置内容
            int row = 1;
            int[] j = { 0 };
            List<Map<String, String>> contents = holder.getContents();
            boolean hasPercentColumn = holder.getPercentColumns() != null;
            
            boolean hasNumberColumn = holder.getNumberColumns() != null;
            for (Map<String, String> data : contents) {
                HSSFRow hssfRow = sheet.createRow(row++);
                j[0] = 0;
                headers.forEach((key, v) -> {
                    String val = data.get(key);
                    HSSFCell cell = null;
                    if (hasPercentColumn && holder.getPercentColumns().contains(j[0])) {
//                         log.info("percent key:{}, val:{}", key, val);
                        cell = hssfRow.createCell(j[0]);
                        cell.setCellStyle(percentStyle);
                        if (val.endsWith("%")) {
                            cell.setCellValue(Double.valueOf(val.substring(0, val.length() - 1)) / 100);
                        } else {
                            cell.setCellValue(Double.valueOf(val));
                        }
                    } else if (hasNumberColumn && holder.getNumberColumns().contains(j[0])) {
                         log.info("number key:{}, val:{}", key, val);
                        if (val.contains(",")) {
                            val = val.replaceAll(",", "");
                        }
                        cell = hssfRow.createCell(j[0], CellType.NUMERIC);
                        cell.setCellValue(Integer.valueOf(val));
                    } else {
                        cell = hssfRow.createCell(j[0]);
                        cell.setCellValue(val);
                    }
                    j[0]++;
                    
//                    hssfRow.createCell(j[0]++).setCellValue(val);
                });
            }
        }
        
        return workbook;
    }
}
@Getter
@Setter
public class SheetHolder {

    private String sheetName;

    private Map<String, String> headers;
    private List<Map<String, String>> contents;
    
    /**
     * 指定具体几列开始是百分比,列号从0开始,null则没有
     */
    private Set<Integer> percentColumns;
    
    /**
     * 指定具体几列开始是数字,列号从0开始,null则没有
     */
    private Set<Integer> numberColumns;
    
    /**
     * 从第几列开始是百分比,从0开始,null则没有
     */
    private Integer percentColumnBegin;
    
    /**
     * 从第几列开始是数字,从0开始,null则没有
     */
    private Integer numberColumnBegin;
}

 

关注公众号获取更多内容,有问题也可在公众号提问哦:

 

强哥叨逼叨

叨逼叨编程、互联网的见解和新鲜事

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值