/** * Parses an RfX cell range from the data starting at the offset. * This performs no range checking. * @param data raw bytes * @param offset offset at which to start reading from data * @param cellRange to overwrite. If null, a new cellRange will be created. * @return a mutable cell range. */ public static XSSFBCellRange parse(byte[] data, int offset, XSSFBCellRange cellRange) { if (cellRange == null) { cellRange = new XSSFBCellRange(); } cellRange.firstRow = XSSFBUtils.castToInt(LittleEndian.getUInt(data, offset)); offset += LittleEndian.INT_SIZE; cellRange.lastRow = XSSFBUtils.castToInt(LittleEndian.getUInt(data, offset)); offset += LittleEndian.INT_SIZE; cellRange.firstCol = XSSFBUtils.castToInt(LittleEndian.getUInt(data, offset)); offset += LittleEndian.INT_SIZE; cellRange.lastCol = XSSFBUtils.castToInt(LittleEndian.getUInt(data, offset)); return cellRange; }
/** * * @param data raw data * @param offset offset at which to start reading the record * @param currentRow 0-based current row count * @param cell cell buffer to update */ public static void parse(byte[] data, int offset, int currentRow, XSSFBCellHeader cell) { int colNum = XSSFBUtils.castToInt(LittleEndian.getUInt(data, offset)); offset += LittleEndian.INT_SIZE; int styleIdx = XSSFBUtils.get24BitInt(data, offset); offset += 3; //TODO: range checking boolean showPhonetic = false;//TODO: fill this out cell.reset(currentRow, colNum, styleIdx, showPhonetic); }
@Override public void handleRecord(int recordType, byte[] data) throws XSSFBParseException { if (recordType != XSSFBRecordType.BrtHLink.getId()) { return; } int offset = 0; hyperlinkCellRange = XSSFBCellRange.parse(data, offset, hyperlinkCellRange); offset += XSSFBCellRange.length; xlWideStringBuffer.setLength(0); offset += XSSFBUtils.readXLNullableWideString(data, offset, xlWideStringBuffer); String relId = xlWideStringBuffer.toString(); xlWideStringBuffer.setLength(0); offset += XSSFBUtils.readXLWideString(data, offset, xlWideStringBuffer); String location = xlWideStringBuffer.toString(); xlWideStringBuffer.setLength(0); offset += XSSFBUtils.readXLWideString(data, offset, xlWideStringBuffer); String toolTip = xlWideStringBuffer.toString(); xlWideStringBuffer.setLength(0); /*offset +=*/ XSSFBUtils.readXLWideString(data, offset, xlWideStringBuffer); String display = xlWideStringBuffer.toString(); CellRangeAddress cellRangeAddress = new CellRangeAddress(hyperlinkCellRange.firstRow, hyperlinkCellRange.lastRow, hyperlinkCellRange.firstCol, hyperlinkCellRange.lastCol); String url = relIdToHyperlink.get(relId); if (location.length() == 0) { location = url; } hyperlinkRecords.add( new XSSFHyperlinkRecord(cellRangeAddress, relId, location, toolTip, display) ); } }
@Override public void handleRecord(int id, byte[] data) throws XSSFBParseException { XSSFBRecordType recordType = XSSFBRecordType.lookup(id); switch (recordType) { case BrtBeginComment: int offset = 0; authorId = XSSFBUtils.castToInt(LittleEndian.getUInt(data)); offset += LittleEndian.INT_SIZE; cellRange = XSSFBCellRange.parse(data, offset, cellRange); offset+= XSSFBCellRange.length; //for strict parsing; confirm that firstRow==lastRow and firstCol==colLats (2.4.28) cellAddress = new CellAddress(cellRange.firstRow, cellRange.firstCol); break; case BrtCommentText: XSSFBRichStr xssfbRichStr = XSSFBRichStr.build(data, 0); comment = xssfbRichStr.getString(); break; case BrtEndComment: comments.put(cellAddress, new XSSFBComment(cellAddress, authors.get(authorId), comment)); authorId = -1; cellAddress = null; break; case BrtCommentAuthor: authorBuffer.setLength(0); XSSFBUtils.readXLWideString(data, 0, authorBuffer); authors.add(authorBuffer.toString()); break; } }
private void handleFormat(byte[] data) { int ifmt = data[0] & 0xFF; if (ifmt > Short.MAX_VALUE) { throw new POIXMLException("Format id must be a short"); } StringBuilder sb = new StringBuilder(); XSSFBUtils.readXLWideString(data, 2, sb); String fmt = sb.toString(); numberFormats.put((short)ifmt, fmt); }
private static int readHeaderFooter(byte[] data, int offset, XSSFBHeaderFooter headerFooter) { if (offset + 4 >= data.length) { return 0; } StringBuilder sb = new StringBuilder(); int bytesRead = XSSFBUtils.readXLNullableWideString(data, offset, sb); headerFooter.setRawString(sb.toString()); return bytesRead; }
@Override public void handleRecord(int recordType, byte[] data) throws XSSFBParseException { if (recordType != XSSFBRecordType.BrtAbsPath15.getId()) { return; } StringBuilder sb = new StringBuilder(); XSSFBUtils.readXLWideString(data, 0, sb); path = sb.toString(); }
@Override public void handleRecord(int id, byte[] data) throws XSSFBParseException { XSSFBRecordType recordType = XSSFBRecordType.lookup(id); switch (recordType) { case BrtBeginComment: int offset = 0; authorId = XSSFBUtils.castToInt(LittleEndian.getUInt(data)); offset += LittleEndian.INT_SIZE; cellRange = XSSFBCellRange.parse(data, offset, cellRange); offset+= XSSFBCellRange.length; //for strict parsing; confirm that firstRow==lastRow and firstCol==colLats (2.4.28) cellAddress = new CellAddress(cellRange.firstRow, cellRange.firstCol); break; case BrtCommentText: XSSFBRichStr xssfbRichStr = XSSFBRichStr.build(data, 0); comment = xssfbRichStr.getString(); break; case BrtEndComment: comments.put(cellAddress, new XSSFBComment(cellAddress, authors.get(authorId), comment)); authorId = -1; cellAddress = null; break; case BrtCommentAuthor: authorBuffer.setLength(0); XSSFBUtils.readXLWideString(data, 0, authorBuffer); authors.add(authorBuffer.toString()); break; } }
private static int readHeaderFooter(byte[] data, int offset, XSSFBHeaderFooter headerFooter) { if (offset + 4 >= data.length) { return 0; } StringBuilder sb = new StringBuilder(); int bytesRead = XSSFBUtils.readXLNullableWideString(data, offset, sb); headerFooter.setRawString(sb.toString()); return bytesRead; }
public static XSSFBRichStr build(byte[] bytes, int offset) throws XSSFBParseException { byte first = bytes[offset]; boolean dwSizeStrRunExists = (first >> 7 & 1) == 1;//first bit == 1? boolean phoneticExists = (first >> 6 & 1) == 1;//second bit == 1? StringBuilder sb = new StringBuilder(); int read = XSSFBUtils.readXLWideString(bytes, offset+1, sb); //TODO: parse phonetic strings. return new XSSFBRichStr(sb.toString(), ""); }
@Override public void handleRecord(int recordType, byte[] data) throws XSSFBParseException { XSSFBRecordType type = XSSFBRecordType.lookup(recordType); switch (type) { case BrtSstItem: XSSFBRichStr rstr = XSSFBRichStr.build(data, 0); strings.add(rstr.getString()); break; case BrtBeginSst: count = XSSFBUtils.castToInt(LittleEndian.getUInt(data,0)); uniqueCount = XSSFBUtils.castToInt(LittleEndian.getUInt(data, 4)); break; } } }
/** * * @param data raw data * @param offset offset at which to start reading the record * @param currentRow 0-based current row count * @param cell cell buffer to update */ public static void parse(byte[] data, int offset, int currentRow, XSSFBCellHeader cell) { int colNum = XSSFBUtils.castToInt(LittleEndian.getUInt(data, offset)); offset += LittleEndian.INT_SIZE; int styleIdx = XSSFBUtils.get24BitInt(data, offset); offset += 3; //TODO: range checking boolean showPhonetic = false;//TODO: fill this out cell.reset(currentRow, colNum, styleIdx, showPhonetic); }
@Override public void handleRecord(int recordType, byte[] data) throws XSSFBParseException { if (recordType != XSSFBRecordType.BrtHLink.getId()) { return; } int offset = 0; hyperlinkCellRange = XSSFBCellRange.parse(data, offset, hyperlinkCellRange); offset += XSSFBCellRange.length; xlWideStringBuffer.setLength(0); offset += XSSFBUtils.readXLNullableWideString(data, offset, xlWideStringBuffer); String relId = xlWideStringBuffer.toString(); xlWideStringBuffer.setLength(0); offset += XSSFBUtils.readXLWideString(data, offset, xlWideStringBuffer); String location = xlWideStringBuffer.toString(); xlWideStringBuffer.setLength(0); offset += XSSFBUtils.readXLWideString(data, offset, xlWideStringBuffer); String toolTip = xlWideStringBuffer.toString(); xlWideStringBuffer.setLength(0); /*offset +=*/ XSSFBUtils.readXLWideString(data, offset, xlWideStringBuffer); String display = xlWideStringBuffer.toString(); CellRangeAddress cellRangeAddress = new CellRangeAddress(hyperlinkCellRange.firstRow, hyperlinkCellRange.lastRow, hyperlinkCellRange.firstCol, hyperlinkCellRange.lastCol); String url = relIdToHyperlink.get(relId); if (location.length() == 0) { location = url; } hyperlinkRecords.add( new XSSFHyperlinkRecord(cellRangeAddress, relId, location, toolTip, display) ); } }
private void handleFmlaString(byte[] data) { beforeCellValue(data); xlWideStringBuffer.setLength(0); XSSFBUtils.readXLWideString(data, XSSFBCellHeader.length, xlWideStringBuffer); handleCellValue(xlWideStringBuffer.toString()); }
private void handleBrtCellIsst(byte[] data) { beforeCellValue(data); int idx = XSSFBUtils.castToInt(LittleEndian.getUInt(data, XSSFBCellHeader.length)); RichTextString rtss = stringsTable.getItemAt(idx); handleCellValue(rtss.getString()); }
private void handleCellSt(byte[] data) { beforeCellValue(data); xlWideStringBuffer.setLength(0); XSSFBUtils.readXLWideString(data, XSSFBCellHeader.length, xlWideStringBuffer); handleCellValue(xlWideStringBuffer.toString()); }
int rw = XSSFBUtils.castToInt(LittleEndian.getUInt(data, 0)); if (rw > 0x00100000) {//could make sure this is larger than currentRow, according to spec? throw new XSSFBParseException("Row number beyond allowable range: "+rw);
private boolean tryOldFormat(byte[] data) throws XSSFBParseException { //undocumented what is contained in these 8 bytes. //for the non-beta xlsb files, this would be 4, not 8. int offset = 8; long iTabID = LittleEndian.getUInt(data, offset); offset += LittleEndian.INT_SIZE; if (iTabID < 1 || iTabID > 0x0000FFFFL) { throw new XSSFBParseException("table id out of range: "+iTabID); } StringBuilder sb = new StringBuilder(); offset += XSSFBUtils.readXLWideString(data, offset, sb); String relId = sb.toString(); sb.setLength(0); offset += XSSFBUtils.readXLWideString(data, offset, sb); String name = sb.toString(); if (relId.trim().length() > 0) { sheets.add(new XSSFSheetRef(relId, name)); } if (offset == data.length) { return true; } return false; }
/** * Parses an RfX cell range from the data starting at the offset. * This performs no range checking. * @param data raw bytes * @param offset offset at which to start reading from data * @param cellRange to overwrite. If null, a new cellRange will be created. * @return a mutable cell range. */ public static XSSFBCellRange parse(byte[] data, int offset, XSSFBCellRange cellRange) { if (cellRange == null) { cellRange = new XSSFBCellRange(); } cellRange.firstRow = XSSFBUtils.castToInt(LittleEndian.getUInt(data, offset)); offset += LittleEndian.INT_SIZE; cellRange.lastRow = XSSFBUtils.castToInt(LittleEndian.getUInt(data, offset)); offset += LittleEndian.INT_SIZE; cellRange.firstCol = XSSFBUtils.castToInt(LittleEndian.getUInt(data, offset)); offset += LittleEndian.INT_SIZE; cellRange.lastCol = XSSFBUtils.castToInt(LittleEndian.getUInt(data, offset)); return cellRange; }
private void tryToAddWorksheet(byte[] data) throws XSSFBParseException { int offset = 0; //this is the sheet state #2.5.142 /*long hsShtat =*/ //noinspection ResultOfMethodCallIgnored LittleEndian.getUInt(data, offset); offset += LittleEndian.INT_SIZE; long iTabID = LittleEndian.getUInt(data, offset); offset += LittleEndian.INT_SIZE; //according to #2.4.304 if (iTabID < 1 || iTabID > 0x0000FFFFL) { throw new XSSFBParseException("table id out of range: "+iTabID); } StringBuilder sb = new StringBuilder(); offset += XSSFBUtils.readXLWideString(data, offset, sb); String relId = sb.toString(); sb.setLength(0); /*offset +=*/ XSSFBUtils.readXLWideString(data, offset, sb); String name = sb.toString(); if (relId.trim().length() > 0) { sheets.add(new XSSFSheetRef(relId, name)); } }