aboutsummaryrefslogtreecommitdiffstats
path: root/src/ooxml/java/org
diff options
context:
space:
mode:
authorPJ Fanning <fanningpj@apache.org>2020-06-11 09:19:26 +0000
committerPJ Fanning <fanningpj@apache.org>2020-06-11 09:19:26 +0000
commit2a8dfb353e7022ad4802b6c131e919cf20e1fcd5 (patch)
tree8e47e0fe94cddebfdedadde269e2e83127019fcc /src/ooxml/java/org
parentd559feb7deff492fd196bfbaf05888db1305cc45 (diff)
downloadpoi-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.java22
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);
}
}