diff --git a/module.xml b/module.xml index 56fc2c43d..fbcfd590c 100644 --- a/module.xml +++ b/module.xml @@ -58,7 +58,7 @@ diff --git a/src/contrib/lib/commons-beanutils.jar b/src/contrib/lib/commons-beanutils.jar new file mode 100644 index 000000000..15e40d9ef Binary files /dev/null and b/src/contrib/lib/commons-beanutils.jar differ diff --git a/src/contrib/lib/commons-lang-1.0-b1.jar b/src/contrib/lib/commons-lang-1.0-b1.jar new file mode 100644 index 000000000..069d3c291 Binary files /dev/null and b/src/contrib/lib/commons-lang-1.0-b1.jar differ diff --git a/src/contrib/src/org/apache/poi/hssf/usermodel/contrib/HSSFCellUtil.java b/src/contrib/src/org/apache/poi/hssf/usermodel/contrib/HSSFCellUtil.java new file mode 100644 index 000000000..3acd6dfc9 --- /dev/null +++ b/src/contrib/src/org/apache/poi/hssf/usermodel/contrib/HSSFCellUtil.java @@ -0,0 +1,268 @@ + +/* + * ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2002 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache POI" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache POI", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +package org.apache.poi.hssf.usermodel.contrib; + +import java.util.*; + +import org.apache.poi.hssf.usermodel.HSSFCellStyle; +import org.apache.poi.hssf.usermodel.HSSFFont; +import org.apache.poi.hssf.usermodel.HSSFCell; +import org.apache.poi.hssf.usermodel.HSSFRow; +import org.apache.poi.hssf.usermodel.HSSFSheet; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; + +import org.apache.commons.beanutils.PropertyUtils; +import org.apache.commons.lang.exception.NestableException; +import org.apache.commons.lang.StringUtils; +/** + * Various utility functions that make working with a cells and rows easier. The various + * methods that deal with style's allow you to create your HSSFCellStyles as you need them. + * When you apply a style change to a cell, the code will attempt to see if a style already + * exists that meets your needs. If not, then it will create a new style. This is to prevent + * creating too many styles. there is an upper limit in Excel on the number of styles that + * can be supported. + * + *@author Eric Pugh epugh@upstate.com + *@created July 29, 2002 + */ + +public class HSSFCellUtil { + private static HashMap unicodeMappings = new HashMap(); + + + /** + * Get a row from the spreadsheet, and create it if it doesn't exist. + * + *@param rowCounter The 0 based row number + *@param sheet The sheet that the row is part of. + *@return The row indicated by the rowCounter + */ + public static HSSFRow getRow( int rowCounter, HSSFSheet sheet ) { + HSSFRow row = sheet.getRow( (short) rowCounter ); + if ( row == null ) { + row = sheet.createRow( (short) rowCounter ); + } + return row; + } + + /** + * Get a specific cell from a row. If the cell doesn't exist, then create it. + * + *@param row The row that the cell is part of + *@param column The column index that the cell is in. + *@return The cell indicated by the column. + */ + public static HSSFCell getCell( HSSFRow row, int column ) { + HSSFCell cell = row.getCell( (short) column ); + if ( cell == null ) { + cell = row.createCell( (short) column ); + } + return cell; + } + + + /** + * Creates a cell, gives it a value, and applies a style if provided + * + *@param row the row to create the cell in + *@param column the column index to create the cell in + *@param value The value of the cell + *@param style If the style is not null, then set + *@return A new HSSFCell + */ + public static HSSFCell createCell( HSSFRow row, int column, String value, HSSFCellStyle style ) { + HSSFCell cell = getCell( row, column ); + + cell.setCellValue( value ); + if ( style != null ) { + cell.setCellStyle( style ); + } + return cell; + } + + /** + * Create a cell, and give it a value. + * + *@param row the row to create the cell in + *@param column the column index to create the cell in + *@param value The value of the cell + *@return A new HSSFCell. + */ + public static HSSFCell createCell( HSSFRow row, int column, String value ) { + return createCell( row, column, value, null ); + } + + /** + * Take a cell, and align it. + * + *@param cell the cell to set the alignment for + *@param workbook The workbook that is being worked with. + *@param align the column alignment to use. + *@return The HSSFCell aligned. + *@exception NestableException Thrown if an error happens. + */ + public static void setAlignment(HSSFCell cell, HSSFWorkbook workbook, short align) throws NestableException { + setCellStyleProperty(cell, workbook, "alignment", new Short(align) ); + + } + + /** + * Take a cell, and apply a font to it + * + *@param cell the cell to set the alignment for + *@param workbook The workbook that is being worked with. + *@param font The HSSFFont that you want to set... + *@return The HSSFCell with the font + *@exception NestableException Thrown if an error happens. + */ + public static void setFont(HSSFCell cell, HSSFWorkbook workbook, HSSFFont font) throws NestableException { + setCellStyleProperty(cell, workbook, "font", font ); + + } + /** + * This method attempt to find an already existing HSSFCellStyle that matches + * what you want the style to be. If it does not find the style, then it + * creates a new one. If it does create a new one, then it applyies the + * propertyName and propertyValue to the style. This is nessasary because + * Excel has an upper limit on the number of Styles that it supports. + * + *@param workbook The workbook that is being worked with. + *@param propertyName The name of the property that is to be + * changed. + *@param propertyValue The value of the property that is to be + * changed. + *@param cell The cell that needs it's style changes + *@exception NestableException Thrown if an error happens. + */ + public static void setCellStyleProperty( HSSFCell cell, HSSFWorkbook workbook, String propertyName, Object propertyValue ) + throws NestableException { + try { + HSSFCellStyle originalStyle = cell.getCellStyle(); + HSSFCellStyle newStyle = null; + Map values = PropertyUtils.describe( originalStyle ); + values.put( propertyName, propertyValue ); + values.remove( "index" ); + // index seems like what index the cellstyle is in the list of styles for a workbook. + // not good to compare on! + + short numberCellStyles = workbook.getNumCellStyles(); + + for ( short i = 0; i < numberCellStyles; i++ ) { + HSSFCellStyle wbStyle = workbook.getCellStyleAt( i ); + Map wbStyleMap = PropertyUtils.describe( wbStyle ); + wbStyleMap.remove( "index" ); + + if ( wbStyleMap.equals( values ) ) { + newStyle = wbStyle; + break; + } + } + + if ( newStyle == null ) { + newStyle = workbook.createCellStyle(); + newStyle.setFont( workbook.getFontAt( originalStyle.getFontIndex() ) ); + PropertyUtils.copyProperties( newStyle, originalStyle ); + PropertyUtils.setProperty( newStyle, propertyName, propertyValue ); + } + + cell.setCellStyle( newStyle ); + } + catch ( Exception e ) { + e.printStackTrace(); + throw new NestableException( "Couldn't setCellStyleProperty.", e ); + } + } + + + /** + * Looks for text in the cell that should be unicode, like α and provides the + * unicode version of it. + * + *@param cell The cell to check for unicode values + *@return transalted to unicode + */ + public static HSSFCell translateUnicodeValues( HSSFCell cell ) { + String s = cell.getStringCellValue(); + boolean foundUnicode = false; + + for ( Iterator i = unicodeMappings.entrySet().iterator(); i.hasNext(); ) { + Map.Entry entry = (Map.Entry) i.next(); + String key = (String) entry.getKey(); + if ( s.toLowerCase().indexOf( key ) != -1 ) { + s = StringUtils.replace( s, key, "" + entry.getValue().toString() + "" ); + foundUnicode = true; + } + + } + + if ( foundUnicode ) { + + cell.setEncoding( HSSFCell.ENCODING_UTF_16 ); + cell.setCellValue( s ); + } + return cell; + } + + + static { + unicodeMappings.put( "α", "\u03B1" ); + unicodeMappings.put( "γ", "\u03B3" ); + unicodeMappings.put( "θ", "\u03B8" ); + + } + +} + diff --git a/src/contrib/src/org/apache/poi/hssf/usermodel/contrib/HSSFRegionUtil.java b/src/contrib/src/org/apache/poi/hssf/usermodel/contrib/HSSFRegionUtil.java new file mode 100644 index 000000000..e64f2879c --- /dev/null +++ b/src/contrib/src/org/apache/poi/hssf/usermodel/contrib/HSSFRegionUtil.java @@ -0,0 +1,266 @@ + +/* + * ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2002 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache POI" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache POI", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +package org.apache.poi.hssf.usermodel.contrib; + +import org.apache.log4j.Category; + +import org.apache.poi.hssf.usermodel.HSSFCellStyle; +import org.apache.poi.hssf.usermodel.HSSFCell; +import org.apache.poi.hssf.usermodel.HSSFRow; +import org.apache.poi.hssf.usermodel.HSSFSheet; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; + +import org.apache.poi.hssf.util.Region; + +import org.apache.commons.lang.exception.NestableException; + +/** + * Various utility functions that make working with a region of cells easier. + * + *@author Eric Pugh epugh@upstate.com + *@created July 29, 2002 + */ + +public class HSSFRegionUtil { + private static Category log = Category.getInstance( HSSFRegionUtil.class.getName() ); + + /** Constructor for the HSSFRegionUtil object */ + public HSSFRegionUtil() { } + + /** + * Sets the left border for a region of cells by manipulating the cell style + * of the indidual cells on the left + * + *@param border The new border + *@param region The region that should have the border + *@param workbook The workbook that the region is on. + *@param sheet The sheet that the region is on. + *@exception NestableException Thrown if the CellStyle can't be changed + */ + public static void setBorderLeft( short border, Region region, HSSFSheet sheet, HSSFWorkbook workbook ) + throws NestableException { + int rowStart = region.getRowFrom(); + int rowEnd = region.getRowTo(); + int column = region.getColumnFrom(); + + for ( int i = rowStart; i <= rowEnd; i++ ) { + HSSFRow row = HSSFCellUtil.getRow( i, sheet ); + HSSFCell cell = HSSFCellUtil.getCell( row, column ); + HSSFCellUtil.setCellStyleProperty( cell, workbook, "borderLeft", new Short( border ) ); + } + } + + /** + * Sets the leftBorderColor attribute of the HSSFRegionUtil object + * + *@param color The color of the border + *@param region The region that should have the border + *@param workbook The workbook that the region is on. + *@param sheet The sheet that the region is on. + *@exception NestableException Thrown if the CellStyle can't be changed + * properly. + */ + public static void setLeftBorderColor( short color, Region region, HSSFSheet sheet, HSSFWorkbook workbook ) + throws NestableException { + int rowStart = region.getRowFrom(); + int rowEnd = region.getRowTo(); + int column = region.getColumnFrom(); + + for ( int i = rowStart; i <= rowEnd; i++ ) { + HSSFRow row = HSSFCellUtil.getRow( i, sheet ); + HSSFCell cell = HSSFCellUtil.getCell( row, column ); + HSSFCellUtil.setCellStyleProperty( cell, workbook, "leftBorderColor", new Short( color ) ); + } + } + + /** + * Sets the borderRight attribute of the HSSFRegionUtil object + * + *@param border The new border + *@param region The region that should have the border + *@param workbook The workbook that the region is on. + *@param sheet The sheet that the region is on. + *@exception NestableException Thrown if the CellStyle can't be changed + */ + public static void setBorderRight( short border, Region region, HSSFSheet sheet, HSSFWorkbook workbook ) + throws NestableException { + int rowStart = region.getRowFrom(); + int rowEnd = region.getRowTo(); + int column = region.getColumnTo(); + + for ( int i = rowStart; i <= rowEnd; i++ ) { + HSSFRow row = HSSFCellUtil.getRow( i, sheet ); + HSSFCell cell = HSSFCellUtil.getCell( row, column ); + + HSSFCellUtil.setCellStyleProperty( cell, workbook, "borderRight", new Short( border ) ); + } + } + + /** + * Sets the rightBorderColor attribute of the HSSFRegionUtil object + * + *@param color The color of the border + *@param region The region that should have the border + *@param workbook The workbook that the region is on. + *@param sheet The sheet that the region is on. + *@exception NestableException Thrown if the CellStyle can't be changed + * properly. + */ + public static void setRightBorderColor( short color, Region region, HSSFSheet sheet, HSSFWorkbook workbook ) + throws NestableException { + int rowStart = region.getRowFrom(); + int rowEnd = region.getRowTo(); + int column = region.getColumnTo(); + + for ( int i = rowStart; i <= rowEnd; i++ ) { + HSSFRow row = HSSFCellUtil.getRow( i, sheet ); + HSSFCell cell = HSSFCellUtil.getCell( row, column ); + HSSFCellUtil.setCellStyleProperty( cell, workbook, "rightBorderColor", new Short( color ) ); + } + } + + /** + * Sets the borderBottom attribute of the HSSFRegionUtil object + * + *@param border The new border + *@param region The region that should have the border + *@param workbook The workbook that the region is on. + *@param sheet The sheet that the region is on. + *@exception NestableException Thrown if the CellStyle can't be changed + */ + public static void setBorderBottom( short border, Region region, HSSFSheet sheet, HSSFWorkbook workbook ) + throws NestableException { + int colStart = region.getColumnFrom(); + int colEnd = region.getColumnTo(); + int rowIndex = region.getRowTo(); + HSSFRow row = HSSFCellUtil.getRow( rowIndex, sheet ); + for ( int i = colStart; i <= colEnd; i++ ) { + + HSSFCell cell = HSSFCellUtil.getCell( row, i ); + HSSFCellUtil.setCellStyleProperty( cell, workbook, "borderBottom", new Short( border ) ); + } + } + + /** + * Sets the bottomBorderColor attribute of the HSSFRegionUtil object + * + *@param color The color of the border + *@param region The region that should have the border + *@param workbook The workbook that the region is on. + *@param sheet The sheet that the region is on. + *@exception NestableException Thrown if the CellStyle can't be changed + * properly. + */ + public static void setBottomBorderColor( short color, Region region, HSSFSheet sheet, HSSFWorkbook workbook ) + throws NestableException { + int colStart = region.getColumnFrom(); + int colEnd = region.getColumnTo(); + int rowIndex = region.getRowTo(); + HSSFRow row = HSSFCellUtil.getRow( rowIndex, sheet ); + for ( int i = colStart; i <= colEnd; i++ ) { + HSSFCell cell = HSSFCellUtil.getCell( row, i ); + HSSFCellUtil.setCellStyleProperty( cell, workbook, "bottomBorderColor", new Short( color ) ); + } + } + + + /** + * Sets the borderBottom attribute of the HSSFRegionUtil object + * + *@param border The new border + *@param region The region that should have the border + *@param workbook The workbook that the region is on. + *@param sheet The sheet that the region is on. + *@exception NestableException Thrown if the CellStyle can't be changed + */ + public static void setBorderTop( short border, Region region, HSSFSheet sheet, HSSFWorkbook workbook ) + throws NestableException { + int colStart = region.getColumnFrom(); + int colEnd = region.getColumnTo(); + int rowIndex = region.getRowFrom(); + HSSFRow row = HSSFCellUtil.getRow( rowIndex, sheet ); + for ( int i = colStart; i <= colEnd; i++ ) { + + HSSFCell cell = HSSFCellUtil.getCell( row, i ); + HSSFCellUtil.setCellStyleProperty( cell, workbook, "borderTop", new Short( border ) ); + } + } + + /** + * Sets the topBorderColor attribute of the HSSFRegionUtil object + * + *@param color The color of the border + *@param region The region that should have the border + *@param workbook The workbook that the region is on. + *@param sheet The sheet that the region is on. + *@exception NestableException Thrown if the CellStyle can't be changed + * properly. + */ + public static void setTopBorderColor( short color, Region region, HSSFSheet sheet, HSSFWorkbook workbook ) + throws NestableException { + int colStart = region.getColumnFrom(); + int colEnd = region.getColumnTo(); + int rowIndex = region.getRowFrom(); + HSSFRow row = HSSFCellUtil.getRow( rowIndex, sheet ); + for ( int i = colStart; i <= colEnd; i++ ) { + HSSFCell cell = HSSFCellUtil.getCell( row, i ); + HSSFCellUtil.setCellStyleProperty( cell, workbook, "topBorderColor", new Short( color ) ); + + } + } + +} +