我的c:驱动器(本地计算机)中有一个名为abc.xls的excel文件,现在在第一张表格中的excel文件中有一个如下所示的表格,下面的表格可以位于任何范围内这张表,所以我开发了下面的java程序,它将逐行扫描整个工作表,然后在列的基础上扫描整个工作表,然后找到单元格 TradeRef就在那里
TradeRef TMS Deal Date
12 45 DRT 23/97/2014
23 36 QWE 21/07/2015
现在我的下面程序中的问题是它捕获了TradeRef所在的单元格,然后它迭代了列,然后以类似的方式捕获下一行并迭代列
但我要应用的逻辑是,当它捕获TradeRef单元格并迭代列并到达表格的最后一列(上表中为Date)时,它应该进一步扫描下面的20列相同的行,如果在接下来的20列中没有任何值的单元格,那么它应该移动到下一行,如果在20列中,它应该是任何单元格都可以有值,那么在这种情况下它应该读取该单元格值
所以就像
TradeRef TMS Deal Date <----- scan next 20 columns is there is no value in next 20 cells then move to next row else include that cell value also------->
12 45 DRT 23/97/2014
23 36 QWE 21/07/2015
所以请告知如何实现扫描下面行中接下来20列的上述逻辑是我早期的实现
public class AAA {
public static void main(String[] args) throws IOException {
FileInputStream file = null ;
try {
file = new FileInputStream(new File("C:\\abc.xls"));
HSSFWorkbook workbook = new HSSFWorkbook(file);
HSSFSheet firstSheet = workbook.getSheetAt(0);
Iterator<Row> iterator = firstSheet.iterator();
Cell c = findFirstRow(firstSheet);
}
catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally{
file.close();
}
}
public static Cell findFirstRow(HSSFSheet firstSheet) {
for (Row row : firstSheet) {
for (Cell cell : row) {
cell.setCellType(cell.CELL_TYPE_STRING);
if ("TradeRef".equals(cell.getStringCellValue())) {
int row1 = cell.getRowIndex() + 1;
int col = cell.getColumnIndex();
if (firstSheet.getRow(row1) == null)
throw new RuntimeException("Row " + row1 + 1 + " is empty!");
Cell startOfFirstDataRow = firstSheet.getRow(row1).getCell(col);
if (startOfFirstDataRow == null) {
CellReference ref = new CellReference(row1, col);
throw new RuntimeException("Data not found at " + ref.formatAsString());
}
return startOfFirstDataRow;
}
}
}
throw new RuntimeException("TradingRef header cell not found!");
}
}
所以请告知我如何实现扫描下20列的上述逻辑
答案 0 :(得分:0)
首先,您应该使用org.apache.poi.ss.usermodel
API,它适用于所有Excel文件,而HSSF*
类仅适用于.xls
个文件。
org.apache.poi.ss.usermodel.Sheet
类有一个getFirstRow()
方法,您可以使用该方法开始搜索。接下来,您要查找包含给定字符串的单元格序列,例如:
// This is an array containing the headers
final String[] headers = { "TradeRef", "TMS", "Deal", "Date" };
// now we take row from above to be the Row object where we seek our headers
int last = row.getLastCellNum();
for (int c = row.getFirstCellNum(); c < last; c++) {
int h = 0;
// check if the cell at (c + h) has the required value
for (; h < headers.length && c + h < last; h++) {
if (!headers[h].equals(row.getCell(c + h).getStringCellValue())) {
break; // if the cell value differs from our header
}
}
if (h == headers.length) // this means the break was never invoked
return c; // found it
}
return -1; // not found