svn commit: r1818818 - in /poi/trunk: src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCell.java test-data/spreadsheet/61869.xlsx

2017-12-20 Thread yegor
Author: yegor
Date: Wed Dec 20 16:30:13 2017
New Revision: 1818818

URL: http://svn.apache.org/viewvc?rev=1818818=rev
Log:
Bug 61869: updating a cell with shared formula produces an unreadable file

Added:
poi/trunk/test-data/spreadsheet/61869.xlsx   (with props)
Modified:
poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java

poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCell.java

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java?rev=1818818=1818817=1818818=diff
==
--- poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java 
(original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java Wed 
Dec 20 16:30:13 2017
@@ -558,21 +558,30 @@ public final class XSSFCell implements C
 XSSFWorkbook wb = _row.getSheet().getWorkbook();
 if (formula == null) {
 wb.onDeleteFormula(this);
-if(_cell.isSetF()) {
+if (_cell.isSetF()) {
 _cell.unsetF();
 }
 return;
 }
 
-if(wb.getCellFormulaValidation()) {
+if (wb.getCellFormulaValidation()) {
 XSSFEvaluationWorkbook fpb = XSSFEvaluationWorkbook.create(wb);
 //validate through the FormulaParser
 FormulaParser.parse(formula, fpb, formulaType, 
wb.getSheetIndex(getSheet()), getRowIndex());
 }
 
-CTCellFormula f = CTCellFormula.Factory.newInstance();
-f.setStringValue(formula);
-_cell.setF(f);
+CTCellFormula f;
+if (_cell.isSetF()) {
+f = _cell.getF();
+f.setStringValue(formula);
+if(f.getT() == STCellFormulaType.SHARED){
+getRow().getSheet().onReadCell(this);
+}
+} else {
+f = CTCellFormula.Factory.newInstance();
+f.setStringValue(formula);
+_cell.setF(f);
+}
 if(_cell.isSetV()) {
 _cell.unsetV();
 }

Modified: 
poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCell.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCell.java?rev=1818818=1818817=1818818=diff
==
--- 
poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCell.java 
(original)
+++ 
poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCell.java 
Wed Dec 20 16:30:13 2017
@@ -48,6 +48,7 @@ import org.apache.poi.xssf.XSSFTestDataS
 import org.apache.poi.xssf.model.SharedStringsTable;
 import org.junit.Test;
 import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCell;
+import org.openxmlformats.schemas.spreadsheetml.x2006.main.STCellFormulaType;
 import org.openxmlformats.schemas.spreadsheetml.x2006.main.STCellType;
 
 import static org.junit.Assert.*;
@@ -670,4 +671,34 @@ public final class TestXSSFCell extends
 
 destCell.setCellValue(true);
 }
-}
+
+/**
+ * Bug 61869: updating a shared formula produces an unreadable file
+ */
+@Test
+public void test61869() throws Exception {
+try (XSSFWorkbook wb = 
XSSFTestDataSamples.openSampleWorkbook("61869.xlsx")) {
+XSSFSheet sheet = wb.getSheetAt(0);
+XSSFCell c2 = sheet.getRow(1).getCell(2);
+assertEquals("SUM(A2,B2)", c2.getCellFormula());
+assertEquals(STCellFormulaType.SHARED, 
c2.getCTCell().getF().getT());
+assertEquals(0, c2.getCTCell().getF().getSi());
+XSSFCell c3 = sheet.getRow(2).getCell(2);
+assertEquals(STCellFormulaType.SHARED, 
c3.getCTCell().getF().getT());
+assertEquals(0, c3.getCTCell().getF().getSi());
+assertEquals("SUM(A3,B3)", c3.getCellFormula());
+
+assertEquals("SUM(A2,B2)", 
sheet.getSharedFormula(0).getStringValue());
+
+c2.setCellFormula("SUM(A2:B2)");
+assertEquals(STCellFormulaType.SHARED, 
c2.getCTCell().getF().getT()); // c2 remains the master formula
+
+assertEquals("SUM(A2:B2)", 
sheet.getSharedFormula(0).getStringValue());
+assertEquals(STCellFormulaType.SHARED, 
c3.getCTCell().getF().getT());
+assertEquals(0, c3.getCTCell().getF().getSi());
+assertEquals("SUM(A3:B3)", c3.getCellFormula());  // formula in 
the follower cell is rebuilt
+
+}
+
+}
+}
\ No newline at end of file

Added: poi/trunk/test-data/spreadsheet/61869.xlsx
URL: 
http://svn.apache.org/viewvc/poi/trunk/test-data/spreadsheet/61869.xlsx?rev=1818818=auto
==
Binary file - no diff available.

Propchange: poi/trunk/test-data/spreadsheet/61869.xlsx

svn commit: r1818786 - /poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java

2017-12-20 Thread fanningpj
Author: fanningpj
Date: Wed Dec 20 12:15:35 2017
New Revision: 1818786

URL: http://svn.apache.org/viewvc?rev=1818786=rev
Log:
use try with resources

Modified:
poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java

Modified: 
poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java?rev=1818786=1818785=1818786=diff
==
--- poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java 
(original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java 
Wed Dec 20 12:15:35 2017
@@ -617,10 +617,11 @@ public class XSSFWorkbook extends POIXML
 }
 
 
-try {
-ByteArrayOutputStream out = new ByteArrayOutputStream();
+try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
 srcSheet.write(out);
-clonedSheet.read(new ByteArrayInputStream(out.toByteArray()));
+try (ByteArrayInputStream bis = new 
ByteArrayInputStream(out.toByteArray())) {
+clonedSheet.read(bis);
+}
 } catch (IOException e){
 throw new POIXMLException("Failed to clone sheet", e);
 }
@@ -2366,18 +2367,19 @@ public class XSSFWorkbook extends POIXML
 
 Ole10Native ole10 = new Ole10Native(label, fileName, command, oleData);
 
-ByteArrayOutputStream bos = new 
ByteArrayOutputStream(oleData.length+500);
-ole10.writeOut(bos);
-
-try (POIFSFileSystem poifs = new POIFSFileSystem()) {
-DirectoryNode root = poifs.getRoot();
-root.createDocument(Ole10Native.OLE10_NATIVE, new 
ByteArrayInputStream(bos.toByteArray()));
-root.setStorageClsid(ClassID.OLE10_PACKAGE);
+try (ByteArrayOutputStream bos = new 
ByteArrayOutputStream(oleData.length+500)) {
+ole10.writeOut(bos);
 
-// TODO: generate CombObj stream
+try (POIFSFileSystem poifs = new POIFSFileSystem()) {
+DirectoryNode root = poifs.getRoot();
+root.createDocument(Ole10Native.OLE10_NATIVE, new 
ByteArrayInputStream(bos.toByteArray()));
+root.setStorageClsid(ClassID.OLE10_PACKAGE);
 
-try (OutputStream os = pp.getOutputStream()) {
-poifs.writeFilesystem(os);
+// TODO: generate CombObj stream
+
+try (OutputStream os = pp.getOutputStream()) {
+poifs.writeFilesystem(os);
+}
 }
 }
 



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



svn commit: r1818781 - /poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java

2017-12-20 Thread fanningpj
Author: fanningpj
Date: Wed Dec 20 11:47:52 2017
New Revision: 1818781

URL: http://svn.apache.org/viewvc?rev=1818781=rev
Log:
use try with resources

Modified:
poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java

Modified: 
poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java?rev=1818781=1818780=1818781=diff
==
--- poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java 
(original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java 
Wed Dec 20 11:47:52 2017
@@ -544,9 +544,9 @@ public class XSSFWorkbook extends POIXML
 public int addPicture(InputStream is, int format) throws IOException {
 int imageNumber = getAllPictures().size() + 1;
 XSSFPictureData img = 
createRelationship(XSSFPictureData.RELATIONS[format], 
XSSFFactory.getInstance(), imageNumber, true).getDocumentPart();
-OutputStream out = img.getPackagePart().getOutputStream();
-IOUtils.copy(is, out);
-out.close();
+try (OutputStream out = img.getPackagePart().getOutputStream()) {
+IOUtils.copy(is, out);
+}
 pictures.add(img);
 return imageNumber - 1;
 }



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