按照一个网帖教的方法。http://chenjumin.iteye.com/blog/731056这里面因为POI版本的升级(原帖为3.1;我用的3.7),类名有所变动,我大概找到的对应关系就是里面的Workbook类对应为新版的InternalWorkbook,Sheet类对应为InternalSheet。
但是写最后那个getByte方法的时候,死活想不到应该咋改了,求各位大神帮个忙吧。
找不到的方法我标注在程序里了,求各位大神看看。
 static byte[] getBytes(Workbook workbook, Sheet[] sheets) {   
        int nSheets = sheets.length;     
       
        for(int i = 0; i < nSheets; i++){     
            sheets[i].preSerialize();     
        }     
          
        int totalsize = workbook.getSize();     
      
        int[] estimatedSheetSizes = new int[nSheets];     
        for(int k = 0; k < nSheets; k++){     
            workbook.setSheetBof(k, totalsize);     
            int sheetSize = sheets[k].getSize();    --这个getSize找不到了。。 
            estimatedSheetSizes[k] = sheetSize;     
            totalsize += sheetSize;  
        }   
    
        byte[] retval = new byte[totalsize];     
        int pos = workbook.serialize(0, retval);     
    
        for(int k = 0; k < nSheets; k++){     
            int serializedSize = sheets[k].serialize(pos, retval);     --这个serialize找不到了。
            if(serializedSize != estimatedSheetSizes[k]){     
                throw new IllegalStateException("Actual serialized sheet size (" + serializedSize     
                        + ") differs from pre-calculated size (" + estimatedSheetSizes[k] + ") for sheet (" + k     
                        + ")");   
            }     
            pos += serializedSize;     
        }     
        return retval;     
    }   

解决方案 »

  1.   

     int sheetSize = sheets[k].getSize(); --这个getSize找不到了。。
    这个应该是写错了,获取数组的大小应该直接用 size()int serializedSize = sheets[k].serialize(pos, retval); --这个serialize找不到了。
    这个不知道
    等待,我大概找到的对应关系就是里面的Workbook类对应为新版的InternalWorkbook,Sheet类对应为InternalSheet。
    这个对我很有帮助,先谢了~看看代码去!
      

  2.   

    说错了~  数组大小直接是length
      

  3.   

      private static final class SheetRecordCollector implements RecordVisitor {         private List _list;
            private int _totalSize;         public SheetRecordCollector() {
                _totalSize = 0;
                _list = new ArrayList(128);
            }
            public int getTotalSize() {
                return _totalSize;
            }
            public void visitRecord(Record r) {
                _list.add(r);
                _totalSize+=r.getRecordSize();
            }
            public int serialize(int offset, byte[] data) {
                int result = 0;
                int nRecs = _list.size();
                for(int i=0; i<nRecs; i++) {
                    Record rec = (Record)_list.get(i);
                    result += rec.serialize(offset + result, data);
                }
                return result;
            }
        }
    再里面新建一个内部类就可以了,你看3.7的源码就是这么弄的