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 index 3acd6dfc9b..40e83c4087 100644 --- a/src/contrib/src/org/apache/poi/hssf/usermodel/contrib/HSSFCellUtil.java +++ b/src/contrib/src/org/apache/poi/hssf/usermodel/contrib/HSSFCellUtil.java @@ -1,72 +1,69 @@ - -/* - * ==================================================================== - * The Apache Software License, Version 1.1 +/* ==================================================================== + * The Apache Software License, Version 1.1 * - * Copyright (c) 2002 The Apache Software Foundation. All rights - * reserved. + * 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: + * 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. + * 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. + * 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. + * 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. + * 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. + * 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 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 - * . + * 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; +import org.apache.commons.lang.exception.NestableException; +import org.apache.poi.hssf.usermodel.*; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + /** * 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. @@ -76,193 +73,219 @@ import org.apache.commons.lang.StringUtils; * can be supported. * *@author Eric Pugh epugh@upstate.com - *@created July 29, 2002 */ -public class HSSFCellUtil { - private static HashMap unicodeMappings = new HashMap(); +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; + /** + * 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 ); } - } - - 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; - } + return row; } - if ( foundUnicode ) { - cell.setEncoding( HSSFCell.ENCODING_UTF_16 ); - cell.setCellValue( s ); + /** + * 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; } - return cell; - } - static { - unicodeMappings.put( "α", "\u03B1" ); - unicodeMappings.put( "γ", "\u03B3" ); - unicodeMappings.put( "θ", "\u03B8" ); + /** + * 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. + *@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... + *@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" ); + } } + +