Home > Mobile >  apache poi convert excel to json
apache poi convert excel to json

Time:07-14

ExcelToJson converter

public JsonNode excelToJson(File excel) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
            // hold the excel data sheet wise
            ObjectNode excelData = mapper.createObjectNode();
            FileInputStream fis = null;
            Workbook workbook = null;
            try {
                // Creating file input stream
                fis = new FileInputStream(excel);

                String filename = excel.getName().toLowerCase();
                if (filename.endsWith(".xls") || filename.endsWith(".xlsx")) {
                    // creating workbook object based on excel file format
                    if (filename.endsWith(".xls")) {
                        workbook = new HSSFWorkbook(fis);
                    } else {
                        workbook = new XSSFWorkbook(fis);
                    }

                    // Reading each sheet one by one
                    for (int i = 0; i < workbook.getNumberOfSheets(); i  ) {
                        Sheet sheet = workbook.getSheetAt(i);
                        String sheetName = sheet.getSheetName();

                        List<String> headers = new ArrayList<String>();
                        ArrayNode sheetData = mapper.createArrayNode();
                        // Reading each row of the sheet
                        for (int j = 0; j <= sheet.getLastRowNum(); j  ) {
                            Row row = sheet.getRow(j);
                            if (j == 0) {
                                // reading sheet header's name
                                for (int k = 0; k < row.getLastCellNum(); k  ) {
                                    headers.add(row.getCell(k).getStringCellValue());
                                }
                            } else {
                                // reading work sheet data
                                ObjectNode rowData = mapper.createObjectNode();
                                for (int k = 0; k < headers.size(); k  ) {
                                    Cell cell = row.getCell(k);
                                    String headerName = headers.get(k);
                                    if (cell != null) {
                                        switch (cell.getCellType()) {
                                            case FORMULA:
                                                rowData.put(headerName, cell.getCellFormula());
                                                break;
                                            case BOOLEAN:
                                                rowData.put(headerName, cell.getBooleanCellValue());
                                                break;
                                            case NUMERIC:
                                                rowData.put(headerName, cell.getNumericCellValue());
                                                break;
                                            case BLANK:
                                                rowData.put(headerName, "");
                                                break;
                                            default:
                                                rowData.put(headerName, cell.getStringCellValue());
                                                break;
                                        }
                                    } else {
                                        rowData.put(headerName, "");
                                    }
                                }
                                sheetData.add(rowData);
                            }
                        }
                        excelData.set(sheetName, sheetData);
                    }
                    return excelData;
                } else {
                    throw new IllegalArgumentException("File format not supported.");
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (workbook != null) {
                    try {
                        workbook.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (fis != null) {
                    try {
                        fis.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }

            }
            return null;
    }

The method works correctly, but at the output it produces an array, which I then need to write to the database. This array forms one object and the data cannot be written to the database. Is it possible that the data would come not as an array, but as a simple list?

CodePudding user response:

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Map;

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;

public class Test {
    
    public static void main(String[] args) {
        try {
            File file = new File("FILE_PATH");
            if(file.exists()) {
                JsonNode excelData = excelToJson(file); //your excelToJson method
                System.out.println(excelData);
                
                JsonNode sheetData = excelData.withArray("SHEET_NAME"); //Get your sheet data
                System.out.println(sheetData);
                
                boolean isArray = sheetData.isArray();
                if(isArray) {
                    ArrayNode arrayNode = (ArrayNode) sheetData;
                    ObjectMapper objectMapper = new ObjectMapper();
                    List<Map<String, Object>> list = objectMapper.convertValue(arrayNode, new TypeReference<List<Map<String, Object>>>(){});    //Convert to list
                    System.out.println(list);
                }               
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

CodePudding user response:

I think you can follow the below code snippet and convert the JSON array into a Java array list that you need.

Add these classes in your import,

import java.util.ArrayList;  
import org.json.JSONArray;  
import org.json.JSONObject; 

You can create a separate method using the below code and call it in a place where you are going to pass the JSON array to get the List. While using it remove the sample JSON data and the JSON object creation part as you will be already having the JSON array with you. Pass the JSON array as a parameter and start adding the JSON data into your list.

public static void main(String[] args){  
        //Creating string of JSON data   
        String jsonData = "{\"languages\" : [{\"name\": \"Java\", \"description\":"  
                  " \" Java is a class-based high-level programming language that"  
                  " follows the OOPs concepts.\"},{\"name\": \"Javascript\","  
                  "\"description\": \"JavaScript is also a high-level, often "  
                  "just-in-time compiled, and multi-paradigm programming language."  
                  "\"},{\"name\": \"Python\",\"description\": \"Python is another "  
                  "high-level, interpreted and general-purpose programming language."  
                  "\"}]}";  
          
        //Converting jsonData string into JSON object  
        JSONObject jsnobject = new JSONObject(jsonData);  
        //Printing JSON object  
        System.out.println("JSON Object");  
        System.out.println(jsnobject);  
        //Getting languages JSON array from the JSON object  
        JSONArray jsonArray = jsnobject.getJSONArray("languages");  
        //Printing JSON array  
        System.out.println("JSON Array");  
        System.out.println(jsonArray);  
        //Creating an empty ArrayList of type Object  
        ArrayList<Object> listdata = new ArrayList<Object>();  
          
        //Checking whether the JSON array has some value or not  
        if (jsonArray != null) {   
              
            //Iterating JSON array  
            for (int i=0;i<jsonArray.length();i  ){   
                  
                //Adding each element of JSON array into ArrayList  
                listdata.add(jsonArray.get(i));  
            }   
        }  
        //Iterating ArrayList to print each element  
  
        System.out.println("Each element of ArrayList");  
        for(int i=0; i<listdata.size(); i  ) {  
            //Printing each element of ArrayList  
            System.out.println(listdata.get(i));  
        }  
    }  

Output:

JSON Object
{"languages":[{"name":"Java","description":"Java is a class-based high-level programming language that follows the OOPs concepts."},{"name":"Javascript","description":"JavaScript is also a high-level, often just-in-time compiled, and multi-paradigm programming language."},{"name":"Python","description":"Python is another high-level, interpreted and general-purpose programming language."}]}

JSON Array
[{"name":"Java","description":"Java is a class-based high-level programming language that follows the OOPs concepts."},{"name":"Javascript","description":"JavaScript is also a high-level, often just-in-time compiled, and multi-paradigm programming language."},{"name":"Python","description":"Python is another high-level, interpreted and general-purpose programming language."}]

Each element of ArrayList
{"name":"Java","description":"Java is a class-based high-level programming language that follows the OOPs concepts."}
{"name":"Javascript","description":"JavaScript is also a high-level, often just-in-time compiled, and multi-paradigm programming language."}
{"name":"Python","description":"Python is another high-level, interpreted and general-purpose programming language."}

If you have any further doubts refer to here

  • Related