我在C:drive(本地计算机)中有一个名为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列
首先,您可能应该使用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
我试图遍历一个JList,其中每个项目都包含:JGroup-JLabel 目前我拥有的是: 我得到的结果是: Item=javax。摆动JPanel[,0,0,0x0,无效,layout=java.awt.FlowLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,minimumSize=,preferredSize=
问题内容: 我有一个这样的对象: 我需要在HTML表中获取ID和名称,但是似乎很难遍历此对象。TIA。我知道我需要先到达“值数组”,然后再到达“组”对象,但是我要遍历对象和数组之间的过渡以及foreach与基于索引的迭代。 例如,我尝试了这个: 它遍历对象,但也给我没用 问题答案:
问题内容: 有没有办法遍历Java SparseArray(适用于Android)?我曾经很容易通过索引来获取值。我找不到一个。 问题答案: 似乎我找到了解决方案。我没有正确注意到该功能。 因此,我将使用以下内容:
我想在HashMap中搜索重复项。目前这是我的HashMap:
问题内容: 好的,所以我试图查询数据库并选择所有具有特定值的行。之后,我使用mysql_fetch_array()将查询转换为数组,然后尝试使用for每个循环逐行遍历读取的数组。 尽管当我对pointsAvailable列之外的任何列执行此操作时,说一列名为“ name”的文本类型的列,它只会返回一个字母。 如何逐行遍历返回的查询,并允许从当前行获取特定列的数据? 问题答案: 或使用MYSQL_A
问题内容: 有没有一种优雅的方法可以跳过Java5 foreach循环中的第一次迭代? 伪代码示例: 问题答案: 我不会称其为优雅,但可能比使用“第一个”布尔值更好: 除此之外,可能没有优雅的方法。