Какова хорошая стратегия для чтения отформатированного файла Excel в Java, чтобы поместить его в формате JSON? - PullRequest
0 голосов
/ 25 апреля 2019

Мне нужно подумать о стратегии чтения данных, хранящихся в листе Excel, отформатированном так, чтобы его можно было доставить в формате JSON, при условии, что они сохраняют оригинальные заголовки.

Но поскольку заголовки сложны,моя самая большая проблема;как с ними справиться, я не могу придумать хорошую стратегию, чтобы поместить их, как ожидается, в вывод.вот настоящий файл Excel, который мне нужно разложить: https://github.com/EEsparaquia/readFormattedExcel/blob/master/Book1.xlsx

-------------------------------------------------------------------
Order002                    |       |                             | 
-------------------------------------------------------------------
02X Phones                  |       |                             |
                                    -------------------------------
                            |       |   Order condition           |
-------------------------------------------------------------------
                            |       |                             |
-------------------------------------------------------------------
order | Date | Group | Desc | Comm- | Order | Type | Sub Condition|
  #   |      |       |      |  ents | Type  |      |--------------|
      |      |       |      |       |       |      | Blue  |  Red |
-------------------------------------------------------------------
  1   |12119 |   A   | 5.9  |  New  |  D40  |  2   |   90  |   2  |
      |      |       | Inch |       |       |      |       |      |
-------------------------------------------------------------------
  2   |12119 |   A   | 5.9  |  New  |  D40  |  2   |   87  |   3  |
      |      |       | Inch |       |       |      |       |      |

И мой вывод должен быть в формате JSON:

{
 "Order002":{
   "02X Phones":{
     "Order #":"1",
     "Date":"12119",
     "Group":"A",
     "Desc":"5.9 Inch",
     "Comments":"New",
     "Order Conditions":{
      "Order Type":"D40",
      "Type":"2",
      "Sub Condition":{
       "Blue":"90",
       "Red":"2"
      }
     }
    }
   }
  }

Пока я могучитать данные таблицы Excel построчно и столбец за столбцом, то есть сначала я читаю ячейку [1, A], [1, B], [1, C] ... [1, "n"] и после [2, A], [2, B], [2, C] ... [2, "n"].

Вот мой код:

import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.*;

import javax.xml.bind.annotation.XmlType;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;

public class App {

   public static final String SAMPLE_XLSX_FILE_PATH = "Book1.xlsx";

   public static void main(String []args){

    try {
        //Creating a workbook from Excel file
        Workbook workbook = WorkbookFactory.create(new File(SAMPLE_XLSX_FILE_PATH));

        //Getting the Sheet at index zero
        Sheet sheet = workbook.getSheetAt(0);

        DataFormatter dataFormatter= new DataFormatter();

        System.out.println("\n\nIterating over Rows and Columns using Java 8 forEach with lambda\n");

        sheet.forEach(row -> {
            row.forEach(cell -> {
                printCellValue(cell);

            });
            System.out.println("End of forEach - Lambda");
         });


        workbook.close();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (InvalidFormatException e) {
        e.printStackTrace();
    }
  }

  private static void printCellValue(Cell cell){
    switch (cell.getCellTypeEnum()){
        case BOOLEAN:
            System.out.println(cell.getBooleanCellValue());
            break;
        case STRING:
            System.out.println(cell.getStringCellValue());
            break;
        case NUMERIC:
            if (DateUtil.isCellDateFormatted(cell))
                System.out.println(cell.getDateCellValue());
            else
                System.out.println(cell.getNumericCellValue());
            break;
        case FORMULA:
            System.out.println(cell.getCellFormula());
            break;
        case BLANK:
            System.out.println("");
            break;
        default:
            System.out.println("");
    }
    System.out.println("\t");
   }
 }

1 Ответ

0 голосов
/ 26 апреля 2019

Я собираюсь сделать некоторые предположения о файле (так как у меня нет доступа к более чем маленькой части файла, которую вы предоставили).Я собираюсь предположить, что нет других строк заголовка, которые появляются в файле после того, как вы достигнете первой строки реальных данных.Если мое предположение неверно, вы можете предоставить еще немного файла?

Вот высокоуровневый psuedocode:

public Json parseExcel(Excel excel){
  List<List<String>> rows = excel.readRows();
  Json json = Json.array();
  int startingIndex = 4; //skip header rows
  for(int i = startingIndex; i <= rows.size(); i++){
    List<String> row = rows.get(i);
    json.add(Json.object()
        .with("orderNum", row.get(0))
        .with("date", row.get(1))
        //... all the other columns ...
        .with("subCondition", Json.object()
            .with("blue", row.get(7))
            .with("red", row.get(8)));
        );
  }
  return json;
}
...