poi-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From bugzi...@apache.org
Subject DO NOT REPLY [Bug 43090] New: - autoSizeColumn can calculate negative sizes for the column width due to a cast from integer to short
Date Fri, 10 Aug 2007 16:21:47 GMT
DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG·
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://issues.apache.org/bugzilla/show_bug.cgi?id=43090>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND·
INSERTED IN THE BUG DATABASE.

http://issues.apache.org/bugzilla/show_bug.cgi?id=43090

           Summary: autoSizeColumn can calculate negative sizes for the
                    column width due to a cast from integer to short
           Product: POI
           Version: 3.0
          Platform: PC
        OS/Version: Windows XP
            Status: NEW
          Severity: normal
          Priority: P2
         Component: HSSF
        AssignedTo: dev@poi.apache.org
        ReportedBy: jan.dostert@sap.com


Hi, 

autoSizeColumn can calculate negative sizes for the column width due to a cast
from integer to short.

If a column is long (e.g. 3000 characters), the calculated length of
autoSizeColumn does not fit into a short any more.

HSSFSheet.autoSizeColumn(short) line: 1476	

           if (width != -1) {
                sheet.setColumnWidth(column, (short) (width * 256));
            }

e.g. width = 1668.10  

width * 256 = 1668.10 * 256 = 427033,6

which is greater than 32767 which a short can hold. Due to the cast to short
only the lower two bytes are taken into account which results in -31718.

Thus, sheet.setColumnWidth is called with an argument of -31718 and sets the
width to a negative value.

Maybe a check like 

if (width > Short.MAX_VALUE) {
     width = Short.MAX_VALUE;
}

would already help.

Attached a small test case which reproduces the problem.

import java.io.FileOutputStream;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

public class AutoSizeColumn {

    public static void main(String args[]) throws Exception {

        HSSFWorkbook workBook = new HSSFWorkbook();
        HSSFSheet sheet = workBook.createSheet();
        
        HSSFRow row = sheet.createRow(0);
        HSSFCell cell = row.createCell((short)0);

        int size = 3000;
        
        StringBuffer value = new StringBuffer(size);
        for (int i = 0; i < size; i++) {
            value.append(".");
        }
        
        cell.setCellValue(new HSSFRichTextString(value.toString()));
        
        sheet.autoSizeColumn((short)0);
        int width = sheet.getColumnWidth((short)0);
        
        if (width < 0) {
            System.out.println("width < 0");
        }
        
        workBook.write(new FileOutputStream("foo.xls"));
    }
}

Regards,
Jan

-- 
Configure bugmail: http://issues.apache.org/bugzilla/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug, or are watching the assignee.

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@poi.apache.org
For additional commands, e-mail: dev-help@poi.apache.org


Mime
View raw message