Я пытаюсь получить конкретные данные с листа excel. Данные динамические. Это может быть что угодно. Заголовки столбцов - единственные вещи, которые я могу использовать для заполнителей, но позиции заголовка столбца могут различаться в листе.Получение конкретных данных с листа excel JAVA
Например у меня есть лист, как это:
| Имя | Фамилия | Значение |
| bar | poo | 5 |
| baz | foo | 7 |
Но, к примеру, мне нужно пересечь лист, чтобы получить столбец фамилии, а затем, если я найду фамилию = 'poo', я должен вытащить соответствующее значение, которое на листе находится в следующем столбце, но это динамическое. Столбец фамилии и значения всегда рядом друг с другом, они могут находиться в любом положении вверху. Но если я найду конкретную «вещь» в столбце фамилии, мне нужно потянуть ее значение.
Мне удалось пройти через лист и сохранить все данные в массиве 2d И отобразить эти данные. из проведенного исследования, это не эффективный подход, поскольку перемещение и хранение больших данных с листов может использовать много памяти. Ive прочитал, что вы можете прочитать лист Excel и вместо сохранения этих значений в массиве вы можете сразу их записать на другой лист, если они соответствуют определенному условию. EG: (pseudo) Если (columnheader == surname & & фамилия == foo), то получите соответствующее значение, а затем напишите это значение на новый лист.
Хорошо, так что мои вопросы:
1.How ли я достичь перебора листа не хранить его в массиве и писать его прямо на другой лист, если он соответствует условию?
2. Из кода, который у меня ниже, как мне достичь сортировки по данным в массиве и найти, если surname = 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(); \t \t
\t \t //Create a blank sheet
\t \t XSSFSheet sheet = workbook.createSheet("data");
\t \t
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();
}
}
Приведите полный пример и желаемый результат.Вы упоминаете сортировку, но я не совсем понимаю, что вы имеете в виду. – alkis
привет, поэтому в основном от этого превосходный лист. Я хочу повторить и найти конкретные значения. Например, теперь, когда я получил все данные в массиве, мне нужно делать что-то с ним. Например: Результат, который я ищу, когда я нахожу столбец Surname, найдите значение «foo», и когда вы найдете foo, перейдите к значению и получить соответствующее число. Если вы посмотрите на демо-лист, значение для «foo» равно «7». Но как получить местоположение foo и связать его со значением 7, если позиции заголовка столбца динамичны? – JavaPotter