Author: jheight Date: Tue Jan 3 03:41:36 2006 New Revision: 365609 URL: http://svn.apache.org/viewcvs?rev=365609&view=rev Log: Fixes to Unicode support. Believe that most unicode issues are now fixed. Bug 37622 & Bug 22873 squashed.
Added: jakarta/poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestUnicodeWorkbook.java Modified: jakarta/poi/trunk/src/java/org/apache/poi/hssf/model/Workbook.java jakarta/poi/trunk/src/java/org/apache/poi/hssf/record/formula/StringPtg.java jakarta/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFCell.java jakarta/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java jakarta/poi/trunk/src/testcases/org/apache/poi/hssf/record/TestBoundSheetRecord.java jakarta/poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFWorkbook.java Modified: jakarta/poi/trunk/src/java/org/apache/poi/hssf/model/Workbook.java URL: http://svn.apache.org/viewcvs/jakarta/poi/trunk/src/java/org/apache/poi/hssf/model/Workbook.java?rev=365609&r1=365608&r2=365609&view=diff ============================================================================== --- jakarta/poi/trunk/src/java/org/apache/poi/hssf/model/Workbook.java (original) +++ jakarta/poi/trunk/src/java/org/apache/poi/hssf/model/Workbook.java Tue Jan 3 03:41:36 2006 @@ -457,10 +457,11 @@ * @param sheetnum the sheet number (0 based) * @param sheetname the name for the sheet */ - - // for compatibility public void setSheetName(int sheetnum, String sheetname ) { - setSheetName( sheetnum, sheetname, (byte)0 ); + checkSheets(sheetnum); + BoundSheetRecord sheet = (BoundSheetRecord)boundsheets.get( sheetnum ); + sheet.setSheetname(sheetname); + sheet.setSheetnameLength( (byte)sheetname.length() ); } /** @@ -481,6 +482,14 @@ return false; } + /** + * sets the name for a given sheet forcing the encoding. This is STILL A BAD IDEA. + * Poi now automatically detects unicode + * + [EMAIL PROTECTED] 3-Jan-06 Simply use setSheetNam e(int sheetnum, String sheetname) + * @param sheetnum the sheet number (0 based) + * @param sheetname the name for the sheet + */ public void setSheetName(int sheetnum, String sheetname, short encoding ) { checkSheets(sheetnum); BoundSheetRecord sheet = (BoundSheetRecord)boundsheets.get( sheetnum ); Modified: jakarta/poi/trunk/src/java/org/apache/poi/hssf/record/formula/StringPtg.java URL: http://svn.apache.org/viewcvs/jakarta/poi/trunk/src/java/org/apache/poi/hssf/record/formula/StringPtg.java?rev=365609&r1=365608&r2=365609&view=diff ============================================================================== --- jakarta/poi/trunk/src/java/org/apache/poi/hssf/record/formula/StringPtg.java (original) +++ jakarta/poi/trunk/src/java/org/apache/poi/hssf/record/formula/StringPtg.java Tue Jan 3 03:41:36 2006 @@ -69,8 +69,8 @@ if (value.length() >255) { throw new IllegalArgumentException("String literals in formulas cant be bigger than 255 characters ASCII"); } - this.field_2_options=0; - this.fHighByte.setBoolean(field_2_options, false); + this.field_2_options=0; + field_2_options = (byte)this.fHighByte.setBoolean(field_2_options, StringUtil.hasMultibyte(value)); this.field_3_string=value; this.field_1_length=value.length(); //for the moment, we support only ASCII strings in formulas we create } Modified: jakarta/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFCell.java URL: http://svn.apache.org/viewcvs/jakarta/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFCell.java?rev=365609&r1=365608&r2=365609&view=diff ============================================================================== --- jakarta/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFCell.java (original) +++ jakarta/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFCell.java Tue Jan 3 03:41:36 2006 @@ -381,13 +381,13 @@ int sst = 0; UnicodeString str = getRichStringCellValue().getUnicodeString(); - if (encoding == ENCODING_COMPRESSED_UNICODE) - { - str.setCompressedUnicode(); - } else if (encoding == ENCODING_UTF_16) - { - str.setUncompressedUnicode(); - } +//jmh if (encoding == ENCODING_COMPRESSED_UNICODE) +//jmh { +// jmh str.setCompressedUnicode(); +// jmh } else if (encoding == ENCODING_UTF_16) +// jmh { +// jmh str.setUncompressedUnicode(); +// jmh } sst = book.addSSTString(str); lrec.setSSTIndex(sst); getRichStringCellValue().setUnicodeString(book.getSSTString(sst)); @@ -572,13 +572,13 @@ int index = 0; UnicodeString str = value.getUnicodeString(); - if (encoding == ENCODING_COMPRESSED_UNICODE) - { - str.setCompressedUnicode(); - } else if (encoding == ENCODING_UTF_16) - { - str.setUncompressedUnicode(); - } +// jmh if (encoding == ENCODING_COMPRESSED_UNICODE) +// jmh { +// jmh str.setCompressedUnicode(); +// jmh } else if (encoding == ENCODING_UTF_16) +// jmh { +// jmh str.setUncompressedUnicode(); +// jmh } index = book.addSSTString(str); (( LabelSSTRecord ) record).setSSTIndex(index); stringValue = value; @@ -856,6 +856,8 @@ * @see #ENCODING_UTF_16 * * @return -1, 1 or 0 for unchanged, compressed or uncompressed (used only with String type) + * + * @deprecated As of 3-Jan-06 POI now automatically handles Unicode without forcing the encoding. */ public short getEncoding() { @@ -870,6 +872,7 @@ * @see #ENCODING_UTF_16 * * @param encoding either ENCODING_COMPRESSED_UNICODE (0) or ENCODING_UTF_16 (1) + * @deprecated As of 3-Jan-06 POI now automatically handles Unicode without forcing the encoding. */ public void setEncoding(short encoding) Modified: jakarta/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java URL: http://svn.apache.org/viewcvs/jakarta/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java?rev=365609&r1=365608&r2=365609&view=diff ============================================================================== --- jakarta/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java (original) +++ jakarta/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java Tue Jan 3 03:41:36 2006 @@ -339,7 +339,15 @@ return workbook.getWindowOne().getDisplayedTab(); } + /** + * @deprecated POI will now properly handle unicode strings without + * forceing an encoding + */ public final static byte ENCODING_COMPRESSED_UNICODE = 0; + /** + * @deprecated POI will now properly handle unicode strings without + * forceing an encoding + */ public final static byte ENCODING_UTF_16 = 1; @@ -354,9 +362,23 @@ if (workbook.doesContainsSheetName( name, sheet )) throw new IllegalArgumentException( "The workbook already contains a sheet with this name" ); - workbook.setSheetName( sheet, name, ENCODING_COMPRESSED_UNICODE ); + if (sheet > (sheets.size() - 1)) + { + throw new RuntimeException("Sheet out of bounds"); + } + + workbook.setSheetName( sheet, name); } + + /** + * set the sheet name forcing the encoding. Forcing the encoding IS A BAD IDEA!!! + * @deprecated 3-Jan-2006 POI now automatically detects unicode and sets the encoding + * appropriately. Simply use setSheetName(int sheet, String encoding) + * @throws IllegalArgumentException if the name is greater than 31 chars + * or contains /\?*[] + * @param sheet number (0 based) + */ public void setSheetName( int sheet, String name, short encoding ) { if (workbook.doesContainsSheetName( name, sheet )) Modified: jakarta/poi/trunk/src/testcases/org/apache/poi/hssf/record/TestBoundSheetRecord.java URL: http://svn.apache.org/viewcvs/jakarta/poi/trunk/src/testcases/org/apache/poi/hssf/record/TestBoundSheetRecord.java?rev=365609&r1=365608&r2=365609&view=diff ============================================================================== --- jakarta/poi/trunk/src/testcases/org/apache/poi/hssf/record/TestBoundSheetRecord.java (original) +++ jakarta/poi/trunk/src/testcases/org/apache/poi/hssf/record/TestBoundSheetRecord.java Tue Jan 3 03:41:36 2006 @@ -49,9 +49,8 @@ public void testWideRecordLength() throws Exception { - BoundSheetRecord record = new BoundSheetRecord(); - record.setCompressedUnicodeFlag((byte)0x01); - record.setSheetname("Sheet1"); + BoundSheetRecord record = new BoundSheetRecord(); + record.setSheetname("Sheet\u20ac"); record.setSheetnameLength((byte)6); assertEquals(" 2 + 2 + 4 + 2 + 1 + 1 + len(str) * 2", 24, record.getRecordSize()); Modified: jakarta/poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFWorkbook.java URL: http://svn.apache.org/viewcvs/jakarta/poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFWorkbook.java?rev=365609&r1=365608&r2=365609&view=diff ============================================================================== --- jakarta/poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFWorkbook.java (original) +++ jakarta/poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFWorkbook.java Tue Jan 3 03:41:36 2006 @@ -46,15 +46,15 @@ try { - b.setSheetName( 3, "name1", HSSFWorkbook.ENCODING_UTF_16 ); + b.setSheetName( 3, "name1"/*JMH, HSSFWorkbook.ENCODING_UTF_16*/ ); fail(); } catch ( IllegalArgumentException pass ) { } - b.setSheetName( 3, "name2", HSSFWorkbook.ENCODING_UTF_16 ); - b.setSheetName( 3, "name2", HSSFWorkbook.ENCODING_UTF_16 ); + b.setSheetName( 3, "name2"/*JMH, HSSFWorkbook.ENCODING_UTF_16*/ ); + b.setSheetName( 3, "name2"/*JMH, HSSFWorkbook.ENCODING_UTF_16*/ ); b.setSheetName( 3, "name2" ); HSSFWorkbook c = new HSSFWorkbook( ); Added: jakarta/poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestUnicodeWorkbook.java URL: http://svn.apache.org/viewcvs/jakarta/poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestUnicodeWorkbook.java?rev=365609&view=auto ============================================================================== --- jakarta/poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestUnicodeWorkbook.java (added) +++ jakarta/poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestUnicodeWorkbook.java Tue Jan 3 03:41:36 2006 @@ -0,0 +1,95 @@ +package org.apache.poi.hssf.usermodel; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.FileInputStream; + +import org.apache.poi.util.TempFile; + +import junit.framework.TestCase; + +public class TestUnicodeWorkbook extends TestCase { + + public TestUnicodeWorkbook(String s) { + super(s); + } + + /** Tests that all of the unicode capable string fields can be set, written and then read back + * + * + */ + public void testUnicodeInAll() throws Exception { + HSSFWorkbook wb = new HSSFWorkbook(); + //Create a unicode dataformat (contains euro symbol) + HSSFDataFormat df = wb.createDataFormat(); + final String formatStr = "_([$\u20ac-2]\\\\\\ * #,##0.00_);_([$\u20ac-2]\\\\\\ * \\\\\\(#,##0.00\\\\\\);_([$\u20ac-2]\\\\\\ *\\\"\\-\\\\\"??_);_(@_)"; + short fmt = df.getFormat(formatStr); + + //Create a unicode sheet name (euro symbol) + HSSFSheet s = wb.createSheet("\u20ac"); + + //Set a unicode header (you guessed it the euro symbol) + HSSFHeader h = s.getHeader(); + h.setCenter("\u20ac"); + h.setLeft("\u20ac"); + h.setRight("\u20ac"); + + //Set a unicode footer + HSSFFooter f = s.getFooter(); + f.setCenter("\u20ac"); + f.setLeft("\u20ac"); + f.setRight("\u20ac"); + + HSSFRow r = s.createRow(0); + HSSFCell c = r.createCell((short)1); + c.setCellValue(12.34); + c.getCellStyle().setDataFormat(fmt); + + HSSFCell c2 = r.createCell((short)2); + c.setCellValue(new HSSFRichTextString("\u20ac")); + + HSSFCell c3 = r.createCell((short)3); + String formulaString = "TEXT(12.34,\"\u20ac###,##\")"; + c3.setCellFormula(formulaString); + + + File tempFile = TempFile.createTempFile("unicode", "test.xls"); + FileOutputStream stream = new FileOutputStream(tempFile); + wb.write(stream); + + wb = null; + FileInputStream in = new FileInputStream(tempFile); + wb = new HSSFWorkbook(in); + + //Test the sheetname + s = wb.getSheet("\u20ac"); + assertNotNull(s); + + //Test the header + h = s.getHeader(); + assertEquals(h.getCenter(), "\u20ac"); + assertEquals(h.getLeft(), "\u20ac"); + assertEquals(h.getRight(), "\u20ac"); + + //Test the footer + f = s.getFooter(); + assertEquals(f.getCenter(), "\u20ac"); + assertEquals(f.getLeft(), "\u20ac"); + assertEquals(f.getRight(), "\u20ac"); + + //Test the dataformat + r = s.getRow(0); + c = r.getCell((short)1); + df = wb.createDataFormat(); + assertEquals(formatStr, df.getFormat(c.getCellStyle().getDataFormat())); + + //Test the cell string value + c2 = r.getCell((short)2); + assertEquals(c.getRichStringCellValue().getString(), "\u20ac"); + + //Test the cell formula + c3 = r.getCell((short)3); + assertEquals(c3.getCellFormula(), formulaString); + } + +} --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] Mailing List: http://jakarta.apache.org/site/mail2.html#poi The Apache Jakarta POI Project: http://jakarta.apache.org/poi/