[英]Java. HSSF. Apache-poi. How to modificate code
我的数据以以下格式存储(向下看):[-]表示空白单元格,右边可能只有10列(空格后)。 像这样:
[string0] [-] [string1] [string2] [string3] .. [string10] [-]
如何为以下代码更改此代码:
1)仅获取[string0]
2)仅获取[string1] [string2] [string3] .. [string10] [-]
try {
FileInputStream file = new FileInputStream("C:\\Users\\student3\\"+sfilename+".xls");
//Get the workbook instance for XLS file
HSSFWorkbook workbook = new HSSFWorkbook(file);
//Get first sheet from the workbook
HSSFSheet sheet = workbook.getSheetAt(0);
//Iterate through each rows from first sheet
Iterator<Row> rowIterator = sheet.iterator();
while(rowIterator.hasNext()) {
Row row = rowIterator.next();
//For each row, iterate through each columns
Iterator<Cell> cellIterator = row.cellIterator();
while(cellIterator.hasNext()) {
Cell cell = cellIterator.next();
switch(cell.getCellType()) {
case Cell.CELL_TYPE_STRING:
System.out.print(cell.getStringCellValue() + "\t\t");
list1.add(cell.getStringCellValue());
break;
}
}
System.out.println("");
}
file.close();
FileOutputStream out =
new FileOutputStream("C:\\Users\\student3\\"+sfilename+".xls");
workbook.write(out);
out.close();
我不知道如何停止Iterator。 他吸收了所有..
如果我很清楚,您只想过滤您的第一列字符串并单独休息。
为什么不为此使用一个简单的计数器:
while(rowIterator.hasNext()) {
Row row = rowIterator.next();
String RowContent = null;
Iterator<Cell> cellIterator = row.cellIterator();
while(cellIterator.hasNext()) {
Cell cell = cellIterator.next();
RowContent=RowContent+cell.toString();
}
//Code for saving RowContent or printing or whatever you want for text in complete row
}
RowContent将在每次迭代中串联单个行的每个单元格。
就像您在带有“ break”的开关块中所做的一样。 但是我想你想要的是:
Iterator<Cell> cellIterator = row.cellIterator();
boolean stop = false;
while(cellIterator.hasNext()) {
Cell cell = cellIterator.next();
switch(cell.getCellType()) {
case Cell.CELL_TYPE_STRING:
System.out.print(cell.getStringCellValue() + "\t\t");
list1.add(cell.getStringCellValue());
stop = true;
break;
}
if (stop) {
break;
}
}
当您找到一个字符串单元格时,这将停止while循环,然后在下一行进行操作。 使任何可能的条件都需要打破while循环。 例如,收集字符串列,并在找到所需的set stop时将其设置为true,以转到下一行。
外部链接 : 忙于HSSF和XSSF功能的开发人员指南
这是一个应该起作用的例子。
Maven依赖项:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>
码:
import org.apache.poi.hssf.usermodel.HSSFDataFormatter;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
public class StackOverflowQuestion18095443 {
public static void main(String[] args) {
if(args.length != 1) {
System.out.println("Please specify the file name as a parameter");
System.exit(-1);
}
String sfilename = args[0];
File file = new File("C:\\Users\\student3\\" + sfilename + ".xls");
read(file);
}
public static void read(File file) {
try (InputStream in = new FileInputStream(file)) {
HSSFDataFormatter formatter = new HSSFDataFormatter();
Workbook workbook = WorkbookFactory.create(in);
Sheet sheet = workbook.getSheetAt(0);
Iterator<Row> rowIterator = sheet.iterator();
while (rowIterator.hasNext()) {
Row row = rowIterator.next();
StringBuilder rowText = new StringBuilder();
Iterator<Cell> cellIterator = row.cellIterator();
while (cellIterator.hasNext()) {
Cell cell = cellIterator.next();
String cellAsStringValue = formatter.formatCellValue(cell);
rowText.append(cellAsStringValue).append(" ");
}
System.out.println(rowText.toString().trim());
}
} catch (InvalidFormatException | IOException e) {
e.printStackTrace();
}
}
}
至于终止迭代,您可以有条件地退出循环。 或者,您也可以不使用迭代器。 请注意,您可以使用命名引用从行中获取单元格(这使您可以按名称引用单元格,例如“ A2”,就像在Excel中一样)或仅通过行中的列索引即可。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.