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/

Reply via email to