我的要求是从excel表中获取数据,并使用java将数据转换为嵌套的json文件。不仅仅是创建一个键,json的值类型,而是一个复杂而动态的类型,它基于输入到excel中的数据进行计算。
上述数据从所附的excel应转换成下面的json。
{
"Summary": {
"Deposit": [
"Contribution amt",
"Withdrawal amt"
],
"AXA Admin": [
"Restrict Code",
"User area"
]
},
"Coverage": {
"Benefit Details": [
"GMDB code",
"Adjusted GMDB"
]
}
}
我试过了
public static JsonObject getExcelDataAsJsonObject(String excelPath) throws Exception {
File excelFile = new File(excelPath);
JsonObject sheetsJsonObject = new JsonObject();
Workbook workbook = new XSSFWorkbook(excelFile);
JsonArray sheetArray = new JsonArray();
ArrayList<String> columnNames = new ArrayList<String>();
Sheet sheet = workbook.getSheetAt(0);
Iterator<Row> sheetIterator = sheet.iterator();
while (sheetIterator.hasNext()) {
Row currentRow = sheetIterator.next();
JsonObject jsonObject = new JsonObject();
// store column names
for (int k = 0; k < currentRow.getPhysicalNumberOfCells(); k++)
columnNames.add(currentRow.getCell(k).getStringCellValue());
if (currentRow.getRowNum() != 0) {
for (int j = 0; j < columnNames.size(); j++) {
if (currentRow.getCell(j) != null) {
if (currentRow.getCell(j).getCellTypeEnum() == CellType.STRING)
jsonObject.addProperty(columnNames.get(j), currentRow.getCell(j).getStringCellValue());
else if (currentRow.getCell(j).getCellTypeEnum() == CellType.NUMERIC)
jsonObject.addProperty(columnNames.get(j), currentRow.getCell(j).getNumericCellValue());
else if (currentRow.getCell(j).getCellTypeEnum() == CellType.BOOLEAN)
jsonObject.addProperty(columnNames.get(j), currentRow.getCell(j).getBooleanCellValue());
else if (currentRow.getCell(j).getCellTypeEnum() == CellType.BLANK)
continue;
// jsonObject.addProperty(columnNames.get(j), "");
} else
continue;
// jsonObject.addProperty(columnNames.get(j), "");
}
sheetArray.add(jsonObject);
}
}
sheetsJsonObject.add(workbook.getSheetName(0), sheetArray);
return sheetsJsonObject;
}
上面的代码将第一行作为键,下面的行作为值,并迭代到最后一行数据。
它在控制台里打印了这个,
{"Sheet1":[{},{},{},{},{},{},{"Summary":"Coverage"},{},{},{}]}
1条答案
按热度按时间6qftjkof1#
首先,问题是如何读取以这种方式存储在Excel工作表中的数据。这种数据存储方式与电子表格数据通常存储在工作表中的方式无关。看起来好像有人试图模仿表中的JSON。这很不寻常,但就这样吧。
图纸按行存储。在您的情况下,每行可能有一个存储以下含义的单元格:
知道了这一点,从中生成JSON的最简单方法是使用StringBuilder来附加找到的键和/或数组项,并使用开始和结束标记来删除。要打开一个对象,需要使用“{”。要打开一个数组,使用“[”。要关闭一个对象,当另一个对象跟随时,使用“}”。若要关闭一个数组,当另一个数组跟随时,使用“]”。若要关闭一个对象,如果没有其他对象跟随,则使用“}”。若要关闭一个数组,当没有其他数组跟随时,使用“]”。数组项打开时不带标记,当后面有另一个时使用“,”关闭,当后面没有其他时不带标记。
下面的代码实现了该逻辑。生成JSON文本。
为了验证JSON是否有效,它使用org.json.JSONObject从该文本构造
JSONObject
。