Author: nick Date: Tue Jan 8 09:49:08 2008 New Revision: 610082 URL: http://svn.apache.org/viewvc?rev=610082&view=rev Log: Support for unicode named named ranges (patch and test from bug #42033)
Modified: poi/trunk/src/documentation/content/xdocs/changes.xml poi/trunk/src/documentation/content/xdocs/status.xml poi/trunk/src/java/org/apache/poi/hssf/record/NameRecord.java poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestNamedRange.java Modified: poi/trunk/src/documentation/content/xdocs/changes.xml URL: http://svn.apache.org/viewvc/poi/trunk/src/documentation/content/xdocs/changes.xml?rev=610082&r1=610081&r2=610082&view=diff ============================================================================== --- poi/trunk/src/documentation/content/xdocs/changes.xml (original) +++ poi/trunk/src/documentation/content/xdocs/changes.xml Tue Jan 8 09:49:08 2008 @@ -36,6 +36,7 @@ <!-- Don't forget to update status.xml too! --> <release version="3.0.2-FINAL" date="2008-??-??"> + <action dev="POI-DEVELOPERS" type="add">42033 - Add support for named ranges with unicode names</action> <action dev="POI-DEVELOPERS" type="add">34023 - When shifting rows, update formulas on that sheet to point to the new location of those rows</action> <action dev="POI-DEVELOPERS" type="add">Support getting all the cells referenced by an AreaReference, not just the corner ones</action> <action dev="POI-DEVELOPERS" type="add">43510 - Add support for named ranges in formulas, including non-contiguous named ranges</action> Modified: poi/trunk/src/documentation/content/xdocs/status.xml URL: http://svn.apache.org/viewvc/poi/trunk/src/documentation/content/xdocs/status.xml?rev=610082&r1=610081&r2=610082&view=diff ============================================================================== --- poi/trunk/src/documentation/content/xdocs/status.xml (original) +++ poi/trunk/src/documentation/content/xdocs/status.xml Tue Jan 8 09:49:08 2008 @@ -33,6 +33,7 @@ <!-- Don't forget to update changes.xml too! --> <changes> <release version="3.0.2-FINAL" date="2008-??-??"> + <action dev="POI-DEVELOPERS" type="add">42033 - Add support for named ranges with unicode names</action> <action dev="POI-DEVELOPERS" type="add">34023 - When shifting rows, update formulas on that sheet to point to the new location of those rows</action> <action dev="POI-DEVELOPERS" type="add">Support getting all the cells referenced by an AreaReference, not just the corner ones</action> <action dev="POI-DEVELOPERS" type="add">43510 - Add support for named ranges in formulas, including non-contiguous named ranges</action> Modified: poi/trunk/src/java/org/apache/poi/hssf/record/NameRecord.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/NameRecord.java?rev=610082&r1=610081&r2=610082&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/hssf/record/NameRecord.java (original) +++ poi/trunk/src/java/org/apache/poi/hssf/record/NameRecord.java Tue Jan 8 09:49:08 2008 @@ -270,6 +270,9 @@ */ public void setNameText(String name){ field_12_name_text = name; + setCompressedUnicodeFlag( + StringUtil.hasMultibyte(name) ? (byte)1 : (byte)0 + ); } // public void setNameDefintion(String definition){ @@ -318,12 +321,24 @@ return field_2_keyboard_shortcut ; } - /** gets the name length + /** + * gets the name length, in characters * @return name length */ public byte getNameTextLength(){ return field_3_length_name_text; } + + /** + * gets the name length, in bytes + * @return raw name length + */ + public byte getRawNameTextLength(){ + if( (field_11_compressed_unicode_flag & 0x01) == 1 ) { + return (byte)(2 * field_3_length_name_text); + } + return field_3_length_name_text; + } /** get the definition length * @return definition length @@ -511,27 +526,16 @@ data[17 + offset] = getStatusBarLength(); data[18 + offset] = getCompressedUnicodeFlag(); - /* temp: gjs - if (isBuiltInName()) - { - LittleEndian.putShort( data, 2 + offset, (short) ( 16 + field_13_raw_name_definition.length ) ); - - data[19 + offset] = field_12_builtIn_name; - System.arraycopy( field_13_raw_name_definition, 0, data, 20 + offset, field_13_raw_name_definition.length ); - - return 20 + field_13_raw_name_definition.length; - } - else - { */ - int start_of_name_definition = 19 + field_3_length_name_text; if (this.isBuiltInName()) { //can send the builtin name directly in data [19 + offset] = this.getBuiltInName(); + } else if ((this.getCompressedUnicodeFlag() & 0x01) == 1) { + StringUtil.putUnicodeLE( getNameText(), data, 19 + offset ); + start_of_name_definition = 19 + (2 * field_3_length_name_text); } else { StringUtil.putCompressedUnicode( getNameText(), data, 19 + offset ); - } @@ -554,15 +558,15 @@ /* } */ } - /** gets the length of all texts + /** + * Gets the length of all texts, in bytes * @return total length */ public int getTextsLength(){ int result; - result = getNameTextLength() + getDescriptionTextLength() + - getHelpTopicLength() + getStatusBarLength(); - + result = getRawNameTextLength() + getDescriptionTextLength() + + getHelpTopicLength() + getStatusBarLength(); return result; } Modified: poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestNamedRange.java URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestNamedRange.java?rev=610082&r1=610081&r2=610082&view=diff ============================================================================== --- poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestNamedRange.java (original) +++ poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestNamedRange.java Tue Jan 8 09:49:08 2008 @@ -26,6 +26,8 @@ import org.apache.poi.poifs.filesystem.POIFSFileSystem; import org.apache.poi.util.TempFile; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; @@ -316,7 +318,23 @@ assertTrue("Name is "+nm2.getNameName(),"RangeTest2".equals(nm2.getNameName())); assertTrue("Reference is "+nm2.getReference(),(wb.getSheetName(1)+"!$A$1:$O$21").equals(nm2.getReference())); } - + + public void testUnicodeNamedRange() throws Exception { + HSSFWorkbook workBook = new HSSFWorkbook(); + HSSFSheet sheet = workBook.createSheet("Test"); + HSSFName name = workBook.createName(); + name.setNameName("\u03B1"); + name.setReference("Test!$D$3:$E$8"); + + ByteArrayOutputStream out = new ByteArrayOutputStream(); + workBook.write(out); + + HSSFWorkbook workBook2 = new HSSFWorkbook(new ByteArrayInputStream(out.toByteArray())); + HSSFName name2 = workBook2.getNameAt(0); + + assertEquals("\u03B1", name2.getNameName()); + assertEquals("Test!$D$3:$E$8", name2.getReference()); + } /** * Test to see if the print areas can be retrieved/created in memory --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]