如何将Excel工作表转换为Json

时间:2018-03-27 08:30:09

标签: java json excel spring-boot

我有一个任务是读取文件(特别是excel表),并将其转换为JSON以进行API调用。

Excel数据:

MAIN_ID  SUB_ID    VALUE
1000     1000-A1    10
1000     1000-A2    15
1000     1000-A3    20 // MAX Value against MAIN_ID
1001     1001-A1    12
1001     1001-A2    14
1001     1001-A3    25 // MAX Value against MAIN_ID

我的要求:

修改:

我忘记在这里添加一个必需的逻辑,因为我正在创建JSON,我需要将Max VALUE设置为对MAIN_ID的VALUE。

即我需要创建一个JSON文件,如:

{
   "data": [
      {
         "MAIN_ID": "1000",
         "SUB_ID": "1000-A1",
         "VALUE": "20"
      },
      {
         "MAIN_ID": "1000",
         "SUB_ID": "1000-A2",
         "VALUE": "20"
      },
      {
         "MAIN_ID": "1000",
         "SUB_ID": "1000-A3",
         "VALUE": "20"
      },
      {
         "MAIN_ID": "1001",
         "SUB_ID": "1001-A1",
         "VALUE": "25"
      },
      {
         "MAIN_ID": "1001",
         "SUB_ID": "1001-A2",
         "VALUE": "25"
      },
      {
         "MAIN_ID": "1001",
         "SUB_ID": "1001-A3",
         "VALUE": "25"
      }
   ]
}

3 个答案:

答案 0 :(得分:0)

我认为您的Excel工作表并不复杂,因此可以存储为CSV格式。从那里,您可以解析CSV文件,然后将其写为JSON文件,许多库已经支持这两个任务。显然,您可以在此过程中实现任何所需的逻辑。

这是一个简单的代码:

public class Model {
    @JsonProperty("MAIN_ID")
    private String mainId;
    @JsonProperty("SUB_ID")
    private String subId;
    @JsonProperty("VALUE")
    private String value;

    public String getMainId() { ... }
    public String setMainId(String mainId) { ... }
    // other getters and settters
}

public class JacksonProgram {

    public static void main(String[] args) throws Exception {
        File input = new File("/x/data.csv");
        File output = new File("/x/data.json");

        List<Model> data = readObjectsFromCsv(input);
        applyRequiredLogic(data);
        writeAsJson(data, output);
    }

    public static void applyRequiredLogic(List<Model> data) {
        //... your logic here
    }

    public static List<Model> readObjectsFromCsv(File file) throws IOException {
        CsvMapper csvMapper = new CsvMapper();
        CsvSchema bootstrap = csvMapper.schemaFor(Model.class).withHeader();
        CsvMapper csvMapper = new CsvMapper();
        MappingIterator<Model> mappingIterator = csvMapper.reader(Model.class).with(bootstrap).readValues(file);

        return mappingIterator.readAll();
    }

    public static void writeAsJson(List<Model> data, File file) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        mapper.writeValue(file, data);
    }
}

上面的代码使用com.fasterxml.jackson.dataformat:jackson-dataformat-csv:2.+com.fasterxml.jackson.core:jackson-databind:2.+作为依赖项,因此请在使用代码之前将这两者声明为maven或gradle依赖项。

答案 1 :(得分:0)

您可以像这样简单地将对象转换为toJson;

public String toJson(ArrayList<Object> objects){
    String result="[";
    for(int i=0;i<objects.getSize();i++){
     result+="{";
     result+="MAIN_ID:"+ objects.get(i).mainId+",";
     result+="SUB_ID:"+ objects.get(i).subId+",";
     result+="VALUE:"+ objects.get(i).value+",";
     result+="}";
     if(i<object.getSize()-1){
      result+=",";
    }
   }
result+=']';
return result;
}

尝试Apache POI HSSF。以下是有关如何阅读Excel文件的示例:

try {
    POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(file));
    HSSFWorkbook wb = new HSSFWorkbook(fs);
    HSSFSheet sheet = wb.getSheetAt(0);
    HSSFRow row;
    HSSFCell cell;

    int rows; // No of rows
    rows = sheet.getPhysicalNumberOfRows();

    int cols = 0; // No of columns
    int tmp = 0;

    // This trick ensures that we get the data properly even if it doesn't start from first few rows
    for(int i = 0; i < 10 || i < rows; i++) {
        row = sheet.getRow(i);
        if(row != null) {
            tmp = sheet.getRow(i).getPhysicalNumberOfCells();
            if(tmp > cols) cols = tmp;
        }
    }

    for(int r = 0; r < rows; r++) {
        row = sheet.getRow(r);
        if(row != null) {
            for(int c = 0; c < cols; c++) {
                cell = row.getCell((short)c);
                if(cell != null) {
                    // Your code here
                }
            }
        }
    }
} catch(Exception ioe) {
    ioe.printStackTrace();
}

**编辑:**您可以根据MAIN_ID更新列表值字段 您可以在更新对象列表之后迭代列表并创建新列表mainIdAndValueList(MainId-Value)

答案 2 :(得分:0)

有一个非常强大且免费的数据清理工具,名为OpenRefine(以前称为Google Refine),可以用于此目的。它不是为此目的而做广告的,但它做得非常好。请注意,必须安装64位Java。

我建议您在使用数据之前先阅读其3个简短的视频教程。 OpenRefine不会破坏您的数据,因为它可以与本地计算机上的数据的内存副本一起使用;本教程可帮助您更好地理解和使用该工具。

准备就绪后,创建一个新项目。在创建项目时,将生成JSON。您可以通过选择“导出”然后选择“模板化”来查看将输出的JSON。将打开“模板导出”窗口,并在右侧面板中显示要导出的JSON。如果已经按照自己的喜好对其进行了格式化,只需单击“导出”按钮,就可以完成。如果没有,您可以通过调整左侧一个或多个面板中的设置来修改模板。

如果需要调整数据,请返回项目,进行必要的调整,然后返回“模板导出”窗口。

通过OpenRefine,您可以做很多事情来调整日期。如果您经常使用数据,这是一个很好的工具。您可以在openrefine.org上找到它。