场景:多个表需要导入到一个总表中,导入是追加写的形式,删除单表之后或这个删除某个表的某行数据之后也要删除以前总表中的数据,由唯一Id区分每行数据。 poi的版本
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.10-FINAL</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.10-FINAL</version> </dependency>
首次使用了sheet.removeRow(),后只是删除了行数据,但是留下了很多空白行
所以使用sheet.shiftRows(startRow,endRow,n)
Map<String,Integer> idsRow = new HashMap(); //方便删除,按value进行排序 Map<String, Integer> map = sortByValue(idsRow); //已删掉的行数 int count = 0; for (Object key : map.keySet()) { if (!data.containsKey(key) && idsRow.get(key) != null) { //原本所在的行 Integer integer = idsRow.get(key); if (integer - count < sheet.getLastRowNum()) { //-1表示上移 sheet.shiftRows(integer - count + 1, sheet.getLastRowNum(), -1); count++; } } }public static Map<String, Integer> sortByValue(Map<String, Integer> map) { List<Map.Entry<String, Integer>> list = new ArrayList<>(map.entrySet()); // 按值从小到大排序 list.sort(Map.Entry.comparingByValue()); // 将排序后的条目插入到LinkedHashMap中 Map<String, Integer> result = new LinkedHashMap<>(); for (Map.Entry<String, Integer> entry : list) { result.put(entry.getKey(), entry.getValue()); } return result; }