diff options
author | PJ Fanning <fanningpj@apache.org> | 2020-06-11 09:19:26 +0000 |
---|---|---|
committer | PJ Fanning <fanningpj@apache.org> | 2020-06-11 09:19:26 +0000 |
commit | 2a8dfb353e7022ad4802b6c131e919cf20e1fcd5 (patch) | |
tree | 8e47e0fe94cddebfdedadde269e2e83127019fcc /src/ooxml/java/org | |
parent | d559feb7deff492fd196bfbaf05888db1305cc45 (diff) | |
download | poi-2a8dfb353e7022ad4802b6c131e919cf20e1fcd5.tar.gz poi-2a8dfb353e7022ad4802b6c131e919cf20e1fcd5.zip |
[bug-64516] XSSFSheet.shiftRows has a bug when shifting rows affect the order of the rows. Thanks to Alex Richter
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1878746 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src/ooxml/java/org')
-rw-r--r-- | src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java index a63c420258..0591dea9c9 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java @@ -3037,14 +3037,24 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet { } private void rebuildRows() { + //rebuild the CTSheetData CTRow order + SortedMap<Long, CTRow> ctRows = new TreeMap<>(); + CTSheetData sheetData = getCTWorksheet().getSheetData(); + for (CTRow ctRow : sheetData.getRowList()) { + Long rownumL = ctRow.getR(); + ctRows.put(rownumL, ctRow); + } + List<CTRow> ctRowList = new ArrayList<CTRow>(ctRows.values()); + CTRow[] ctRowArray = new CTRow[ctRowList.size()]; + ctRowArray = ctRowList.toArray(ctRowArray); + sheetData.setRowArray(ctRowArray); + //rebuild the _rows map - List<XSSFRow> rowList = new ArrayList<>(_rows.values()); _rows.clear(); - for(XSSFRow r : rowList) { - // Performance optimization: explicit boxing is slightly faster than auto-unboxing, though may use more memory - //noinspection UnnecessaryBoxing - final Integer rownumI = new Integer(r.getRowNum()); // NOSONAR - _rows.put(rownumI, r); + for (CTRow ctRow : sheetData.getRowList()) { + XSSFRow row = new XSSFRow(ctRow, this); + Integer rownumI = Math.toIntExact(row.getRowNum()); + _rows.put(rownumI, row); } } |