From d8f85ad2ebe0e7085bf8e89fcee16045b6e26f98 Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Tue, 25 May 2010 16:25:34 +0000 Subject: [PATCH] Fix bug #49273 - Correct handling for Font Character Sets with indicies greater than 127 git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@948089 13f79535-47bb-0310-9956-ffa450edef68 --- src/documentation/content/xdocs/status.xml | 1 + .../apache/poi/hssf/usermodel/HSSFFont.java | 24 ++++++++++++++++-- .../org/apache/poi/ss/usermodel/Font.java | 9 ++++++- .../apache/poi/xssf/usermodel/XSSFFont.java | 19 +++++++++++--- .../poi/xssf/usermodel/TestXSSFFont.java | 16 ++++++++++++ test-data/spreadsheet/49273.xlsx | Bin 0 -> 11057 bytes 6 files changed, 63 insertions(+), 6 deletions(-) create mode 100644 test-data/spreadsheet/49273.xlsx diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index 068ab153af..826937bee5 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -34,6 +34,7 @@ + 49273 - Correct handling for Font Character Sets with indicies greater than 127 49334 - Track the ValueRangeRecords of charts in HSSFChart, to allow the basic axis operations 49242 - Track the LinkDataRecords of charts in HSSFChart Improved performance of XSSFWorkbook.write diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFFont.java b/src/java/org/apache/poi/hssf/usermodel/HSSFFont.java index 58621bdc9e..4e2a2fe898 100644 --- a/src/java/org/apache/poi/hssf/usermodel/HSSFFont.java +++ b/src/java/org/apache/poi/hssf/usermodel/HSSFFont.java @@ -280,9 +280,29 @@ public final class HSSFFont implements Font { * @see #DEFAULT_CHARSET * @see #SYMBOL_CHARSET */ - public byte getCharSet() + public int getCharSet() { - return font.getCharset(); + byte charset = font.getCharset(); + if(charset >= 0) { + return (int)charset; + } else { + return charset + 256; + } + } + + /** + * set character-set to use. + * @see #ANSI_CHARSET + * @see #DEFAULT_CHARSET + * @see #SYMBOL_CHARSET + */ + public void setCharSet(int charset) + { + byte cs = (byte)charset; + if(charset > 127) { + cs = (byte)(charset-256); + } + setCharSet(cs); } /** diff --git a/src/java/org/apache/poi/ss/usermodel/Font.java b/src/java/org/apache/poi/ss/usermodel/Font.java index b9c10a8b15..ee0d8add8b 100644 --- a/src/java/org/apache/poi/ss/usermodel/Font.java +++ b/src/java/org/apache/poi/ss/usermodel/Font.java @@ -251,7 +251,7 @@ public interface Font { * @see #DEFAULT_CHARSET * @see #SYMBOL_CHARSET */ - byte getCharSet(); + int getCharSet(); /** * set character-set to use. @@ -260,6 +260,13 @@ public interface Font { * @see #SYMBOL_CHARSET */ void setCharSet(byte charset); + /** + * set character-set to use. + * @see #ANSI_CHARSET + * @see #DEFAULT_CHARSET + * @see #SYMBOL_CHARSET + */ + void setCharSet(int charset); /** * get the index within the XSSFWorkbook (sequence within the collection of Font objects) diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFont.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFont.java index 7fbbee7951..3b92c6fd35 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFont.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFont.java @@ -107,13 +107,13 @@ public class XSSFFont implements Font { /** * get character-set to use. * - * @return byte - character-set + * @return int - character-set (0-255) * @see org.apache.poi.ss.usermodel.FontCharset */ - public byte getCharSet() { + public int getCharSet() { CTIntProperty charset = _ctFont.sizeOfCharsetArray() == 0 ? null : _ctFont.getCharsetArray(0); int val = charset == null ? FontCharset.ANSI.getValue() : FontCharset.valueOf(charset.getVal()).getValue(); - return (byte)val; + return val; } @@ -293,6 +293,19 @@ public class XSSFFont implements Font { * @see FontCharset */ public void setCharSet(byte charset) { + int cs = (int)charset; + if(cs < 0) { + cs += 256; + } + setCharSet(cs); + } + /** + * set character-set to use. + * + * @param charset - charset + * @see FontCharset + */ + public void setCharSet(int charset) { CTIntProperty charsetProperty = _ctFont.sizeOfCharsetArray() == 0 ? _ctFont.addNewCharset() : _ctFont.getCharsetArray(0); switch (charset) { case Font.ANSI_CHARSET: diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFont.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFont.java index 1bcc98149e..fe8d3a588b 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFont.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFont.java @@ -19,6 +19,7 @@ package org.apache.poi.xssf.usermodel; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.XSSFITestDataProvider; +import org.apache.poi.xssf.XSSFTestDataSamples; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTBooleanProperty; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTColor; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTFont; @@ -72,6 +73,21 @@ public final class TestXSSFFont extends BaseTestFont{ xssfFont.setCharSet(FontCharset.DEFAULT); assertEquals(FontCharset.DEFAULT.getValue(),ctFont.getCharsetArray(0).getVal()); + + + // Now try with a few sample files + + // Normal charset + XSSFWorkbook workbook = XSSFTestDataSamples.openSampleWorkbook("Formatting.xlsx"); + assertEquals(0, + workbook.getSheetAt(0).getRow(0).getCell(0).getCellStyle().getFont().getCharSet() + ); + + // GB2312 charact set + workbook = XSSFTestDataSamples.openSampleWorkbook("49273.xlsx"); + assertEquals(134, + workbook.getSheetAt(0).getRow(0).getCell(0).getCellStyle().getFont().getCharSet() + ); } public void testFontName() { diff --git a/test-data/spreadsheet/49273.xlsx b/test-data/spreadsheet/49273.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..ad1ad278d954b21e64630ddd0f0681e86d4f1c1c GIT binary patch literal 11057 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 literal 0 HcmV?d00001 -- 2.39.5