You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ce...@apache.org on 2013/08/14 16:57:45 UTC

svn commit: r1513916 - in /poi/trunk/src/ooxml: java/org/apache/poi/xssf/usermodel/XSSFSheet.java testcases/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java

Author: centic
Date: Wed Aug 14 14:57:44 2013
New Revision: 1513916

URL: http://svn.apache.org/r1513916
Log:
Bug 52233: Do not make the XSSFSheet invalid during write(), I could not find out why the ColsArray was set to null in the write() method. By removing this the writing of the sheet does not invalidate the Workbook any more and makes the test case work fine.

Modified:
    poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java
    poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java?rev=1513916&r1=1513915&r2=1513916&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java Wed Aug 14 14:57:44 2013
@@ -87,7 +87,7 @@ public class XSSFSheet extends POIXMLDoc
     private Map<Integer, CTCellFormula> sharedFormulas;
     private TreeMap<String,XSSFTable> tables;
     private List<CellRangeAddress> arrayFormulas;
-    private XSSFDataValidationHelper dataValidationHelper;    
+    private XSSFDataValidationHelper dataValidationHelper;
 
     /**
      * Creates new XSSFSheet   - called by XSSFWorkbook to create a sheet from scratch.
@@ -153,7 +153,7 @@ public class XSSFSheet extends POIXMLDoc
                tables.put( p.getPackageRelationship().getId(), (XSSFTable)p );
             }
         }
-        
+
         // Process external hyperlinks for the sheet, if there are any
         initHyperlinks();
     }
@@ -170,12 +170,12 @@ public class XSSFSheet extends POIXMLDoc
     }
 
     @SuppressWarnings("deprecation") //YK: getXYZArray() array accessors are deprecated in xmlbeans with JDK 1.5 support
-    private void initRows(CTWorksheet worksheet) {
+    private void initRows(CTWorksheet worksheetParam) {
         _rows = new TreeMap<Integer, XSSFRow>();
         tables = new TreeMap<String, XSSFTable>();
         sharedFormulas = new HashMap<Integer, CTCellFormula>();
         arrayFormulas = new ArrayList<CellRangeAddress>();
-        for (CTRow row : worksheet.getSheetData().getRowArray()) {
+        for (CTRow row : worksheetParam.getSheetData().getRowArray()) {
             XSSFRow r = new XSSFRow(row, this);
             _rows.put(r.getRowNum(), r);
         }
@@ -426,7 +426,7 @@ public class XSSFSheet extends POIXMLDoc
         }
         return drawing;
     }
-    
+
     protected CTDrawing getCTDrawing() {
        return worksheet.getDrawing();
     }
@@ -480,7 +480,7 @@ public class XSSFSheet extends POIXMLDoc
         } else {
            if(pane.isSetYSplit()) pane.unsetYSplit();
         }
-        
+
         pane.setState(STPaneState.FROZEN);
         if (rowSplit == 0) {
             pane.setTopLeftCell(new CellReference(0, leftmostColumn).formatAsString());
@@ -1015,16 +1015,16 @@ public class XSSFSheet extends POIXMLDoc
     public boolean getProtect() {
         return worksheet.isSetSheetProtection() && sheetProtectionEnabled();
     }
- 
+
     /**
      * Enables sheet protection and sets the password for the sheet.
      * Also sets some attributes on the {@link CTSheetProtection} that correspond to
      * the default values used by Excel
-     * 
+     *
      * @param password to set for protection. Pass <code>null</code> to remove protection
      */
     public void protectSheet(String password) {
-        	
+
     	if(password != null) {
     		CTSheetProtection sheetProtection = worksheet.addNewSheetProtection();
     		sheetProtection.xsetPassword(stringToExcelPassword(password));
@@ -1039,7 +1039,7 @@ public class XSSFSheet extends POIXMLDoc
 	/**
 	 * Converts a String to a {@link STUnsignedShortHex} value that contains the {@link PasswordRecord#hashPassword(String)}
 	 * value in hexadecimal format
-	 *  
+	 *
 	 * @param password the password string you wish convert to an {@link STUnsignedShortHex}
 	 * @return {@link STUnsignedShortHex} that contains Excel hashed password in Hex format
 	 */
@@ -1048,7 +1048,7 @@ public class XSSFSheet extends POIXMLDoc
 		hexPassword.setStringValue(String.valueOf(HexDump.shortToHex(PasswordRecord.hashPassword(password))).substring(2));
 		return hexPassword;
 	}
-	
+
     /**
      * Returns the logical row ( 0-based).  If you ask for a row that is not
      * defined you get a null.  This is to say row 4 represents the fifth row on a sheet.
@@ -1220,7 +1220,7 @@ public class XSSFSheet extends POIXMLDoc
         worksheet.setColsArray(0,ctCols);
         setSheetFormatPrOutlineLevelCol();
     }
-    
+
     /**
      * Do not leave the width attribute undefined (see #52186).
      */
@@ -1539,7 +1539,7 @@ public class XSSFSheet extends POIXMLDoc
 
     /**
      * Whether Excel will be asked to recalculate all formulas when the
-     *  workbook is opened.  
+     *  workbook is opened.
      */
     public boolean getForceFormulaRecalculation() {
        if(worksheet.isSetSheetCalcPr()) {
@@ -1548,7 +1548,7 @@ public class XSSFSheet extends POIXMLDoc
        }
        return false;
     }
-    
+
     /**
      * @return an iterator of the PHYSICAL rows.  Meaning the 3rd element may not
      * be the third row if say for instance the second row is undefined.
@@ -2409,10 +2409,11 @@ public class XSSFSheet extends POIXMLDoc
      *
      * @param toprow the top row to show in desktop window pane
      * @param leftcol the left column to show in desktop window pane
-     * 
-     * @deprecated Use the version of showInPane() with ints as there can be more than 32767 rows. 
+     *
+     * @deprecated Use the version of showInPane() with ints as there can be more than 32767 rows.
      */
-    public void showInPane(short toprow, short leftcol) {
+    @Deprecated
+	public void showInPane(short toprow, short leftcol) {
         showInPane((int)toprow, (int)leftcol);
     }
 
@@ -2691,11 +2692,11 @@ public class XSSFSheet extends POIXMLDoc
 
         if(worksheet.sizeOfColsArray() == 1) {
             CTCols col = worksheet.getColsArray(0);
-            if(col.sizeOfColArray() == 0) {
-                worksheet.setColsArray(null);
-            } else {
+            if(col.sizeOfColArray() != 0) {
             	setColWidthAttribute(col);
-            }
+            } /*else {
+            	remove, see Bug 52233: worksheet.setColsArray(null);
+            }*/
         }
 
         // Now re-generate our CTHyperlinks, if needed
@@ -3109,7 +3110,7 @@ public class XSSFSheet extends POIXMLDoc
 	public DataValidationHelper getDataValidationHelper() {
 		return dataValidationHelper;
 	}
-    
+
     @SuppressWarnings("deprecation") //YK: getXYZArray() array accessors are deprecated in xmlbeans with JDK 1.5 support
     public List<XSSFDataValidation> getDataValidations() {
     	List<XSSFDataValidation> xssfValidations = new ArrayList<XSSFDataValidation>();
@@ -3117,7 +3118,7 @@ public class XSSFSheet extends POIXMLDoc
     	if( dataValidations!=null && dataValidations.getCount() > 0 ) {
     		for (CTDataValidation ctDataValidation : dataValidations.getDataValidationArray()) {
     			CellRangeAddressList addressList = new CellRangeAddressList();
-    			
+
     			@SuppressWarnings("unchecked")
     			List<String> sqref = ctDataValidation.getSqref();
     			for (String stRef : sqref) {
@@ -3138,7 +3139,7 @@ public class XSSFSheet extends POIXMLDoc
     }
 
 	public void addValidationData(DataValidation dataValidation) {
-		XSSFDataValidation xssfDataValidation = (XSSFDataValidation)dataValidation;		
+		XSSFDataValidation xssfDataValidation = (XSSFDataValidation)dataValidation;
 		CTDataValidations dataValidations = worksheet.getDataValidations();
 		if( dataValidations==null ) {
 			dataValidations = worksheet.addNewDataValidations();
@@ -3164,7 +3165,7 @@ public class XSSFSheet extends POIXMLDoc
         XSSFName name = wb.getBuiltInName(XSSFName.BUILTIN_FILTER_DB, sheetIndex);
         if (name == null) {
             name = wb.createBuiltInName(XSSFName.BUILTIN_FILTER_DB, sheetIndex);
-            name.getCTName().setHidden(true); 
+            name.getCTName().setHidden(true);
             CellReference r1 = new CellReference(getSheetName(), range.getFirstRow(), range.getFirstColumn(), true, true);
             CellReference r2 = new CellReference(null, range.getLastRow(), range.getLastColumn(), true, true);
             String fmla = r1.formatAsString() + ":" + r2.formatAsString();
@@ -3173,7 +3174,7 @@ public class XSSFSheet extends POIXMLDoc
 
         return new XSSFAutoFilter(this);
     }
-    
+
     /**
      * Creates a new Table, and associates it with this Sheet
      */
@@ -3181,21 +3182,21 @@ public class XSSFSheet extends POIXMLDoc
        if(! worksheet.isSetTableParts()) {
           worksheet.addNewTableParts();
        }
-       
+
        CTTableParts tblParts = worksheet.getTableParts();
        CTTablePart tbl = tblParts.addNewTablePart();
-       
+
        // Table numbers need to be unique in the file, not just
        //  unique within the sheet. Find the next one
        int tableNumber = getPackagePart().getPackage().getPartsByContentType(XSSFRelation.TABLE.getContentType()).size() + 1;
        XSSFTable table = (XSSFTable)createRelationship(XSSFRelation.TABLE, XSSFFactory.getInstance(), tableNumber);
        tbl.setId(table.getPackageRelationship().getId());
-       
+
        tables.put(tbl.getId(), table);
-       
+
        return table;
     }
-    
+
     /**
      * Returns any tables associated with this Sheet
      */
@@ -3222,8 +3223,8 @@ public class XSSFSheet extends POIXMLDoc
         color.setIndexed(colorIndex);
         pr.setTabColor(color);
     }
-    
-    
+
+
     public CellRangeAddress getRepeatingRows() {
       return getRepeatingRowsOrColums(true);
     }
@@ -3238,24 +3239,24 @@ public class XSSFSheet extends POIXMLDoc
       setRepeatingRowsAndColumns(rowRangeRef, columnRangeRef);
     }
 
-    
+
     public void setRepeatingColumns(CellRangeAddress columnRangeRef) {
       CellRangeAddress rowRangeRef = getRepeatingRows();
       setRepeatingRowsAndColumns(rowRangeRef, columnRangeRef);
     }
 
-    
+
     private void setRepeatingRowsAndColumns(
         CellRangeAddress rowDef, CellRangeAddress colDef) {
-      int col1 = -1; 
+      int col1 = -1;
       int col2 =  -1;
-      int row1 = -1; 
+      int row1 = -1;
       int row2 =  -1;
-      
+
       if (rowDef != null) {
         row1 = rowDef.getFirstRow();
         row2 = rowDef.getLastRow();
-        if ((row1 == -1 && row2 != -1) 
+        if ((row1 == -1 && row2 != -1)
             || row1 < -1 || row2 < -1 || row1 > row2) {
           throw new IllegalArgumentException("Invalid row range specification");
         }
@@ -3263,13 +3264,13 @@ public class XSSFSheet extends POIXMLDoc
       if (colDef != null) {
         col1 = colDef.getFirstColumn();
         col2 = colDef.getLastColumn();
-        if ((col1 == -1 && col2 != -1) 
+        if ((col1 == -1 && col2 != -1)
             || col1 < -1 || col2 < -1 || col1 > col2) {
           throw new IllegalArgumentException(
               "Invalid column range specification");
         }
       }
-      
+
       int sheetIndex = getWorkbook().getSheetIndex(this);
 
       boolean removeAll = rowDef == null && colDef == null;
@@ -3304,16 +3305,16 @@ public class XSSFSheet extends POIXMLDoc
 
     private static String getReferenceBuiltInRecord(
         String sheetName, int startC, int endC, int startR, int endR) {
-        // Excel example for built-in title: 
+        // Excel example for built-in title:
         //   'second sheet'!$E:$F,'second sheet'!$2:$3
-      
-        CellReference colRef = 
+
+        CellReference colRef =
           new CellReference(sheetName, 0, startC, true, true);
-        CellReference colRef2 = 
+        CellReference colRef2 =
           new CellReference(sheetName, 0, endC, true, true);
-        CellReference rowRef = 
+        CellReference rowRef =
           new CellReference(sheetName, startR, 0, true, true);
-        CellReference rowRef2 = 
+        CellReference rowRef2 =
           new CellReference(sheetName, endR, 0, true, true);
 
         String escapedName = SheetNameFormatter.format(sheetName);
@@ -3323,15 +3324,15 @@ public class XSSFSheet extends POIXMLDoc
 
         if(startC == -1 && endC == -1) {
         } else {
-          c = escapedName + "!$" + colRef.getCellRefParts()[2] 
+          c = escapedName + "!$" + colRef.getCellRefParts()[2]
               + ":$" + colRef2.getCellRefParts()[2];
         }
 
         if (startR == -1 && endR == -1) {
-          
-        } else if (!rowRef.getCellRefParts()[1].equals("0") 
+
+        } else if (!rowRef.getCellRefParts()[1].equals("0")
             && !rowRef2.getCellRefParts()[1].equals("0")) {
-           r = escapedName + "!$" + rowRef.getCellRefParts()[1] 
+           r = escapedName + "!$" + rowRef.getCellRefParts()[1]
                  + ":$" + rowRef2.getCellRefParts()[1];
         }
 
@@ -3361,16 +3362,16 @@ public class XSSFSheet extends POIXMLDoc
       int maxColIndex = SpreadsheetVersion.EXCEL2007.getLastColumnIndex();
       for (String part : parts) {
         CellRangeAddress range = CellRangeAddress.valueOf(part);
-        if ((range.getFirstColumn() == 0 
+        if ((range.getFirstColumn() == 0
             && range.getLastColumn() == maxColIndex)
-            || (range.getFirstColumn() == -1 
+            || (range.getFirstColumn() == -1
                 && range.getLastColumn() == -1)) {
           if (rows) {
             return range;
           }
-        } else if (range.getFirstRow() == 0 
+        } else if (range.getFirstRow() == 0
             && range.getLastRow() == maxRowIndex
-            || (range.getFirstRow() == -1 
+            || (range.getFirstRow() == -1
                 && range.getLastRow() == -1)) {
           if (!rows) {
             return range;

Modified: poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java?rev=1513916&r1=1513915&r2=1513916&view=diff
==============================================================================
--- poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java (original)
+++ poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java Wed Aug 14 14:57:44 2013
@@ -17,6 +17,7 @@
 
 package org.apache.poi.xssf.usermodel;
 
+import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.OutputStream;
@@ -25,9 +26,18 @@ import java.util.zip.CRC32;
 
 import org.apache.poi.POIXMLProperties;
 import org.apache.poi.hssf.HSSFTestDataSamples;
-import org.apache.poi.openxml4j.opc.*;
+import org.apache.poi.openxml4j.opc.ContentTypes;
+import org.apache.poi.openxml4j.opc.OPCPackage;
+import org.apache.poi.openxml4j.opc.PackagePart;
+import org.apache.poi.openxml4j.opc.PackagePartName;
+import org.apache.poi.openxml4j.opc.PackagingURIHelper;
 import org.apache.poi.openxml4j.opc.internal.PackagePropertiesPart;
-import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.usermodel.BaseTestWorkbook;
+import org.apache.poi.ss.usermodel.CellStyle;
+import org.apache.poi.ss.usermodel.Font;
+import org.apache.poi.ss.usermodel.IndexedColors;
+import org.apache.poi.ss.usermodel.RichTextString;
+import org.apache.poi.ss.usermodel.Sheet;
 import org.apache.poi.util.TempFile;
 import org.apache.poi.xssf.XSSFITestDataProvider;
 import org.apache.poi.xssf.XSSFTestDataSamples;
@@ -111,6 +121,8 @@ public final class TestXSSFWorkbook exte
 		sheet1 = workbook.getSheetAt(0);
 		assertEquals(1.2, sheet1.getRow(0).getCell(0).getNumericCellValue(), 0.0001);
 		assertEquals("hello world", sheet1.getRow(1).getCell(0).getRichStringCellValue().getString());
+
+		pkg.close();
 	}
 
 	public void testExisting() throws Exception {
@@ -128,6 +140,7 @@ public final class TestXSSFWorkbook exte
 		assertTrue(wbPart.hasRelationships());
 		assertEquals(6, wbPart.getRelationships().size());
 
+		pkg.close();
 	}
 
 	public void testGetCellStyleAt(){
@@ -357,7 +370,7 @@ public final class TestXSSFWorkbook exte
 		assertEquals("Numbers", wb.getSheetName(0));
 		assertEquals("Chart", wb.getSheetName(1));
 	}
-	
+
 	/**
 	 * Problems with the count of the number of styles
 	 *  coming out wrong
@@ -448,4 +461,24 @@ public final class TestXSSFWorkbook exte
         assertEquals(IndexedColors.RED.index,
                 sh.getCTWorksheet().getSheetPr().getTabColor().getIndexed());
     }
+
+	public void testColumnWidthPOI52233() throws Exception {
+		XSSFWorkbook workbook = new XSSFWorkbook();
+		XSSFSheet sheet = workbook.createSheet();
+		XSSFRow row = sheet.createRow(0);
+		XSSFCell cell = row.createCell(0);
+		cell.setCellValue("hello world");
+		assertEquals("hello world", workbook.getSheetAt(0).getRow(0).getCell(0).getStringCellValue());
+		assertEquals(2048, workbook.getSheetAt(0).getColumnWidth(0)); // <-works
+
+		ByteArrayOutputStream stream = new ByteArrayOutputStream();
+		try {
+			workbook.write(stream);
+		} finally {
+			stream.close();
+		}
+
+		assertEquals("hello world", workbook.getSheetAt(0).getRow(0).getCell(0).getStringCellValue());
+		assertEquals(2048, workbook.getSheetAt(0).getColumnWidth(0)); // <- did throw IndexOutOfBoundsException before fixing the bug
+	}
 }



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