我正在尝试在Excel文件中搜索帐号,作为回报,我将获得总金额'如果工作表中存在帐号。我可以使用此代码进行扫描,但是,如果工作表中不存在帐号,我会收到错误。
for(int i = 0; i < accno.size(); i++){
for(int j = rowAccNo1+1; j < row.getRowNum(); j++){
srcaccno = formatter.formatCellValue(sheet.getRow(j).getCell(0));
totalamt = formatter.formatCellValue(sheet.getRow(j).getCell(10));
if(accno.get(i).contains(srcaccno)){
totalamountdue.add(i, totalamt);
}
}
}
编辑: 嗨,我正在使用Apache POI。
我宣布accno如下:
static ArrayList<String> accno = new ArrayList<String>();
我收到此错误。或许Java无法找到他抛出此帐号的帐号。但我不知道我是否可以在我的arraylist上添加空或null。
at java.util.ArrayList.rangeCheckForAdd(Unknown Source)at java.util.ArrayList.add(未知来源)at com.joven.DataExtractionTool.App.compareMastertoSourceABC(App.java:372) 在com.joven.DataExtractionTool.App.main(App.java:78)at com.joven.DataExtractionTool.AppTest.testApp(AppTest.java:17)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(未知来源)at sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源)at java.lang.reflect.Method.invoke(未知来源)at junit.framework.TestCase.runTest(TestCase.java:154)at junit.framework.TestCase.runBare(TestCase.java:127)at junit.framework.TestResult $ 1.protect(TestResult.java:106)at junit.framework.TestResult.runProtected(TestResult.java:124)at at junit.framework.TestResult.run(TestResult.java:109)at junit.framework.TestCase.run(TestCase.java:118)at junit.framework.TestSuite.runTest(TestSuite.java:208)at junit.framework.TestSuite.run(TestSuite.java:203)at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:131) 在 org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
感谢您的回复!
我真正想做的是,如果表格中存在accno,请获取totalamountdue。如果它不存在,请将空白放在totalamountdue上,这样如果我在控制台输出arraylist,它将显示为空白。
答案 0 :(得分:1)
你的问题来自这个
if(accno.get(i).contains(srcaccno)){
totalamountdue.add(i, totalamt); // ########
}
由于您将total
添加到列表中的特定索引(与帐户列表对应的索引),您需要插入&#34;默认&#34;如果您在工作表中找不到该帐户,则会显示该值。如果不这样做,帐户列表和总列表之间的长度将不同。这意味着您尝试将值添加到far(超出范围的异常)。
实际上,有一种更简单的方法(不知道我为什么不先思考)
在开始搜索工作表之前,请插入空值
totalamountdue.add(null);
然后,在搜索循环中,如果找到值,请将此null
替换为找到的总数。
if(accno.get(i).contains(srcaccno)){
totalamountdue.set(i, totalamt); // use SET to replace the value at a specific index.
}
完整循环
totalamoutdue.add(null); //will insert at the end, i.
for(int j = rowAccNo1+1; j < row.getRowNum(); j++){
srcaccno = formatter.formatCellValue(sheet.getRow(j).getCell(0));
if(accno.get(i).contains(srcaccno)){
totalamt = formatter.formatCellValue(sheet.getRow(j).getCell(10)); //No need to get the value if it is not the account you want
totalamountdue.set(i, totalamt);
break; //Break the current for loop, IF there is no need to read further
}
}
答案 1 :(得分:0)
我认为迭代这些列表有问题,所以我简化了代码 - 希望它能够正常工作。
Map<String, BigDecimal> accountsDue = new HashMap<>();
for (int j = rowAccNo1 + 1; j < row.getRowNum(); j++) {
String srcaccno = formatter.formatCellValue(sheet.getRow(j).getCell(0));
BigDecimal amountDue = formatter.formatCellValue(sheet.getRow(j).getCell(10));
if (accno.contains(srcaccno)) {
putOrIncreaseDue(srcaccno, amountDue, accountsDue);
}
}
private void putOrIncreaseDue(String srcaccno, BigDecimal amountDue, Map<String, BigDecimal> accountsDue) {
if (accountsDue.containsKey(srcaccno)) {
amountDue.add(accountsDue.get(srcaccno));
}
accountsDue.put(srcaccno, amountDue);
}