Как прочитать файл excel из java-кода, который является внешним по отношению к системе?

Я использую java (eclipse) для чтения содержимого файла excel и сохранения его в списке объектов строк. Чтобы прочитать файл, я указал путь к файлу в коде. В данном случае это что-то вроде D:/Refreshed_data_daily/all_hue_posts_in_excel.xlsx. Что, если код присутствует в каком-то другом месте, то есть в какой-то другой системе, путь не обязательно должен быть таким же. Как мне справиться с такой ситуацией?

открытый класс FacebookDataList{

private static final String FILE_NAME="D:/Refreshed_data_daily/all_hue_posts_in_excel.xlsx";
private static final String SHEET_NAME="nextv54plus_actions";
XSSFWorkbook workbook;

public static void main(String[] args){

    FacebookDataList obj= new FacebookDataList();
    List<FacebookFields> displayList= new ArrayList<FacebookFields>();
    displayList=obj.getTheDataIntoList();
    System.out.println("The Size of the list is:"+ displayList.size());
}

public List<FacebookFields> getTheDataIntoList() {
    List<FacebookFields> fbList= new ArrayList<FacebookFields>();
    try
    {
        FileInputStream fin= new FileInputStream(FILE_NAME);
        workbook= new XSSFWorkbook(fin);
        int sheetIndex=0;
        for (Sheet sheet : workbook) {
            readSheet(sheet,sheetIndex ++, fbList);}

    }catch(FileNotFoundException e){
        e.printStackTrace();
    }
    catch(IOException e){
        e.printStackTrace();
    }
    return fbList;
}

private void readSheet(Sheet sheet, int sheetIndex , List<FacebookFields> fbList) {

    if(SHEET_NAME.equals(sheet.getSheetName())){
        workbook.removeSheetAt(sheetIndex);
        return;
    }
    for (Row row : sheet){
        if (row.getRowNum() > 0)
            fbList.add(readRow(row));}

}

private FacebookFields readRow(Row row) {

    FacebookFields record= new FacebookFields();
    for (Cell cell : row) {
        switch (cell.getColumnIndex()) {
        case 0: record.setName(cell.getStringCellValue()); 
        break; 
        case 1: record.setId(cell.getStringCellValue()); 
        break; 
        case 2: record.setDate(cell.getStringCellValue());
        break; 
        case 3: record.setMessage(cell.getStringCellValue());
        break; 
        case 4: record.setType(cell.getStringCellValue());
        break; 
        case 5: record.setPage(cell.getStringCellValue());
        break; 
        case 6: record.setLikeCount(String.valueOf(cell.getNumericCellValue()));
        break; 
        case 7: record.setCommentCount(String.valueOf(cell.getNumericCellValue())); 
        break; 
        case 8: record.setShareCount(String.valueOf(cell.getNumericCellValue())); 
        break; 
        }
    }

    return record;
}

public boolean checkIfListContainsData() {

    List<FacebookFields> checkList= getTheDataIntoList();   
    return !checkList.isEmpty() ;
}

}


person ShridharBavannawar    schedule 06.10.2015    source источник
comment
Упомяните ваши запросы правильно. Какое приложение либо автономное, либо веб-приложение? Это расположение файла будет меняться динамически?   -  person Vignesh Shiv    schedule 06.10.2015


Ответы (3)


Вы можете попросить пользователя ввести местоположение с самого начала. Или пусть он обращается к тому месту, где он должен быть, и возвращает пользователю ошибку, если файл отсутствует.

person user987654321    schedule 06.10.2015
comment
Даже у меня была такая же возможность получить ввод от пользователя. Но я не знаю, как мне это сделать. Можете ли вы помочь мне с этим? - person ShridharBavannawar; 06.10.2015

Добавьте его в файл конфигурации. Я написал следующий класс для объекта файла конфигурации. Конфигурация должна находиться внутри файла с именем config.properties в пути выполнения.

https://github.com/achinthagunasekara/JavaConfigFileReader

Нечто подобное хорошо работает для хранения конфигурации приложения.

Файл конфигурации

ConfigItem1=ItemValue1
.
.
.
ConfigItemN=ItemValueN

Java-класс

package Config;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;

/**
 *
 * @author Achintha Gunasekara
 * @date 07.09.2015
 */

public class ConfigFileReader {

    //Configuration file used by the config reader
    //config file must be located inside the application path
    private final String file = "config.properties";
    private Properties properties;
    private static ConfigFileReader instance;

    public static ConfigFileReader getConfigFileReaderInstance() throws IOException {

        //there can only be once instance of the config reader
        if(instance == null) {

            instance = new ConfigFileReader();
        }

        return instance;
    }

    private ConfigFileReader() throws IOException {

        loadConfig(file);
    }

    //read and load the config file
    private void loadConfig(String configFile) throws IOException {

        properties = new Properties();
        properties.load(new FileInputStream(configFile));
    }

    //reloads the configuration during runtime
    public void reloadConfig() throws IOException {

        loadConfig(file);
    }

    //reloads the configuration during runtime from a provided configuration file
    public void reloadConfig(String configFile) throws IOException {

        loadConfig(configFile);
    }

    //get the propery value for strng s
    public String getPropertyFor(String configItem) throws Exception {

        String value = properties.getProperty(configItem);

        if(value == null) {

            throw new Exception(configItem + " not found!");
        }

        return value;
    }
    //returns int property
    public Integer getIntPropertyFor(String configItem) throws Exception {

        return Integer.parseInt(getPropertyFor(configItem));
    }

    //returns double property
    public Double getDoublePropertyFor(String configItem) throws Exception {

        return Double.parseDouble(getPropertyFor(configItem));
    }

    //returns bool property
    public Boolean getBooleanPropertyFor(String s) throws Exception {

        return Boolean.parseBoolean(getPropertyFor(s));
    }
}
person Achintha Gunasekara    schedule 06.10.2015
comment
В чем преимущество добавления имени пути в config.properties? Я не понимаю! Вы можете объяснить? - person ShridharBavannawar; 07.10.2015

Аргументы строкового массива определены здесь

public static void main(String[] args)

содержит аргументы командной строки, переданные при выполнении класса, или могут быть переданы в конфигурации запуска eclipse.

изменить функцию на

public List<FacebookFields> getTheDataIntoList(String filePath)

и используйте filePath при инициализации входного потока файла

person codernaut    schedule 06.10.2015