第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

獲取行索引時(shí)出現(xiàn) XmlValueDisconnectedException

獲取行索引時(shí)出現(xiàn) XmlValueDisconnectedException

萬(wàn)千封印 2023-04-19 16:08:34
在我的代碼中,我逐行檢查一個(gè) XLSX 文件,并使用 Apache POI 4.1.0 對(duì)數(shù)據(jù)庫(kù)進(jìn)行驗(yàn)證。如果我發(fā)現(xiàn)不正確的行,我會(huì)通過(guò)將其添加到List<XSSFRow> toRemove. 在遍歷每一行之后,這個(gè)小方法應(yīng)該刪除標(biāo)記為刪除的行:ListIterator<XSSFRow> rowIterator = toRemove.listIterator(toRemove.size());while (rowIterator.hasPrevious()) {    XSSFRow row = rowIterator.previous();    if (row != null && row.getSheet() == sheet) {        int lastRowNum = sheet.getLastRowNum();        int rowIndex = row.getRowNum();        if (rowIndex == lastRowNum) {            sheet.removeRow(row);        } else if (rowIndex >= 0 && rowIndex < lastRowNum) {            sheet.removeRow(row);        } else {            System.out.println("\u001B[31mERROR: Removal failed because row " + rowIndex + " is out of bounds\u001B[0m");        }        System.out.println("Row " + rowIndex + " successfully removed");    } else {        System.out.println("Row skipped in removal because it was null already");    }}getRowNum()但由于某些未知原因,它完美地刪除了所有行,然后在獲取最后(第一個(gè)添加的)行的行索引 ( ) 時(shí)拋出 XmlValueDisconnectedException 。Stacktrace的相關(guān)部分:org.apache.xmlbeans.impl.values.XmlValueDisconnectedException    at org.apache.xmlbeans.impl.values.XmlObjectBase.check_orphaned(XmlObjectBase.java:1258)    at org.openxmlformats.schemas.spreadsheetml.x2006.main.impl.CTRowImpl.getR(Unknown Source)    at org.apache.poi.xssf.usermodel.XSSFRow.getRowNum(XSSFRow.java:400)    at Overview.removeRows(Overview.java:122)編輯:我也嘗試更改迭代過(guò)程(見(jiàn)下文)但錯(cuò)誤保持不變。for (XSSFRow row : toRemove) {   // same code as above without iterator and while}
查看完整描述

1 回答

?
偶然的你

TA貢獻(xiàn)1841條經(jīng)驗(yàn) 獲得超3個(gè)贊

如果一行在 List 中被雙重包含,則會(huì)發(fā)生錯(cuò)誤toRemove。AList允許重復(fù)條目。所以同一行可能會(huì)被雙重添加到List. 如果然后Iterator得到該行的第一次出現(xiàn),這將從工作表中正確刪除。但是,如果稍后再次出現(xiàn)同一行,則row.getRowNum()失敗,因?yàn)樵撔胁辉俅嬖谟诠ぷ鞅碇小?/p>


這是重現(xiàn)該行為的完整代碼:


import org.apache.poi.ss.usermodel.*;


import java.io.FileInputStream;

import java.io.FileOutputStream;


import java.util.*;


public class ExcelRemoveRows {


 public static void main(String[] args) throws Exception {


  String filePath = "Excel.xlsx"; // must contain at least 5 filled rows


  Workbook workbook = WorkbookFactory.create(new FileInputStream(filePath));

  Sheet sheet = workbook.getSheetAt(0);


  List<Row> toRemoveList = new ArrayList<Row>();

  toRemoveList.add(sheet.getRow(0));

  toRemoveList.add(sheet.getRow(2));

  toRemoveList.add(sheet.getRow(4));

  toRemoveList.add(sheet.getRow(2)); // this produces the error


  System.out.println(toRemoveList); // contains row hawing index 2 (r="3") two times


  for (Row row : toRemoveList) {

   System.out.println(row.getRowNum()); // XmlValueDisconnectedException on second occurance of row index 2

   sheet.removeRow(row);

  }


  FileOutputStream out = new FileOutputStream("Changed"+filePath);

  workbook.write(out);

  out.close();

  workbook.close();

 }

}

解決方案是避免List多次包含同一行。


我不會(huì)收集要在 a 中刪除的行List<XSSFRow>,而是收集要在 a 中刪除的行號(hào)Set<Integer>。這將避免重復(fù),因?yàn)?aSet不允許重復(fù)的元素。然后要?jiǎng)h除的行可以簡(jiǎn)單地通過(guò)sheet.getRow(rowNum).


代碼:


...

  Set<Integer> toRemoveSet = new HashSet<Integer>();

  toRemoveSet.add(sheet.getRow(0).getRowNum());

  toRemoveSet.add(sheet.getRow(2).getRowNum());

  toRemoveSet.add(sheet.getRow(4).getRowNum());

  toRemoveSet.add(sheet.getRow(2).getRowNum());


  System.out.println(toRemoveSet); // does not contain the row index 2 two times


  for (Integer rowNum : toRemoveSet) {

   Row row = sheet.getRow(rowNum);

   System.out.println(row.getRowNum());

   sheet.removeRow(row);

  }

...


查看完整回答
反對(duì) 回復(fù) 2023-04-19
  • 1 回答
  • 0 關(guān)注
  • 1443 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)