From 3901d88e01ce7a26eab5c18071363e3bca6cfaaf Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Tue, 23 Sep 2008 17:35:31 +0000 Subject: Merged revisions 697562,697580,697584,697589,697595,697599 via svnmerge from https://svn.apache.org/repos/asf/poi/trunk ........ r697562 | nick | 2008-09-21 18:49:20 +0100 (Sun, 21 Sep 2008) | 1 line Fix bug #45784 - Support long chart titles in SeriesTextRecords ........ r697580 | nick | 2008-09-21 19:43:49 +0100 (Sun, 21 Sep 2008) | 1 line Include the sheet name in the output of examples.XLS2CSVmra ........ r697584 | nick | 2008-09-21 19:56:32 +0100 (Sun, 21 Sep 2008) | 1 line Test to show that bug #45492 is invalid ........ r697589 | nick | 2008-09-21 20:17:41 +0100 (Sun, 21 Sep 2008) | 1 line Update hssf.extractor.ExcelExtractor to optionally output blank cells too ........ r697595 | nick | 2008-09-21 20:31:34 +0100 (Sun, 21 Sep 2008) | 1 line Improved tests to show that bugs #45062 and #44292 are fixed ........ r697599 | nick | 2008-09-21 20:50:21 +0100 (Sun, 21 Sep 2008) | 1 line Apply part of patch from bug #16936, with the rest made more HSSFCell like - Initial support for whole-row cell styling ........ git-svn-id: https://svn.apache.org/repos/asf/poi/branches/ooxml@698257 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/poi/hssf/extractor/ExcelExtractor.java | 125 ++++++++++++--------- .../apache/poi/hssf/record/BoundSheetRecord.java | 31 +++++ .../apache/poi/hssf/record/SeriesTextRecord.java | 23 +++- .../apache/poi/hssf/usermodel/HSSFCellStyle.java | 8 +- .../org/apache/poi/hssf/usermodel/HSSFPalette.java | 9 ++ .../org/apache/poi/hssf/usermodel/HSSFRow.java | 28 +++++ 6 files changed, 166 insertions(+), 58 deletions(-) (limited to 'src/java/org') diff --git a/src/java/org/apache/poi/hssf/extractor/ExcelExtractor.java b/src/java/org/apache/poi/hssf/extractor/ExcelExtractor.java index 17bde6da5f..e5e1bf9bc1 100644 --- a/src/java/org/apache/poi/hssf/extractor/ExcelExtractor.java +++ b/src/java/org/apache/poi/hssf/extractor/ExcelExtractor.java @@ -45,6 +45,7 @@ public class ExcelExtractor extends POIOLE2TextExtractor implements org.apache.p private boolean includeSheetNames = true; private boolean formulasNotResults = false; private boolean includeCellComments = false; + private boolean includeBlankCells = false; public ExcelExtractor(HSSFWorkbook wb) { super(wb); @@ -77,13 +78,26 @@ public class ExcelExtractor extends POIOLE2TextExtractor implements org.apache.p public void setIncludeCellComments(boolean includeCellComments) { this.includeCellComments = includeCellComments; } + /** + * Should blank cells be output? Default is to only + * output cells that are present in the file and are + * non-blank. + */ + public void setIncludeBlankCells(boolean includeBlankCells) { + this.includeBlankCells = includeBlankCells; + } /** * Retreives the text contents of the file */ public String getText() { StringBuffer text = new StringBuffer(); + + // We don't care about the differnce between + // null (missing) and blank cells + wb.setMissingCellPolicy(HSSFRow.RETURN_BLANK_AS_NULL); + // Process each sheet in turn for(int i=0;i 0) { - text.append(str.toString()); - } - break; - case HSSFCell.CELL_TYPE_NUMERIC: - text.append(cell.getNumericCellValue()); - break; - case HSSFCell.CELL_TYPE_BOOLEAN: - text.append(cell.getBooleanCellValue()); - break; - case HSSFCell.CELL_TYPE_ERROR: - text.append(ErrorEval.getText(cell.getErrorCellValue())); - break; - + + if(cell == null) { + // Only output if requested + outputContents = includeBlankCells; + } else { + switch(cell.getCellType()) { + case HSSFCell.CELL_TYPE_STRING: + text.append(cell.getRichStringCellValue().getString()); + break; + case HSSFCell.CELL_TYPE_NUMERIC: + // Note - we don't apply any formatting! + text.append(cell.getNumericCellValue()); + break; + case HSSFCell.CELL_TYPE_BOOLEAN: + text.append(cell.getBooleanCellValue()); + break; + case HSSFCell.CELL_TYPE_ERROR: + text.append(ErrorEval.getText(cell.getErrorCellValue())); + break; + case HSSFCell.CELL_TYPE_FORMULA: + if(formulasNotResults) { + text.append(cell.getCellFormula()); + } else { + switch(cell.getCachedFormulaResultType()) { + case HSSFCell.CELL_TYPE_STRING: + HSSFRichTextString str = cell.getRichStringCellValue(); + if(str != null && str.length() > 0) { + text.append(str.toString()); + } + break; + case HSSFCell.CELL_TYPE_NUMERIC: + text.append(cell.getNumericCellValue()); + break; + case HSSFCell.CELL_TYPE_BOOLEAN: + text.append(cell.getBooleanCellValue()); + break; + case HSSFCell.CELL_TYPE_ERROR: + text.append(ErrorEval.getText(cell.getErrorCellValue())); + break; + + } } - } - break; - default: - throw new RuntimeException("Unexpected cell type (" + cell.getCellType() + ")"); - } - - // Output the comment, if requested and exists - HSSFComment comment = cell.getCellComment(); - if(includeCellComments && comment != null) { - // Replace any newlines with spaces, otherwise it - // breaks the output - String commentText = comment.getString().getString().replace('\n', ' '); - text.append(" Comment by "+comment.getAuthor()+": "+commentText); + break; + default: + throw new RuntimeException("Unexpected cell type (" + cell.getCellType() + ")"); + } + + // Output the comment, if requested and exists + HSSFComment comment = cell.getCellComment(); + if(includeCellComments && comment != null) { + // Replace any newlines with spaces, otherwise it + // breaks the output + String commentText = comment.getString().getString().replace('\n', ' '); + text.append(" Comment by "+comment.getAuthor()+": "+commentText); + } } // Output a tab if we're not on the last cell diff --git a/src/java/org/apache/poi/hssf/record/BoundSheetRecord.java b/src/java/org/apache/poi/hssf/record/BoundSheetRecord.java index 1f7106ad72..412e991d26 100644 --- a/src/java/org/apache/poi/hssf/record/BoundSheetRecord.java +++ b/src/java/org/apache/poi/hssf/record/BoundSheetRecord.java @@ -17,6 +17,10 @@ package org.apache.poi.hssf.record; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; + import org.apache.poi.util.BitField; import org.apache.poi.util.BitFieldFactory; import org.apache.poi.util.LittleEndian; @@ -329,4 +333,31 @@ public final class BoundSheetRecord extends Record { public void setVeryHidden(boolean veryHidden) { field_2_option_flags = veryHiddenFlag.setShortBoolean(field_2_option_flags, veryHidden); } + + /** + * Takes a list of BoundSheetRecords, and returns the all + * ordered by the position of their BOFs. + */ + public static BoundSheetRecord[] orderByBofPosition(List boundSheetRecords) { + BoundSheetRecord[] bsrs = (BoundSheetRecord[])boundSheetRecords.toArray( + new BoundSheetRecord[boundSheetRecords.size()]); + + // Sort + Arrays.sort(bsrs, new BOFComparator()); + + // All done + return bsrs; + } + private static class BOFComparator implements Comparator { + public int compare(Object bsr1, Object bsr2) { + return compare((BoundSheetRecord)bsr1, (BoundSheetRecord)bsr2); + } + public int compare(BoundSheetRecord bsr1, BoundSheetRecord bsr2) { + if(bsr1.field_1_position_of_BOF < bsr2.field_1_position_of_BOF) + return -1; + if(bsr1.field_1_position_of_BOF == bsr2.field_1_position_of_BOF) + return 0; + return 1; + } + } } diff --git a/src/java/org/apache/poi/hssf/record/SeriesTextRecord.java b/src/java/org/apache/poi/hssf/record/SeriesTextRecord.java index 1271ef8764..66c26b3214 100644 --- a/src/java/org/apache/poi/hssf/record/SeriesTextRecord.java +++ b/src/java/org/apache/poi/hssf/record/SeriesTextRecord.java @@ -75,7 +75,8 @@ public class SeriesTextRecord field_1_id = in.readShort(); field_2_textLength = in.readByte(); field_3_undocumented = in.readByte(); - field_4_text = in.readUnicodeLEString(field_2_textLength); + field_4_text = in.readUnicodeLEString( + LittleEndian.ubyteToInt(field_2_textLength)); } public String toString() @@ -163,18 +164,34 @@ public class SeriesTextRecord /** * Get the text length field for the SeriesText record. */ - public byte getTextLength() + public int getTextLength() { - return field_2_textLength; + return LittleEndian.ubyteToInt(field_2_textLength); } /** * Set the text length field for the SeriesText record. + * Needs to be wrapped. */ public void setTextLength(byte field_2_textLength) { this.field_2_textLength = field_2_textLength; } + /** + * Set the text length field for the SeriesText record. + */ + public void setTextLength(int field_2_textLength) + { + if(field_2_textLength > 255) { + throw new IllegalArgumentException("Length must be 0-255"); + } + if(field_2_textLength > 127) { + this.field_2_textLength = (byte) + (field_2_textLength-256); + } else { + this.field_2_textLength = (byte)field_2_textLength; + } + } /** * Get the undocumented field for the SeriesText record. diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFCellStyle.java b/src/java/org/apache/poi/hssf/usermodel/HSSFCellStyle.java index 76be1f9e59..84525881a7 100644 --- a/src/java/org/apache/poi/hssf/usermodel/HSSFCellStyle.java +++ b/src/java/org/apache/poi/hssf/usermodel/HSSFCellStyle.java @@ -926,7 +926,9 @@ public class HSSFCellStyle implements CellStyle } /** - * get the background fill color + * Get the background fill color. + * Note - many cells are actually filled with a foreground + * fill, not a background fill - see {@link #getFillForegroundColor()} * @see org.apache.poi.hssf.usermodel.HSSFPalette#getColor(short) * @return fill color */ @@ -952,7 +954,9 @@ public class HSSFCellStyle implements CellStyle } /** - * get the foreground fill color + * Get the foreground fill color. + * Many cells are filled with this, instead of a + * background color ({@link #getFillBackgroundColor()}) * @see org.apache.poi.hssf.usermodel.HSSFPalette#getColor(short) * @return fill color */ diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFPalette.java b/src/java/org/apache/poi/hssf/usermodel/HSSFPalette.java index 0a31728899..4ec8e0dd02 100644 --- a/src/java/org/apache/poi/hssf/usermodel/HSSFPalette.java +++ b/src/java/org/apache/poi/hssf/usermodel/HSSFPalette.java @@ -58,6 +58,15 @@ public class HSSFPalette implements Palette } return null; } + /** + * Retrieves the color at a given index + * + * @param index the palette index, between 0x8 to 0x40 inclusive + * @return the color, or null if the index is not populated + */ + public HSSFColor getColor(int index) { + return getColor((short)index); + } /** * Finds the first occurance of a given color diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFRow.java b/src/java/org/apache/poi/hssf/usermodel/HSSFRow.java index 26fd999efc..1e211cced9 100644 --- a/src/java/org/apache/poi/hssf/usermodel/HSSFRow.java +++ b/src/java/org/apache/poi/hssf/usermodel/HSSFRow.java @@ -21,6 +21,7 @@ import java.util.Iterator; import java.util.NoSuchElementException; import org.apache.poi.hssf.record.CellValueRecordInterface; +import org.apache.poi.hssf.record.ExtendedFormatRecord; import org.apache.poi.hssf.record.RowRecord; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; @@ -525,6 +526,33 @@ public final class HSSFRow implements Comparable, Row { return -1; return cellnum; } + + /** + * Is this row formatted? Most aren't, but some rows + * do have whole-row styles. For those that do, you + * can get the formatting from {@link #getRowStyle()} + */ + public boolean isFormatted() { + return row.getFormatted(); + } + /** + * Returns the whole-row cell styles. Most rows won't + * have one of these, so will return null. Call + * {@link #isFormatted()} to check first. + */ + public HSSFCellStyle getRowStyle() { + if(!isFormatted()) { return null; } + short styleIndex = row.getXFIndex(); + ExtendedFormatRecord xf = book.getWorkbook().getExFormatAt(styleIndex); + return new HSSFCellStyle(styleIndex, xf, book); + } + /** + * Applies a whole-row cell styling to the row. + */ + public void setRowStyle(HSSFCellStyle style) { + row.setFormatted(true); + row.setXFIndex(style.getIndex()); + } /** * @return cell iterator of the physically defined cells. -- cgit v1.2.3