cellList = new ArrayList();
    
    /**
     * 判断整行是否为空行的标记
     */
    private boolean flag = false;
    
    //定义列名的行索引
    private int headerIncex = 1;
    
    //定义数据的行索引
    private int dataIndex = 2;
    
    private String sheetName;
    
    /**
     * 根据文件流解析
     * 
     * @param inputStream
     * @param headerIncex
     * @param dataIndex
     * @return
     * @throws Exception
     */
    public int process(InputStream inputStream, int headerIncex, int dataIndex)
        throws Exception {
        this.fs = new POIFSFileSystem(inputStream);
        return init(headerIncex, dataIndex);
    }
    
    /**
     * 根据文件路径解析
     * @param path
     * @param headerIncex
     * @param dataIndex
     * @return
     * @throws Exception
     */
    public int process(String path, int headerIncex, int dataIndex)
        throws Exception {
        this.fs = new POIFSFileSystem(new FileInputStream(path));
        return init(headerIncex, dataIndex);
    }
    
    /**
     * 遍历excel下所有的sheet
     * 
     * @param headerIncex
     * @param dataIndex
     * @return
     * @throws Exception
     */
    private int init(int headerIncex, int dataIndex)
        throws Exception {
        MissingRecordAwareHSSFListener listener = new MissingRecordAwareHSSFListener(this);
        formatListener = new FormatTrackingHSSFListener(listener);
        HSSFEventFactory factory = new HSSFEventFactory();
        HSSFRequest request = new HSSFRequest();
        if (outputFormulaValues) {
            request.addListenerForAllRecords(formatListener);
        }
        else {
            workbookBuildingListener = new EventWorkbookBuilder.SheetRecordCollectingListener(formatListener);
            request.addListenerForAllRecords(workbookBuildingListener);
        }
        if (headerIncex > 0)
            //设置表头行
            this.headerIncex = headerIncex;
        if (dataIndex > 0)
            //设置数据行
            this.dataIndex = dataIndex;
        factory.processWorkbookEvents(request, fs);
        //返回该excel文件的总行数,不包括首列和空行
        return totalRows;
    }
    
    /**
     * HSSFListener 监听方法,处理Record
     * 处理每个单元格
     */
    @SuppressWarnings("unchecked")
    public void processRecord(Record record) {
        int thisRow = -1;
        int thisColumn = -1;
        String thisStr = null;
        String value = null;
        
        switch (record.getSid()) {
            case BoundSheetRecord.sid:
                boundSheetRecords.add(record);
                break;
            case BOFRecord.sid:
                //开始处理每个sheet
                BOFRecord br = (BOFRecord)record;
                if (br.getType() == BOFRecord.TYPE_WORKSHEET) {
                    //如果有需要,则建立子工作簿
                    if (workbookBuildingListener != null && stubWorkbook == null) {
                        stubWorkbook = workbookBuildingListener.getStubHSSFWorkbook();
                    }
                    
                    if (orderedBSRs == null) {
                        orderedBSRs = BoundSheetRecord.orderByBofPosition(boundSheetRecords);
                    }
                    sheetName = orderedBSRs[sheetIndex].getSheetname();
                    sheetIndex++;
                }
                break;
            case SSTRecord.sid:
                sstRecord = (SSTRecord)record;
                break;
            case BlankRecord.sid:
                //单元格为空白
                BlankRecord brec = (BlankRecord)record;
                thisRow = brec.getRow();
                thisColumn = brec.getColumn();
                thisStr = "";
                cellList.add(thisColumn, thisStr);
                break;
            case BoolErrRecord.sid:
                //单元格为布尔类型
                BoolErrRecord berec = (BoolErrRecord)record;
                thisRow = berec.getRow();
                thisColumn = berec.getColumn();
                thisStr = berec.getBooleanValue() + "";
                cellList.add(thisColumn, thisStr);
                //如果里面某个单元格含有值,则标识该行不为空行
                checkRowIsNull(thisStr);
                break;
            case FormulaRecord.sid:
                //单元格为公式类型
                FormulaRecord frec = (FormulaRecord)record;
                thisRow = frec.getRow();
                thisColumn = frec.getColumn();
                if (outputFormulaValues) {
                    if (Double.isNaN(frec.getValue())) {
                        outputNextStringRecord = true;
                        nextRow = frec.getRow();
                        nextColumn = frec.getColumn();
                    }
                    else {
                        thisStr = '"' + HSSFFormulaParser.toFormulaString(stubWorkbook, frec.getParsedExpression()) + '"';
                    }
                }
                else {
                    thisStr = '"' + HSSFFormulaParser.toFormulaString(stubWorkbook, frec.getParsedExpression()) + '"';
                }
                cellList.add(thisColumn, thisStr);
                //如果里面某个单元格含有值,则标识该行不为空行
                checkRowIsNull(thisStr);
                break;
            case StringRecord.sid:
                //单元格中公式的字符串
                if (outputNextStringRecord) {
                    StringRecord srec = (StringRecord)record;
                    thisStr = srec.getString();
                    thisRow = nextRow;
                    thisColumn = nextColumn;
                    outputNextStringRecord = false;
                }
                break;
            case LabelRecord.sid:
                LabelRecord lrec = (LabelRecord)record;
                curRow = thisRow = lrec.getRow();
                thisColumn = lrec.getColumn();
                value = lrec.getValue().trim();
                value = value.equals("") ? "" : value;
                cellList.add(thisColumn, value.replaceAll("
", ""));
                //如果里面某个单元格含有值,则标识该行不为空行
                checkRowIsNull(value);
                break;
            case LabelSSTRecord.sid:
                //单元格为字符串类型
                LabelSSTRecord lsrec = (LabelSSTRecord)record;
                curRow = thisRow = lsrec.getRow();
                thisColumn = lsrec.getColumn();
                if (sstRecord == null) {
                    cellList.add(thisColumn, "");
                }
                else {
                    value = sstRecord.getString(lsrec.getSSTIndex()).toString().trim();
                    value = value.equals("") ? "" : value;
                    cellList.add(thisColumn, value.replaceAll("
", ""));
                    //如果里面某个单元格含有值,则标识该行不为空行
                    checkRowIsNull(value);
                }
                break;
            case NumberRecord.sid:
                //单元格为数字类型
                NumberRecord numrec = (NumberRecord)record;
                curRow = thisRow = numrec.getRow();
                thisColumn = numrec.getColumn();
                
                //第一种方式 这个被写死,采用的m/d/yy h:mm格式,不符合要求
                //value = formatListener.formatNumberDateCell(numrec).trim();
                
                //第二种方式,参照formatNumberDateCell里面的实现方法编写
                Double valueDouble = ((NumberRecord)numrec).getValue();
                String formatString = formatListener.getFormatString(numrec);
                /*if (formatString.contains("m/d/yy")) {
                    formatString = "yyyy-MM-dd hh:mm:ss";
                }*/
                int formatIndex = formatListener.getFormatIndex(numrec);
                value = formatter.formatRawCellContents(valueDouble, formatIndex, formatString).trim();
                
                value = value.equals("") ? "" : value;
                //向容器加入列值
                cellList.add(thisColumn, value.replaceAll("
", ""));
                //如果里面某个单元格含有值,则标识该行不为空行
                checkRowIsNull(value);
                break;
            default:
                break;
        }
        
        //遇到新行的操作
        if (thisRow != -1 && thisRow != lastRowNumber) {
            lastColumnNumber = -1;
        }
        
        //空值的操作
        if (record instanceof MissingCellDummyRecord) {
            MissingCellDummyRecord mc = (MissingCellDummyRecord)record;
            curRow = thisRow = mc.getRow();
            thisColumn = mc.getColumn();
            cellList.add(thisColumn, "");
        }
        
        //更新行和列的值
        if (thisRow > -1)
            lastRowNumber = thisRow;
        if (thisColumn > -1)
            lastColumnNumber = thisColumn;
        
        //行结束时的操作
        if (record instanceof LastCellOfRowDummyRecord) {
            if (minColums > 0) {
                //列值重新置空
                if (lastColumnNumber == -1) {
                    lastColumnNumber = 0;
                }
            }
            lastColumnNumber = -1;
            
            if (curRow == headerIncex - 1) {
                //表头行结束时,调用sendHeaderRows()方法
                sendHeaderRows(filePath, sheetName, sheetIndex, curRow + 1, cellList);
            }
            
            //该行不为空行且该行为数据行
            if (flag && curRow >= dataIndex - 1) {
                //每行数据结束时,调用sendDataRows()方法
                sendDataRows(filePath, sheetName, sheetIndex, curRow + 1, cellList);
                totalRows++;
            }
            //清空容器
            cellList.clear();
            flag = false;
        }
    }
    
    /**
     * 如果里面某个单元格含有值,则标识该行不为空行
     * @param value
     */
    public void checkRowIsNull(String value) {
        if (value != null && !"".equals(value)) {
            flag = true;
        }
    }
    
    /**
     * 表头数据
     * @param filePath
     * @param sheetName
     * @param sheetIndex
     * @param curRow
     * @param cellList
     */
    public void sendHeaderRows(String filePath, String sheetName, int sheetIndex, int curRow, List    
     
 
      
 
       
 
       
        
      
 
    
    
    
   
 
 
 
 
 
  
    
    
- 
网站地图 | 
-  
- 声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。文章内容仅供参考,不做权威认证,如若验证其真实性,请咨询相关权威专业人士。