在java

时间:2016-11-15 08:03:30

标签: java

我正在尝试在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,它将显示为空白。

2 个答案:

答案 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);
}