All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.shaohj.sstool.poiexpand.sax07.template.Sax07ExcelTemplateReader Maven / Gradle / Ivy

package com.github.shaohj.sstool.poiexpand.sax07.template;

import com.github.shaohj.sstool.core.util.IoUtil;
import com.github.shaohj.sstool.core.util.MapUtil;
import com.github.shaohj.sstool.core.util.StrUtil;
import com.github.shaohj.sstool.poiexpand.common.bean.read.CellData;
import com.github.shaohj.sstool.poiexpand.common.bean.read.ReadSheetData;
import com.github.shaohj.sstool.poiexpand.common.bean.read.RowData;
import com.github.shaohj.sstool.poiexpand.common.exception.PoiExpandException;
import com.github.shaohj.sstool.poiexpand.common.util.ExcelCommonUtil;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileInputStream;
import java.io.InputStream;
import java.util.*;

/**
 * 编  号:
 * 名  称:Sax07ExcelTemplateReader
 * 描  述:excle2007读取模板工具类
 * 完成日期:2019/6/29 11:11
 * @author:felix.shao
 */
public class Sax07ExcelTemplateReader {

    /**
     * 根据模板文件名打开workbook.
     * @param isClassPath 是否为class路径.true:是;false:否
     * @param fileName 文件路径,支持class路径和绝对路径
     * @return
     */
    public static XSSFWorkbook openWorkbook(boolean isClassPath, String fileName) {
        String fileSuffix = StrUtil.getStringSuffix(fileName);
        if (!"xlsx".equals(fileSuffix)) {
            throw new IllegalArgumentException("poi缓存导出只支持xlsx,程序同步,支持支xlsx导出");
        }
        InputStream in = null;
        try {
            if(isClassPath) {
                in = Sax07ExcelTemplateReader.class.getClassLoader().getResourceAsStream(fileName);
            } else {
                in = new FileInputStream(fileName);
            }
            return new XSSFWorkbook(in);
        } catch (Exception e) {
            throw new PoiExpandException("File" + fileName + "not found" + e.getMessage());
        } finally {
            IoUtil.close(in);
        }
    }

    /**
     * 读取XSSFWorkbook的Sheet,生成SheetData数据
     * @param readWb
     * @return
     */
    public static List readSheetData(Workbook readWb){
        //模板中所有sheet数量
        int readWbSheetCount = readWb.getNumberOfSheets();
        List readSheetDatas = new ArrayList<>(readWbSheetCount);

        for (int i = 0; i < readWbSheetCount; i++) {
            Sheet readSheet = readWb.getSheetAt(i);

            ReadSheetData readSheetData = new ReadSheetData();
            readSheetData.setSheetNum(i);
            readSheetData.setSheetName(readSheet.getSheetName());

            int maxCellNum = ExcelCommonUtil.getMaxCellNum(readSheet);
            int[] cellWidths = ExcelCommonUtil.getCellWidths(readSheet, maxCellNum);
            readSheetData.setCellWidths(cellWidths);

            Map readSheetRowDatas = readRowData(readSheet, readSheet.getFirstRowNum(), readSheet.getLastRowNum());

            readSheetData.setAllCellRangeAddress(getSheetMergedRegions(readSheet));
            readSheetData.setRowDatas(readSheetRowDatas);

            readSheetDatas.add(readSheetData);
        }

        return readSheetDatas;
    }

    /**
     * 读取XSSFWorkbook的Row,生成RowData数据
     * @param readSheet
     * @param firstRowNum
     * @param lastRowNum
     * @return
     */
    public static Map readRowData(Sheet readSheet, int firstRowNum, int lastRowNum){
        //存储sheet的rowData数据
        Map rowDatas = new LinkedHashMap<>(MapUtil.calMapSize(lastRowNum - firstRowNum + 1));
        int curRowNum = firstRowNum;

        while (curRowNum <= lastRowNum) {
            Row readRow = readSheet.getRow(curRowNum);

            RowData rowData = new RowData();
            rowData.setRowNum(curRowNum);
            Map readRowCellDatas = null;

            if(null != readRow){
                //设置行高等属性
                rowData.setHeight(readRow.getHeight());
                rowData.setHeightInPoints(readRow.getHeightInPoints());
                readRowCellDatas = readCellData(readRow, readRow.getFirstCellNum(), readRow.getLastCellNum());
            } else {
                rowData.setHeight(new Short("160"));
                rowData.setHeightInPoints(new Short("20"));
            }

            rowData.setCellDatas(readRowCellDatas);

            rowDatas.put(String.valueOf(curRowNum), rowData);

            curRowNum++;
        }

        return rowDatas;
    }

    /**
     * 读取XSSFWorkbook的Cell,生成CellData数据
     * @param readRow
     * @param firstCellNum
     * @param lastCellNum
     * @return
     */
    public static Map readCellData(Row readRow, int firstCellNum, int lastCellNum){
        Map cellDatas = new LinkedHashMap<>(MapUtil.calMapSize(lastCellNum - firstCellNum + 1));

        if(-1 == firstCellNum) {
            return cellDatas;
        }
        int curCellNum = firstCellNum;

        while (curCellNum <= lastCellNum) {
            Cell readCell = readRow.getCell(curCellNum);

            CellData cellData = new CellData();
            cellData.setColNum(curCellNum);

            if(null != readCell){
                //设置样式等属性
                cellData.setCellStyle(readCell.getCellStyle());
                cellData.setCellType(readCell.getCellTypeEnum());
            }

            if (null == readCell){
                cellData.setValue("");
            } else {
                cellData.setValue(ExcelCommonUtil.getCellValue(readCell));
            }

            cellDatas.put(String.valueOf(curCellNum), cellData);

            curCellNum++;
        }

        return cellDatas;
    }

    /**
     * 获取sheet的所有合并单元格
     * @param readSheet
     * @return
     */
    public static Map getSheetMergedRegions(Sheet readSheet){
        int mergeRegionNum = readSheet.getNumMergedRegions();

        if(0 == mergeRegionNum){
            return null;
        }

        Map cellRangeAddressMap = new HashMap<>(MapUtil.calMapSize(mergeRegionNum));
        for(int i = 0; i < mergeRegionNum; i++){
            cellRangeAddressMap.put(String.valueOf(i), readSheet.getMergedRegion(i));
        }
        return cellRangeAddressMap;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy