diff --git a/src/documentation/content/xdocs/changes.xml b/src/documentation/content/xdocs/changes.xml index 1d03b99ce..3afe4e077 100644 --- a/src/documentation/content/xdocs/changes.xml +++ b/src/documentation/content/xdocs/changes.xml @@ -37,6 +37,7 @@ + 16936 - Initial support for whole-row cell styling Update hssf.extractor.ExcelExtractor to optionally output blank cells too Include the sheet name in the output of examples.XLS2CSVmra 45784 - Support long chart titles in SeriesTextRecords diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index 976c02833..d745ce41e 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -34,6 +34,7 @@ + 16936 - Initial support for whole-row cell styling Update hssf.extractor.ExcelExtractor to optionally output blank cells too Include the sheet name in the output of examples.XLS2CSVmra 45784 - Support long chart titles in SeriesTextRecords diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFRow.java b/src/java/org/apache/poi/hssf/usermodel/HSSFRow.java index a11410a37..47dbc03d4 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; /** @@ -519,6 +520,33 @@ public final class HSSFRow implements Comparable { 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()); + } /** * Used to specify the different possible policies diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestRowStyle.java b/src/testcases/org/apache/poi/hssf/usermodel/TestRowStyle.java new file mode 100644 index 000000000..8cca07849 --- /dev/null +++ b/src/testcases/org/apache/poi/hssf/usermodel/TestRowStyle.java @@ -0,0 +1,204 @@ +/* ==================================================================== + Copyright 2002-2004 Apache Software Foundation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + + +/* + * TestRowStyle.java + * + * Created on May 20, 2005 + */ +package org.apache.poi.hssf.usermodel; + +import java.io.IOException; + +import junit.framework.TestCase; + +import org.apache.poi.hssf.HSSFTestDataSamples; +import org.apache.poi.util.TempFile; + +/** + * Class to test row styling functionality + * + * @author Amol S. Deshmukh < amolweb at ya hoo dot com > + */ + +public class TestRowStyle + extends TestCase +{ + + /** Creates a new instance of TestCellStyle */ + + public TestRowStyle(String name) + { + super(name); + } + + /** + * TEST NAME: Test Write Sheet Font

+ * OBJECTIVE: Test that HSSF can create a simple spreadsheet with numeric and string values and styled with fonts.

+ * SUCCESS: HSSF creates a sheet. Filesize matches a known good. HSSFSheet objects + * Last row, first row is tested against the correct values (99,0).

+ * FAILURE: HSSF does not create a sheet or excepts. Filesize does not match the known good. + * HSSFSheet last row or first row is incorrect.

+ * + */ + + public void testWriteSheetFont() + throws IOException + { + HSSFWorkbook wb = new HSSFWorkbook(); + HSSFSheet s = wb.createSheet(); + HSSFRow r = null; + HSSFCell c = null; + HSSFFont fnt = wb.createFont(); + HSSFCellStyle cs = wb.createCellStyle(); + + fnt.setColor(HSSFFont.COLOR_RED); + fnt.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); + cs.setFont(fnt); + for (short rownum = ( short ) 0; rownum < 100; rownum++) + { + r = s.createRow(rownum); + r.setRowStyle(cs); + r.createCell(0); + } + wb = HSSFTestDataSamples.writeOutAndReadBack(wb); + + SanityChecker sanityChecker = new SanityChecker(); + sanityChecker.checkHSSFWorkbook(wb); + assertEquals("LAST ROW == 99", 99, s.getLastRowNum()); + assertEquals("FIRST ROW == 0", 0, s.getFirstRowNum()); + } + + /** + * Tests that is creating a file with a date or an calendar works correctly. + */ + public void testDataStyle() + throws Exception + { + HSSFWorkbook wb = new HSSFWorkbook(); + HSSFSheet s = wb.createSheet(); + HSSFCellStyle cs = wb.createCellStyle(); + HSSFRow row = s.createRow((short)0); + + // with Date: + cs.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy")); + row.setRowStyle(cs); + row.createCell(0); + + + // with Calendar: + row = s.createRow((short)1); + cs.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy")); + row.setRowStyle(cs); + row.createCell(0); + + wb = HSSFTestDataSamples.writeOutAndReadBack(wb); + + SanityChecker sanityChecker = new SanityChecker(); + sanityChecker.checkHSSFWorkbook(wb); + + assertEquals("LAST ROW ", 1, s.getLastRowNum()); + assertEquals("FIRST ROW ", 0, s.getFirstRowNum()); + + } + + /** + * TEST NAME: Test Write Sheet Style

+ * OBJECTIVE: Test that HSSF can create a simple spreadsheet with numeric and string values and styled with colors + * and borders.

+ * SUCCESS: HSSF creates a sheet. Filesize matches a known good. HSSFSheet objects + * Last row, first row is tested against the correct values (99,0).

+ * FAILURE: HSSF does not create a sheet or excepts. Filesize does not match the known good. + * HSSFSheet last row or first row is incorrect.

+ * + */ + + public void testWriteSheetStyle() + throws IOException + { + HSSFWorkbook wb = new HSSFWorkbook(); + HSSFSheet s = wb.createSheet(); + HSSFRow r = null; + HSSFFont fnt = wb.createFont(); + HSSFCellStyle cs = wb.createCellStyle(); + HSSFCellStyle cs2 = wb.createCellStyle(); + + cs.setBorderBottom(HSSFCellStyle.BORDER_THIN); + cs.setBorderLeft(HSSFCellStyle.BORDER_THIN); + cs.setBorderRight(HSSFCellStyle.BORDER_THIN); + cs.setBorderTop(HSSFCellStyle.BORDER_THIN); + cs.setFillForegroundColor(( short ) 0xA); + cs.setFillPattern(( short ) 1); + fnt.setColor(( short ) 0xf); + fnt.setItalic(true); + cs2.setFillForegroundColor(( short ) 0x0); + cs2.setFillPattern(( short ) 1); + cs2.setFont(fnt); + for (short rownum = ( short ) 0; rownum < 100; rownum++) + { + r = s.createRow(rownum); + r.setRowStyle(cs); + r.createCell(0); + + rownum++; + if (rownum >= 100) break; // I feel too lazy to check if this isreqd :-/ + + r = s.createRow(rownum); + r.setRowStyle(cs2); + r.createCell(0); + } + wb = HSSFTestDataSamples.writeOutAndReadBack(wb); + + SanityChecker sanityChecker = new SanityChecker(); + sanityChecker.checkHSSFWorkbook(wb); + assertEquals("LAST ROW == 99", 99, s.getLastRowNum()); + assertEquals("FIRST ROW == 0", 0, s.getFirstRowNum()); + + s = wb.getSheetAt(0); + assertNotNull("Sheet is not null", s); + + for (short rownum = ( short ) 0; rownum < 100; rownum++) + { + r = s.getRow(rownum); + assertNotNull("Row is not null", r); + + cs = r.getRowStyle(); + assertEquals("FillForegroundColor for row: ", cs.getBorderBottom(), HSSFCellStyle.BORDER_THIN); + assertEquals("FillPattern for row: ", cs.getBorderLeft(), HSSFCellStyle.BORDER_THIN); + assertEquals("FillForegroundColor for row: ", cs.getBorderRight(), HSSFCellStyle.BORDER_THIN); + assertEquals("FillPattern for row: ", cs.getBorderTop(), HSSFCellStyle.BORDER_THIN); + assertEquals("FillForegroundColor for row: ", cs.getFillForegroundColor(), 0xA); + assertEquals("FillPattern for row: ", cs.getFillPattern(), (short) 0x1); + + rownum++; + if (rownum >= 100) break; // I feel too lazy to check if this isreqd :-/ + + r = s.getRow(rownum); + assertNotNull("Row is not null", r); + cs2 = r.getRowStyle(); + assertEquals("FillForegroundColor for row: ", cs2.getFillForegroundColor(), (short) 0x0); + assertEquals("FillPattern for row: ", cs2.getFillPattern(), (short) 0x1); + } + } + + public static void main(String [] ignored_args) + { + System.out + .println("Testing org.apache.poi.hssf.usermodel.HSSFCellStyle"); + junit.textui.TestRunner.run(TestCellStyle.class); + } +}