动态读取Excel并将其存储在地图中

时间:2019-01-31 06:43:00

标签: java excel dictionary

我的要求是动态读取Excel并将内容存储在Map中。标头应该是键,相应的列应该是值,以便在传递键时可以获取单元格值。

我的Excel工作表包含可以动态更改的多行和多列。我的意图是在Java中编写一个通用函数来读取Excel并将内容存储在map中。键应为列标题,并且值应为标题的相应单元格值。因此,当我通过标题键进行检索时,我应该接收相应的单元格值。我的计划是在方法中传递行号和键,以便它可以检索与该行以及键有关的各个单元格值

static Map<String> excelMap = new LinkedHashMap<String>();

public static String readWriteExcel(String sheetName) throws EncryptedDocumentException, InvalidFormatException, IOException, JSONException
{
    File file = new File("File Path");
    FileInputStream inputStream = new FileInputStream( file );
    Workbook workbook = WorkbookFactory.create( inputStream );

    Sheet sheet = workbook.getSheet( sheetName );

    int rowNumber =0;
    int rowCount = sheet.getLastRowNum(); 
    for(int i=1;i<=rowCount;i++){
        Row row = sheet.getRow(0);
        for(int j=0;j<row.getLastCellNum();j++) {
            String key=row.getCell(j).getStringCellValue();
            String value=sheet.getRow(rowNumber+1).getCell(j).getStringCellValue();
            excelMap.put(key, value);
        }
    }

}

2 个答案:

答案 0 :(得分:0)

由于要映射多行,因此必须存储多行。

一种方法是存储包含column-> list的映射,该列表包含每行的值。

另一种方法是存储由列+行号->值组成的映射。

第二种方法的示例代码:

static Map<String, String> excelMap = new LinkedHashMap<String, String>();
...
// storing values
excelMap.put(key + "_" + i, value); // i is row index
...
// getting values
public static String getCellValue(String cellName, int rowIndex) {
    return excelMap.get(cellName + "_" + rowIndex);
}

答案 1 :(得分:0)

通过查看代码,我正在假设问题所在:工作表中存在多行,但是您仅获得第一行的数据。

解决方案: 首先,您需要将所有行数据存储在Map列表中。其中列表索引对应于行号。另外,您不会在任何地方增加rowNumber变量。始终为0。 为什么不直接使用变量i从工作表中获取特定行?

我认为这应该可行。

static List<Map<String, String>> excelData = new ArrayList<HashMap<String, String>>();

public static String readWriteExcel(String sheetName) throws EncryptedDocumentException, InvalidFormatException, IOException, JSONException
{
    File file = new File("File Path");
    FileInputStream inputStream = new FileInputStream( file );
    Workbook workbook = WorkbookFactory.create( inputStream );

    Sheet sheet = workbook.getSheet( "sheetName" );
    int rowCount = sheet.getLastRowNum(); 
    for(int i=1;i<=rowCount;i++){
        Row row = sheet.getRow(0);
        Map<String,String> rowData = new HashMap<>();
        for(int j=0;j<row.getLastCellNum();j++) {
            String key=row.getCell(j).getStringCellValue();
            String value=sheet.getRow(i).getCell(j).getStringCellValue();
            rowData.put(key, value);
        }
        excelData.add(rowData);
    }

}