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

1. Java POI 读取、写入Excel(包括样式)的工具类Utils

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

1. Java POI 读取、写入Excel(包括样式)的工具类Utils

在工作中经常会遇到操作excel的需求,对于格式简单、统一的excel可以选择EasyExcel来实现功能,很简单方便;而对于复杂的excel文件,如有各式各样的合并单元格、表头不固定、行列跟随业务数据动态变化……格式变幻多端的文件,easyExcel就显得无能为力了,选择poi就可以解决此问题了。

这里贴上在工作中解决问题时,自己封装的工具类,方便大家查阅:

目录

一、读取Excel、写入Excel文件工具类

二、导出Excel文件的样式设置工具类

三、写入Excel简单示例 


一、读取、写入Excel工具类

注:poi版本为org.apache.poi:4.1.0

@Slf4j
public class ExcelUtilByPOI {
    private static final String EXCEL_XLS = "xls";
    private static final String EXCEL_XLSX = "xlsx";

    
public static List>> readExcelWithFiexPos(String filePath, int titleInRow, int titleInColumn, int sheetCnt) throws IOException {
        Workbook wb = null;
        try {
            List>> excelData = new ArrayList<>();
            if (filePath.endsWith(EXCEL_XLS) || filePath.endsWith(EXCEL_XLSX)) {
                File file = new File(filePath);
                wb = getWorkbook(file);
                int sheetSize = sheetCnt == -1 ? wb.getNumberOfSheets() : sheetCnt;
                //遍历sheet
                for (int i = 0; i < sheetSize; i++) {
                    Sheet sheet = wb.getSheetAt(i);
                    List> theSheetData = readSheet(sheet, titleInRow, titleInColumn);
                    excelData.add(theSheetData);
                }
            } else {
                log.error("读取的不是Excel文件");
            }
            return excelData;
        } catch (FileNotFoundException e) {
            throw e;
        } finally {
            if (wb != null) {
                wb.close();
            }
        }
    }

    
    public static List>> readExcelWithFiexedTitle(String filePath, String fixedValue, int sheetCnt) throws IOException {
        Workbook wb = null;
        try {
            List>> excelData = new ArrayList<>();
            if (filePath.endsWith(EXCEL_XLS) || filePath.endsWith(EXCEL_XLSX)) {
                File file = new File(filePath);
                wb = getWorkbook(file);
                int sheetSize = sheetCnt == -1 ? wb.getNumberOfSheets() : sheetCnt;
                //遍历sheet
                for (int i = 0; i < sheetSize; i++) {
                    Sheet sheet = wb.getSheetAt(i);
                    List posForSheet = readPosForValue(sheet, fixedValue);
                    List> theSheetData = readSheet(sheet, posForSheet.get(0), posForSheet.get(1));
                    excelData.add(theSheetData);
                }
            } else {
                log.error("读取的不是Excel文件");
            }
            return excelData;
        } catch (FileNotFoundException e) {
            throw e;
        } finally {
            if (wb != null) {
                wb.close();
            }
        }
    }

    
    public static List> readRowData(String filePath, int rowNum, int firstColNum, int lastColNum) throws IOException {
        List> dataList = new ArrayList<>();

        File file = new File(filePath);
        Workbook wb = getWorkbook(file);
        int sheetCnt = wb.getNumberOfSheets();

        for (int cnt = 0; cnt < sheetCnt; cnt++) { //遍历每一个sheet
            Sheet sheet = wb.getSheetAt(cnt);
            Row row = sheet.getRow(rowNum);
            lastColNum = lastColNum == -1 ? row.getLastCellNum() : lastColNum; //如果没有lastColNum则为其值为最后一列

            List sheetContentList = new ArrayList<>();
            Cell cell = null;
            String value = null;
            for (int i = firstColNum; i < lastColNum; i++) { //读取指定行的内容
                cell = row.getCell(i);
                value = readCellByType(cell);
                sheetContentList.add(value);
            }
            dataList.add(sheetContentList);

        }

        return dataList;
    }

    
    private static List> readSheet(Sheet sheet, int titleInRow, int titleInColumn) {
        List> sheetList = null;
        sheetList = new ArrayList>();
        List titles = new ArrayList<>();
        int rowSize = sheet.getLastRowNum() + 1;
        for (int i = titleInRow; i < rowSize; i++) {
            Row row = sheet.getRow(i);
            if (row == null)
                continue;
            ;//略过空行
            int cellSize = row.getLastCellNum();
            if (i == titleInRow) //标题行
            {
                for (int j = titleInColumn; j < cellSize; j++) {
                    Cell cell = row.getCell(j);
                    if (cell != null) {
                        titles.add(cell.toString());
                    }
                }
            } else { //对应每一行的数据
                Map rowDataMap = new linkedHashMap<>();
                for (int j = titleInColumn; j < titleInColumn + titles.size(); j++) {
                    Cell cell = row.getCell(j);
                    String value = null;
                    CellType cellType = null;
                    if (cell == null) {
                        continue;
                    }
                    cellType = cell.getCellTypeEnum();
                    switch (cellType) {
                        case STRING:
//                                 value = cell.getRichStringCellValue().getString();
                            value = cell.getStringCellValue();
                            break;
                        case NUMERIC: //包含日期和普通数字
                            if (DateUtil.isCellDateFormatted(cell)) {
                                Date date = cell.getDateCellValue();
                                DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
                                value = df.format(date);
                            } else {
                                double cellValue = cell.getNumericCellValue();
                                value = String.valueOf(cellValue);
                                // 下面的代码,会自动舍弃读取单元格中显示的值(可能是做了round()之后的结果),不是单元格中最原本的值
                                

                            }
                            break;
                        case FORMULA:
//                                 cell.getCellFormula();
                            cell.setCellType(CellType.STRING);
                            value = cell.getStringCellValue();
                            break;
                        case BOOLEAN:
                            value = String.valueOf(cell.getBooleanCellValue());
                            break;
                        default:
                            if (cell != null) {
                                value = cell.toString();
                            }
                    }
                    String key = titles.get(j - titleInColumn);
                    rowDataMap.put(key, value);
                }
                sheetList.add(rowDataMap);
            }
        }
        return sheetList;
    }

    
    private static List readPosForValue(Sheet sheet, String fixedValue) {
        List posList = new ArrayList();
        Object value = null;
        for (int j = 0; j < sheet.getPhysicalNumberOfRows(); j++) { // 获取每行
            XSSFRow row = (XSSFRow) sheet.getRow(j);
            if (row != null) {
                for (int k = 0; k < sheet.getRow(0).getPhysicalNumberOfCells(); k++) { // 获取每个单元格
                    Cell cell = row.getCell(k);
                    if (cell == null) {
                        continue;
                    }
                    CellType cellTypeEnum = cell.getCellTypeEnum();
                    switch (cellTypeEnum) {
                        case STRING:
                            value = cell.getRichStringCellValue().getString();
                            break;
//                        case Cell.CELL_TYPE_NUMERIC:
                        case NUMERIC:
                            if (DateUtil.isCellDateFormatted(cell)) {
                                value = cell.getDateCellValue();
                            } else {
                                double cellValue = cell.getNumericCellValue();
                                value = String.valueOf(cellValue);
                               
                            }
                            break;
                        case BOOLEAN:
                            value = cell.getBooleanCellValue();
                            break;
                        case FORMULA:
                            value = cell.getCellFormula();
                            break;
                        default:
                            value = "";
                            break;
                    }
                    if (fixedValue.equals(value.toString())) {
                        posList.add(cell.getRowIndex());
                        posList.add(cell.getColumnIndex());
                        break;
                    }
                }
            }
            if (!BeanUtil.isEmpty(posList)) {
                break;
            }
        }
        return posList;
    }

    
    public static Workbook getWorkbook(File file) throws IOException {
        Workbook wb = null;
        InputStream fis = new FileInputStream(file);
        if (file.getName().endsWith(EXCEL_XLS)) //2003
        {
            wb = new HSSFWorkbook(fis);
        } else if (file.getName().endsWith(EXCEL_XLSX)) {
            wb = new XSSFWorkbook(fis);//2007 2010
        }
        if (fis != null) {
            fis.close();
        }
        return wb;
    }

    
    public static boolean isMergedRegion(Sheet sheet, int row, int column) {
        int sheetMergeCount = sheet.getNumMergedRegions();
        for (int i = 0; i < sheetMergeCount; i++) {
            CellRangeAddress range = sheet.getMergedRegion(i);
            int firstColumn = range.getFirstColumn();
            int lastColumn = range.getLastColumn();
            int firstRow = range.getFirstRow();
            int lastRow = range.getLastRow();
            if (row >= firstRow && row <= lastRow) {
                if (column >= firstColumn && column <= lastColumn) {
                    return true;
                }
            }
        }
        return false;
    }
 
    public static String getMergedCellValue(Sheet sheet, int row, int column) {
        String value = null;
        int mergedCellCnt = sheet.getNumMergedRegions();
        for (int i = 0; i < mergedCellCnt; i++) {
            CellRangeAddress mergedCell = sheet.getMergedRegion(i);
            int firstColumn_pos = mergedCell.getFirstColumn();
            int lastColumn_pos = mergedCell.getLastColumn();
            int firstRow_pos = mergedCell.getFirstRow();
            int lastRow_pos = mergedCell.getLastRow();
            if (row >= firstRow_pos && row <= lastRow_pos) {
                if (column >= firstColumn_pos && column <= lastColumn_pos) {
                    Row firstRow = sheet.getRow(firstRow_pos);
                    Cell cell = firstRow.getCell(firstColumn_pos);
                    if (cell == null) {
                        continue;
                    }
                    CellType cellType = cell.getCellTypeEnum();
                    switch (cellType) {
                        case STRING:
//                                 value = cell.getRichStringCellValue().getString();
                            value = cell.getStringCellValue();
                            break;
                        case NUMERIC: //包含日期和普通数字
                            if (DateUtil.isCellDateFormatted(cell)) {
                                Date date = cell.getDateCellValue();
                                DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
                                value = df.format(date);
                            } else {
                                double cellValue = cell.getNumericCellValue();
                                value = String.valueOf(cellValue);

                         
                            }
                            break;
                        case FORMULA:
//                                 cell.getCellFormula();
                            cell.setCellType(CellType.STRING);
                            value = cell.getStringCellValue();
                            break;
                        case BOOLEAN:
                            value = String.valueOf(cell.getBooleanCellValue());
                            break;
                        default:
                            if (cell != null) {
                                value = cell.toString();
                            }
                    }
                    return cell == null || value == null ? "" : value;
                }
            }

        }

        return null;
    }

    
    public static String readCellByType(Cell cell) {
        if (cell == null) {
            return null;
        }
        CellType cellType = cell.getCellTypeEnum();
        String value = null;
        switch (cellType) {
            case STRING:
//                                 value = cell.getRichStringCellValue().getString();
                value = cell.getStringCellValue();
                break;
            case NUMERIC: //包含日期和普通数字
                if (DateUtil.isCellDateFormatted(cell)) {
                    Date date = cell.getDateCellValue();
                    DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
                    value = df.format(date);
                } else {
                    double cellValue = cell.getNumericCellValue();
                    value = String.valueOf(cellValue);

                 
                }
                break;
            case FORMULA:
//                                 cell.getCellFormula();
                cell.setCellType(CellType.STRING);
                value = cell.getStringCellValue();
                break;
            case BOOLEAN:
                value = String.valueOf(cell.getBooleanCellValue());
                break;
            default:
                if (cell != null) {
                    value = cell.toString();
                }
        }
        return cell == null || value == null ? "" : value;
    }

    
    public static List readSheetNames(String filePath) throws Exception {
        Workbook wb = null;
        List sheetNames = new ArrayList();
        try {
            if (filePath.endsWith(EXCEL_XLS) || filePath.endsWith(EXCEL_XLSX)) {
                // 读取Excel文档
                File file = new File(filePath);
                wb = getWorkbook(file);
                int sheetSize = wb.getNumberOfSheets();
                // 遍历sheet页
                for (int i = 0; i < sheetSize; i++) {
                    Sheet sheet = wb.getSheetAt(i);
                    sheetNames.add(sheet.getSheetName());
                }
            } else {
                throw new baseException(EPowerResultCode.JUDGE_EXCEL_FILE);
            }
            return sheetNames;

        } catch (FileNotFoundException e) {
            log.error(e.getMessage());
            throw e;
        } finally {
            if (wb != null) {
                wb.close();
            }
        }
    }

    
    public static List readSheetTitles(String filePath) throws Exception {
        Workbook wb = null;
        List titleList = new ArrayList();
        try {
            if (filePath.endsWith(EXCEL_XLS) || filePath.endsWith(EXCEL_XLSX)) {
                // 读取Excel文档
                File file = new File(filePath);
                wb = getWorkbook(file);
                int sheetSize = wb.getNumberOfSheets();
                for (int i = 0; i < sheetSize; i++) {
                    Sheet sheet = wb.getSheetAt(i);
                    Row row = sheet.getRow(0);//默认第一行为表头
                    short lastCellNum = row.getLastCellNum();//共有多少列
                    for (int j = 0; j < lastCellNum; j++) {
                        Cell cell = row.getCell(j);
                        titleList.add(cell.getStringCellValue().trim());
                    }
                }
            }
            return titleList;

        } catch (Exception e) {
            log.error(e.getMessage());
            throw e;
        } finally {
            if (wb != null) {
                wb.close();
            }
        }
    }

    
    public static void exportFile(HttpServletRequest request, HttpServletResponse response, Workbook wb, String fileName)  throws Exception{
        String userAgent = request.getHeader("USER-AGENT");
        if (userAgent.contains("MSIE")) {// IE浏览器
            fileName = URLEncoder.encode(fileName, "UTF8");
        } else if (userAgent.contains("Mozilla")) {// google,火狐浏览器
            fileName = new String(fileName.getBytes(), "ISO8859-1");
        } else {
            fileName = URLEncoder.encode(fileName, "UTF8");// 其他浏览器
        }
        response.setContentType("application/octet-stream;charset=UTF-8");
        response.addHeader("Content-Disposition", "attachment;filename=" + fileName);
        OutputStream outputStream = response.getOutputStream();
        wb.write(outputStream);
    }

    } 

二、Excel样式设置工具类
public class ExcelStyleUtil {
    
    public static Font headerFoot(Workbook wb) {
        Font headerFont = wb.createFont();
        headerFont.setFontName("微软雅黑");
        headerFont.setFontHeightInPoints((short) 13);
        headerFont.setBold(true);
//        headerFont.setColor(HSSFColor.HSSFColorPredefined.BLACK.getIndex());
        headerFont.setColor(IndexedColors.BLACK.getIndex());
        return headerFont;
    }

    
    public static Font contextFont(Workbook wb) {
        Font contextFont = wb.createFont();
        contextFont.setFontName("微软雅黑");
        contextFont.setFontHeightInPoints((short) 13);
        contextFont.setBold(false);
        contextFont.setColor(IndexedColors.BLACK.getIndex());
//        contextFont.setColor(HSSFColor.HSSFColorPredefined.BLACK.getIndex());
        return contextFont;
    }


    
    public static CellStyle headerStyle(Workbook wb) {
        CellStyle headerStyle = wb.createCellStyle();
        Font font = headerFoot(wb);
        headerStyle.setFont(font);
        headerStyle.setAlignment(HorizontalAlignment.CENTER);//水平居中
        headerStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中
        headerStyle.setLocked(true);//锁定
        headerStyle.setWrapText(false);// 自动换行
        headerStyle.setBorderBottom(BorderStyle.THIN);//下边框
        headerStyle.setBorderTop(BorderStyle.THIN);//上边框
        headerStyle.setBorderLeft(BorderStyle.THIN);//左
        headerStyle.setBorderRight(BorderStyle.THIN);//右
        return headerStyle;
    }


    
    public static CellStyle contextAlignCenterStyle(Workbook wb) {

        CellStyle style = wb.createCellStyle();
        Font font = contextFont(wb);
        style.setFont(font);
        style.setAlignment(HorizontalAlignment.CENTER);//水平居中
        style.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中
        style.setLocked(true);
        style.setWrapText(true);// 自动换行
        style.setBorderBottom(BorderStyle.THIN);//下边框
        style.setBorderTop(BorderStyle.THIN);//上边框
        style.setBorderLeft(BorderStyle.THIN);//左
        style.setBorderRight(BorderStyle.THIN);//右
        return style;
    }

    
    public static CellStyle contextNoLeftBorder(Workbook wb){
        CellStyle style = wb.createCellStyle();
        Font font = contextFont(wb);
        style.setFont(font);
        style.setAlignment(HorizontalAlignment.CENTER);//水平居中
        style.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中
        style.setLocked(true);
        style.setWrapText(true);// 自动换行
        style.setBorderBottom(BorderStyle.THIN);//下边框
        style.setBorderTop(BorderStyle.THIN);//上边框
        style.setBorderRight(BorderStyle.THIN);//右
        return style;
    }
    
    public static CellStyle contextNoLeftRightBorder(Workbook wb){
        CellStyle style = wb.createCellStyle();
        Font font = contextFont(wb);
        style.setFont(font);
        style.setAlignment(HorizontalAlignment.CENTER);//水平居中
        style.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中
        style.setLocked(true);
        style.setWrapText(true);// 自动换行
        style.setBorderBottom(BorderStyle.THIN);//下边框
        style.setBorderTop(BorderStyle.THIN);//上边框
        return style;
    }
}

三、写入Excel简单示例 
 public void testWriteExcel(HttpServletRequest request, HttpServletResponse response){
        //1.创建book
        Workbook wb = new XSSFWorkbook();
        Sheet sheet = wb.createSheet("sheet名称,可为空");
        //2.创建sheet
        sheet.createFreezePane(1, 2, 0, 0);//冻结首列和前两行


        CellStyle headerStyle = ExcelStyleUtil.headerStyle(wb);
        //3.创建行
        Row row0 = sheet.createRow(0);
        //4.创建单元格
        Cell cell00 = row0.createCell(0);
        cell00.setCellStyle(headerStyle);//设置单元格样式
        cell00.setCellValue("单元格值");
        CellRangeAddress mergeReion = new CellRangeAddress(0, 0, 0, 2);
        sheet.addMergedRegion(mergeReion);//合并首行的前两个单元格

        //(1)第二行设置表头
        Row row1 = sheet.createRow(1);
        for (int i = 0; i < titles.size(); i++) {
            Object title = titles.get(i);
            Cell cell1i = row1.createCell(i);
            cell1i.setCellValue(String.valueOf(title));
            cell1i.setCellStyle(headerStyle);
        }
        
        //(2)下面设置表体数据:创建10行3列的表体
        CellStyle contextStyle = ExcelStyleUtil.contextAlignCenterStyle(wb);//内容样式
        for (int i = 0; i < 10; i++) {
            Row rowi = sheet.createRow(i + 2);
            for(int j=0;j<3;j++){
                Cell cellij = rowi.createCell(j);
                cellij.setCellValue("单元格值");
                sheet.setColumnWidth(j,5000);//设置列宽
                cellij.setCellStyle(contextStyle);
            }
        }
        //(3)导出到浏览器
        try{
            ExcelUtilByPOI.exportFile(request,response,wb,"文件名");//调用工具方法
        }catch (Exception e){
            throw new baseException(EPowerResultCode.DOWNLOAD_FILE_FAIL);
        }
    }

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

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

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