diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index 000cf9cadb..8f4ffbf828 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -12,6 +12,10 @@ + + Bugzilla Bug 29976 [PATCH] HSSF hyperlink formula size problem + + Outlining support 27574 - [PATCH] HSSFDateUtil.getExcelDate() is one hour off when DST changes diff --git a/src/examples/src/org/apache/poi/hssf/usermodel/examples/HyperlinkFormula.java b/src/examples/src/org/apache/poi/hssf/usermodel/examples/HyperlinkFormula.java new file mode 100644 index 0000000000..1df386c365 --- /dev/null +++ b/src/examples/src/org/apache/poi/hssf/usermodel/examples/HyperlinkFormula.java @@ -0,0 +1,51 @@ + +/* ==================================================================== + Copyright 2002-2004 Apache Software Foundation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + + +package org.apache.poi.hssf.usermodel.examples; + +import org.apache.poi.hssf.usermodel.*; + +import java.io.FileOutputStream; +import java.io.IOException; + +/** + * Test if hyperlink formula, with url that got more than 127 charaters, works + * + * @author Bernard Chesnoy + */ +public class HyperlinkFormula +{ + public static void main(String[] args) + throws IOException + { + HSSFCell cell; + + HSSFWorkbook wb = new HSSFWorkbook(); + HSSFSheet sheet = wb.createSheet("new sheet"); + HSSFRow row = sheet.createRow((short) 0); + + cell = row.createCell((short)0); + cell.setCellType(HSSFCell.CELL_TYPE_FORMULA); + cell.setCellFormula("HYPERLINK(\"http://127.0.0.1:8080/toto/truc/index.html?test=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\", \"test\")"); + + FileOutputStream fileOut = new FileOutputStream("workbook.xls"); + wb.write(fileOut); + fileOut.close(); + + } +} diff --git a/src/java/org/apache/poi/hssf/record/formula/StringPtg.java b/src/java/org/apache/poi/hssf/record/formula/StringPtg.java index 18da5f5d9f..35e71198c8 100644 --- a/src/java/org/apache/poi/hssf/record/formula/StringPtg.java +++ b/src/java/org/apache/poi/hssf/record/formula/StringPtg.java @@ -25,6 +25,7 @@ import org.apache.poi.util.StringUtil; * Stores a String value in a formula value stored in the format char[] * @author Werner Froidevaux * @author Jason Height (jheight at chariot dot net dot au) + * @author Bernard Chesnoy */ public class StringPtg @@ -34,7 +35,7 @@ public class StringPtg public final static byte sid = 0x17; //NOTE: OO doc says 16bit lenght, but BiffViewer says 8 // Book says something totally different, so dont look there! - byte field_1_length; + int field_1_length; byte field_2_options; BitField fHighByte = new BitField(0x01); private String field_3_string; @@ -47,14 +48,14 @@ public class StringPtg public StringPtg(byte [] data, int offset) { offset++; - field_1_length = data[offset]; + field_1_length = data[offset] & 0xFF; field_2_options = data[offset+1]; if (fHighByte.isSet(field_2_options)) { - field_3_string= StringUtil.getFromUnicodeBE(data,offset+2,field_1_length); + field_3_string= StringUtil.getFromUnicodeLE(data,offset+2,field_1_length); }else { field_3_string=StringUtil.getFromCompressedUnicode(data,offset+2,field_1_length); } - + //setValue(new String(data, offset+3, data[offset+1] + 256*data[offset+2])); } @@ -70,7 +71,7 @@ public class StringPtg this.field_2_options=0; this.fHighByte.setBoolean(field_2_options, false); this.field_3_string=value; - this.field_1_length=(byte)value.length(); //for the moment, we support only ASCII strings in formulas we create + this.field_1_length=value.length(); //for the moment, we support only ASCII strings in formulas we create } /* @@ -88,7 +89,7 @@ public class StringPtg public void writeBytes(byte [] array, int offset) { array[ offset + 0 ] = sid; - array[ offset + 1 ] = field_1_length; + array[ offset + 1 ] = (byte)field_1_length; array[ offset + 2 ] = field_2_options; if (fHighByte.isSet(field_2_options)) { StringUtil.putUnicodeLE(getValue(),array,offset+3); @@ -101,7 +102,7 @@ public class StringPtg { if (fHighByte.isSet(field_2_options)) { return 2*field_1_length+3; - }else { + } else { return field_1_length+3; } } @@ -123,3 +124,4 @@ public class StringPtg } } +