Я пытаюсь получить конкретные данные из листа Excel, данные динамические. Это может быть что угодно на самом деле. Заголовки столбцов — это единственное, что я могу использовать для заполнителей, но позиции заголовков столбцов могут различаться на листе.
Например, у меня есть такой лист:
|Имя| Фамилия| Значение|
|бар | какашки | 5|
|баз | фу | 7|
Но, например, мне нужно пройти лист, чтобы получить столбец фамилии, а затем, если я найду фамилию = 'poo', я должен затем вытащить соответствующее значение, которое на листе находится в следующем столбце, но это динамично. Столбец фамилия и значение не всегда рядом друг с другом, они могут быть в любом месте вверху. Но если я нахожу конкретную «вещь» в столбце фамилии, мне нужно получить ее значение.
Мне удалось пройти через лист и сохранить все данные в массиве 2d и отобразить эти данные. судя по проведенным исследованиям, это неэффективный подход, поскольку перемещение и хранение больших данных из листов может использовать много памяти. Я читал, что вы можете читать лист Excel и вместо того, чтобы сохранять эти значения в массиве, вы можете сразу же записать их на другой лист, если они соответствуют определенному условию. Например: (псевдо) If(columnheader == surname && surname == foo), затем получите соответствующее значение, затем запишите это значение на новый лист.
Итак, мои вопросы:
1. Как мне выполнить итерацию по листу, не сохраняя его в массиве, и записывая его прямо на другой лист, если он соответствует условию?
2. Из кода, который у меня есть ниже, как мне добиться сортировки данных в массиве и найти, если фамилия = foo получает соответствующее значение?
Как я уже сказал, данные на листе являются динамическими, за исключением заголовков столбцов, но их позиции в качестве заголовков являются динамическими.
Извините за длинное сообщение, любая помощь будет принята с благодарностью.
package demo.poi;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.math.BigDecimal;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class test {
public static void main(String[] args) throws Exception {
File excel = new File("test.xlsx");
FileInputStream fis = new FileInputStream(excel);
XSSFWorkbook wb = new XSSFWorkbook(fis);
XSSFSheet ws = wb.getSheetAt(0);
ws.setForceFormulaRecalculation(true);
int rowNum = ws.getLastRowNum() + 1;
int colNum = ws.getRow(0).getLastCellNum();
int surnameHeaderIndex = -1, valueHeaderIndex = -1;
//Read the headers first. Locate the ones you need
XSSFRow rowHeader = ws.getRow(0);
for (int j = 0; j < colNum; j++) {
XSSFCell cell = rowHeader.getCell(j);
String cellValue = cellToString(cell);
if("SURNAME".equalsIgnoreCase(cellValue)) {
surnameHeaderIndex = j;
} else if("VALUE".equalsIgnoreCase(cellValue)) {
valueHeaderIndex = j;
}
}
if(surnameHeaderIndex == -1 || valueHeaderIndex == -1) {
throw new Exception("Could not find header indexes\nSurname : " + surnameHeaderIndex + " | Value : " + valueHeaderIndex);
}
//createnew workbook
XSSFWorkbook workbook = new XSSFWorkbook();
//Create a blank sheet
XSSFSheet sheet = workbook.createSheet("data");
for (int i = 1; i < rowNum; i++) {
XSSFRow row = ws.getRow(i);
row = sheet.createRow(rowNum++);
String surname = cellToString(row.getCell(surnameHeaderIndex));
String value = cellToString(row.getCell(valueHeaderIndex));
int cellIndex = 0;
row.createCell(cellIndex++).setCellValue(surname);
row.createCell(cellIndex++).setCellValue(value);
}
FileOutputStream fos = new FileOutputStream(new File("test1.xlsx"));
workbook.write(fos);
fos.close();
}
public static String cellToString(XSSFCell cell) {
int type;
Object result = null;
type = cell.getCellType();
switch (type) {
case XSSFCell.CELL_TYPE_NUMERIC:
result = BigDecimal.valueOf(cell.getNumericCellValue())
.toPlainString();
break;
case XSSFCell.CELL_TYPE_STRING:
result = cell.getStringCellValue();
break;
case XSSFCell.CELL_TYPE_BLANK:
result = "";
break;
case XSSFCell.CELL_TYPE_FORMULA:
result = cell.getCellFormula();
}
return result.toString();
}
}