Сопоставление Java Excel/POJO с POIJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Сопоставление Java Excel/POJO с POI

Сообщение Anonymous »

В Java 8 используется Apache POI 4.1 для загрузки файлов Excel (XLSX) в память и записи списков Java-бинов/POJO обратно в новые файлы Excel.

Чтобы Для меня файл Excel (по крайней мере, тот, с которым я работаю) на самом деле представляет собой список POJO, где каждая строка представляет собой отдельный экземпляр POJO, а каждый столбец — другое значение поля для этого экземпляра. Обратите внимание:

Изображение


Здесь у меня может быть POJO под названием Car, а приведенный выше пример электронной таблицы — List:

Код: Выделить всё

@Getter
@Setter
public class Car {

private String manufacturer;
private String model;
private String color;
private String year;
private BigDecimal price;

}
Итак, у меня есть работающий код, который будет читать файл Excel ("

Код: Выделить всё

new-cars.xlsx
") в List, обработайте этот список, а затем запишите обработанный список обратно в выходной файл, скажем, "

Код: Выделить всё

processed-cars.xlsx
":

Код: Выделить всё

// 1. Load excel file into a List
InputStream inp = new FileInputStream("new-cars.xlsx");
Workbook workbook = WorkbookFactory.create(inp);
Iterator iterator = workbook.getSheetAt(0).iterator();

List carsInventory = new ArrayList();
while (iterator.hasNext()) {

Car car = new Car();

Row currentRow = iterator.next();

// don't read the header
if (currentRow.getRowNum() == 0) {
continue;
}

Iterator cellIterator = currentRow.iterator();

while (cellIterator.hasNext()) {

Cell currentCell = cellIterator.next();
CellAddress address = currentCell.getAddress();

if (0 == address.getColumn()) {
// 1st col is "Manufacturer"
car.setManufacturer(currentCell.getStringCellValue());
} else if (1 == address.getColumn()) {
// 2nd col is "Model"
car.setModel(currentCell.getStringCellValue());
} else if (2 == address.getColumn()) {
// 3rd col is "Color"
car.setColor(currentCell.getStringCellValue());
} else if (3 == address.getColumn()) {
// 4th col is "Year"
car.setYear(currentCell.getStringCellValue());
} else if (4 == address.getColumn()) {
// 5th col is "Price"
car.setPrice(BigDecimal.valueOf(currentCell.getNumericCellValue()));
}

}

carsInventory.add(car);

}

// 2. Process the list of Cars; doesn't matter what this does
List processedInventory = processInventory(carsInventory);

// 3. Output to "processed-cars.xlsx"
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("Processed Inventory");
int rowNum = 0;

// create headers
Row headerRow = sheet.createRow(rowNum);
headerRow.createCell(0).setCellValue("Manufacturer");
headerRow.createCell(1).setCellValue("Model");
headerRow.createCell(2).setCellValue("Color");
headerRow.createCell(3).setCellValue("Year");
headerRow.createCell(4).setCellValue("Price");

rowNum++;

// rip through the cars list and convert each one into a subsequent row
for (Car processedCar : processedInventory) {

Row nextRow = sheet.createRow(rowNum);

nextRow.createCell(0).setCellValue(processedCar.getManufacturer());
nextRow.createCell(1).setCellValue(processedCar.getModel());
nextRow.createCell(2).setCellValue(processedCar.getColor());
nextRow.createCell(3).setCellValue(processedCar.getYear());
nextRow.createCell(4).setCellValue(processedCar.getPrice().doubleValue());

rowNum++;

}

FileOutputStream fos = new FileOutputStream("processed-cars.xlsx");
workbook.write(fos);

workbook.close();

Хотя это работает, мне это кажется очень уродливым/неприятным. Я использовал картографы JSON (Jackson, GSON и т. д.), картографы XML (XStream) и инструменты OR/M (Hibernate) в течение многих лет, и мне пришло в голову, что API POI (или какая-то другая библиотека) может предлагать «< em>mapper-esque", которое позволило бы мне сопоставлять/привязывать данные Excel к/из списка POJO с минимальным кодом и максимальной элегантностью. Однако я нигде не могу найти такой функции. Возможно, это потому, что его не существует, или, может быть, я просто ищу не те ключевые слова.

В идеале что-то вроде:

Код: Выделить всё

// Annotate the fields with something that POI (or whatever tool) can pick up
@Getter
@Setter
public class Car {

@ExcelColumn(name = "Manufacturer", col = 0)
private String manufacturer;

@ExcelColumn(name = "Model", col = 1)
private String model;

@ExcelColumn(name = "Color", col = 2)
private String color;

@ExcelColumn(name = "Year", col = 3)
private String year;

@ExcelColumn(name = "Price", col = 4)
private BigDecimal price;

}

// 2. Now load the Excel into a List
InputStream inp = new FileInputStream("new-cars.xlsx");
List carsInventory = WorkbookFactory.create(inp).buildList(Car.class);

// 3. Process the list
List processedInventory = processInventory(carsInventory);

//4. Write to a new file
WorkbookFactory.write(processInventory, "processed-cars.xlsx");
Существует ли что-нибудь подобное в POI-land? Или я застрял на том, что получил?

Подробнее здесь: https://stackoverflow.com/questions/589 ... ing-in-poi
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»