Hi Greg, Nice catch and fix!
Dominik. On Sat, Feb 24, 2018 at 10:06 PM, Greg Woolsey <greg.wool...@gmail.com> wrote: > I did it - I created a reproducible test case that involves pure POI API > calls, no starting workbook produced elsewhere. I'll file a new bug to > reference when I commit. > > On Fri, Feb 23, 2018 at 10:13 PM Greg Woolsey <greg.wool...@gmail.com> > wrote: > > > Yes, I thought of a possible approach to a test case tonight while doing > > the kids' activities transportation. If I have time this weekend I'll > give > > it a stab. > > > > On Fri, Feb 23, 2018, 21:48 Dominik Stadler <dominik.stad...@gmx.at> > > wrote: > > > >> Hi, > >> > >> Your analysis sounds sensible and changing onDocumentWrite() looks ok to > >> me > >> as well from a quick look at the code, we would only add an allocation > of > >> the array, which is quit performance-wise compared to all the stuff that > >> happens while saving the document. > >> > >> A reproducing test-case would be nice, so we can verify this going > >> forward. > >> > >> Dominik. > >> > >> > >> On Fri, Feb 23, 2018 at 10:34 PM, Greg Woolsey <greg.wool...@gmail.com> > >> wrote: > >> > >> > I'm finally able to work around the problem by changing > >> > XSSFRow.onDocumentWrite() to always copy the current state of the > _cells > >> > collection to the _row CArray, instead of only when things don't look > >> like > >> > they are ordered. There are several cases I've uncovered where the > two > >> > groups can be the same size, with the same cell reference strings in > the > >> > same order, but still not equal. One involves adding cells then > saving > >> > then editing, another involves possible side effects of > >> > XSSFCell.setBlank(). > >> > > >> > The safest option I can see is to just simply the method to just the > >> code > >> > inside the if(!isOrdered) statement, without the precondition > >> checking. I > >> > copied that code to my test project and applied it after every data > >> table > >> > row update, and that fixed my issue without appearing to cause a > >> > performance hit. In fact, removing the ordering checking probably > >> makes it > >> > a constant time change, since it was doing essentially the same loops > >> > whether it applied any changes or not. > >> > > >> > Anyone want to weigh in on that simplification of > >> > XSSFRow.onDocumentWrite()? > >> > > >> > > >> > On Fri, Feb 23, 2018 at 12:55 PM Greg Woolsey <greg.wool...@gmail.com > > > >> > wrote: > >> > > >> > > For what it's worth, I'm using a build from last August. The code > >> > changes > >> > > I'm seeing since then are almost entirely about API changes to use > >> Enums > >> > > and ints and remove deprecated methods. > >> > > > >> > > I'm suspicious there are not a lot of use cases where a document is > >> > > opened, edited, saved, edited again without re-opening, then saved > >> again. > >> > > That's where I'm seeing the sync issues, after the first save. Then > >> some > >> > > subsequent edits get lost. it appears to be for cells that did not > >> exist > >> > > originally, then were added by edits. After the first save, edits > to > >> > these > >> > > cells are not passed on to the CTRow, causing the second save to > >> contain > >> > > incorrect data. I'm still digging. > >> > > > >> > > On Fri, Feb 23, 2018 at 11:09 AM Alain FAGOT BÉAREZ < > >> > abea...@for-scala.it> > >> > > wrote: > >> > > > >> > >> Hi, > >> > >> > >> > >> It might have been the same symptoms which have led Sandeep Tiwari > to > >> > >> make a code change that I was reluctant to accept in the branch > about > >> > >> charts in XWPF. His explanations were in the line of yours. But I > >> > couldn't > >> > >> not accept the idea that such a fundamental feature had been > broken. > >> > >> > >> > >> I hope to have some time this weekend to dive into the commits > >> history > >> > to > >> > >> point out any change done recently that might affect that. > >> > >> > >> > >> Best regards, > >> > >> Alain FAGOT BÉAREZ > >> > >> > >> > >> > >> > >> > >> > >> Von: Greg Woolsey > >> > >> Gesendet: Fri Feb 23 03:53:08 GMT-03:00 2018 > >> > >> An: POI Developers List > >> > >> Betreff: baffling save behavior > >> > >> > >> > >> I hesitate to even bring it up, thinking I should be able to figure > >> it > >> > >> out, > >> > >> but I've never seen behavior like this. Keep reading if you want to > >> > twist > >> > >> your brain in knots like mine. > >> > >> > >> > >> TL/DR - stop now if you'd rather be productive for your day job. > >> > >> > >> > >> Somehow, I have a consistent state where a file originating in > Excel, > >> > >> modified through POI, then saved and opened in Excel causes not > just > >> an > >> > >> Excel repair, but incorrect/old data as well. > >> > >> > >> > >> So far, just a coding error, I figure. But the weirdness starts > when > >> I > >> > use > >> > >> the debugger to check on things. A specific row that I know comes > out > >> > >> wrong has the right cell values when I use > >> > >> wb.getSheet(#).getRow(#).getCell(#).toString(), but when I check > the > >> > CTRow > >> > >> and CTCell objects, then I find the old values still. So somehow, > >> I've > >> > got > >> > >> the XSSFRow._cells collection out of sync with the CTRow _row > >> contents. > >> > >> > >> > >> Anyone know how I could have done that? > >> > >> > >> > >> I may be calling workbook.write() in multiple places for different > >> > >> purposes/copies. It looks to me like XSSFRow.onDocumentWrite() > >> > explicitly > >> > >> replaces the CTRow array of CTCell beans with new ones due to bug, > >> > #56170, > >> > >> but it is replacing the CTCell references in the XSSFCell objects > >> with > >> > the > >> > >> new copies, . > >> > >> > >> > >> I haven't found a smoking gun yet, but any thoughts are welcome. > >> Perhaps > >> > >> the issue may lie with the formula evaluator created prior to the > >> save > >> > >> event? > >> > >> > >> > >> It may be related to that bug, or even directly tied to it, as that > >> was > >> > >> about updating tables, and that's part of the updates my process is > >> > doing > >> > >> as well. > >> > >> > >> > >> Sorry for the long document, normally I just figure these out on my > >> own, > >> > >> but I've been at this a week so far, which has never happened > >> before. If > >> > >> it comes down to black box behavior by XMLBeans, that would help > >> explain > >> > >> it, as I know next to nothing about that library's details. > >> > >> > >> > >> Greg > >> > >> > >> > >> > >> > >> -------- Originale Nachricht -------- > >> > >> Von: Greg Woolsey <greg.wool...@gmail.com> > >> > >> Gesendet: Fri Feb 23 03:53:08 GMT-03:00 2018 > >> > >> An: POI Developers List <dev@poi.apache.org> > >> > >> Betreff: baffling save behavior > >> > >> > >> > >> I hesitate to even bring it up, thinking I should be able to figure > >> it > >> > >> out, > >> > >> but I've never seen behavior like this. Keep reading if you want > to > >> > twist > >> > >> your brain in knots like mine. > >> > >> > >> > >> TL/DR - stop now if you'd rather be productive for your day job. > >> > >> > >> > >> Somehow, I have a consistent state where a file originating in > Excel, > >> > >> modified through POI, then saved and opened in Excel causes not > just > >> an > >> > >> Excel repair, but incorrect/old data as well. > >> > >> > >> > >> So far, just a coding error, I figure. But the weirdness starts > >> when I > >> > >> use > >> > >> the debugger to check on things. A specific row that I know comes > >> out > >> > >> wrong has the right cell values when I use > >> > >> wb.getSheet(#).getRow(#).getCell(#).toString(), but when I check > the > >> > CTRow > >> > >> and CTCell objects, then I find the old values still. So somehow, > >> I've > >> > >> got > >> > >> the XSSFRow._cells collection out of sync with the CTRow _row > >> contents. > >> > >> > >> > >> Anyone know how I could have done that? > >> > >> > >> > >> I may be calling workbook.write() in multiple places for different > >> > >> purposes/copies. It looks to me like XSSFRow.onDocumentWrite() > >> > explicitly > >> > >> replaces the CTRow array of CTCell beans with new ones due to bug, > >> > #56170, > >> > >> but it is replacing the CTCell references in the XSSFCell objects > >> with > >> > the > >> > >> new copies, . > >> > >> > >> > >> I haven't found a smoking gun yet, but any thoughts are welcome. > >> > Perhaps > >> > >> the issue may lie with the formula evaluator created prior to the > >> save > >> > >> event? > >> > >> > >> > >> It may be related to that bug, or even directly tied to it, as that > >> was > >> > >> about updating tables, and that's part of the updates my process is > >> > doing > >> > >> as well. > >> > >> > >> > >> Sorry for the long document, normally I just figure these out on my > >> own, > >> > >> but I've been at this a week so far, which has never happened > before. > >> > If > >> > >> it comes down to black box behavior by XMLBeans, that would help > >> explain > >> > >> it, as I know next to nothing about that library's details. > >> > >> > >> > >> Greg > >> > >> > >> > > > >> > > >> > > >