Как прочитать файл Excel и преобразовать его в абстрактный класс Java? - PullRequest
0 голосов
/ 04 июля 2018

Я работаю над веб-приложением, и одна из задач, которую мне нужно выполнить, - добавить функцию импорта в Excel, которая будет читать файл xlsx и преобразовывать его в список абстрактных классов.

Преобразовать его в класс легко, и существует множество учебных пособий о том, как это сделать, но в абстрактном классе их нет.

Абстрактный класс называется AbstractQuestion, который представляет вопросы, и существует несколько типов вопросов, таких как вопрос с одним выбором, вопрос с множественным выбором и текстовый вопрос.

По сути, каждая строка файла Excel может относиться к разным типам вопросов, и мне нужно вернуть список AbstractQuestion в конце. Более того, вопрос с несколькими вариантами ответов может иметь до 10 вариантов.

AbstractQuestion:

@SuppressWarnings("serial")
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "question_type", discriminatorType = 
DiscriminatorType.STRING)
public abstract class AbstractQuestion implements Serializable{

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;

@Column(name="code", nullable=false)
private String code;

@Column(name="question", nullable=false)
private String question;

@Version
private long version;

private @OneToMany(mappedBy="question")
List<AbstractAnswer> answers = new ArrayList<AbstractAnswer>();

public AbstractAnswer currentUserAnswer;

public AbstractQuestion() {
    super();
    // TODO Auto-generated constructor stub
}



public long getId() {
    return id;
}



public void setId(long id) {
    this.id = id;
}



public String getCode() {
    return code;
}



public void setCode(String code) {
    this.code = code;
}



public String getQuestion() {
    return question;
}



public void setQuestion(String question) {
    this.question = question;
}


public long getVersion() {
    return version;
}



public void setVersion(long version) {
    this.version = version;
}



public List<AbstractAnswer> getAnswers() {
    return answers;
}



public void setAnswers(List<AbstractAnswer> answers) {
    this.answers = answers;
}

public void putCurrentUserAnswer(AbstractAnswer answer) {
    this.currentUserAnswer = answer; 
}

public abstract void accept(QuestionVisitor q);
public abstract AbstractAnswer createAnswer(User user);



}

Текстовый вопрос:

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(discriminatorType = DiscriminatorType.STRING)
@DiscriminatorValue("Text")
public class TextQuestion extends AbstractQuestion {

public TextQuestion() {
    super();
}

@Override
public void accept(QuestionVisitor q) {
    q.process(this);

}

public String getType() {
    return QuestionUtility.TEXT_QUESTION;
}

@Override
public AbstractAnswer createAnswer(User user) {
    TextAnswer answer = new TextAnswer();
    answer.setAnswerer(user);
    answer.setQuestion(this);
    answer.setId(0);
    answer.setVersion(0);
    answer.setAnswered(false);
    return answer;
}
}

Вопрос с одним выбором:

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(discriminatorType = DiscriminatorType.STRING)
@DiscriminatorValue("SingleChoice")
public class SingleChoiceQuestion extends AbstractQuestion {

@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
@JoinTable(name = "singlechoice_options", joinColumns = {
        @JoinColumn(name= "parent" )
    },inverseJoinColumns = {
        @JoinColumn(name = "child")
    }
)
private List<Option> options = new ArrayList<Option>();



public SingleChoiceQuestion() {
    super();
    // TODO Auto-generated constructor stub
}

@Override
public void accept(QuestionVisitor q) {
    q.process(this);

}

public String getType() {
    return QuestionUtility.SINGLE_CHOICE_QUESTION;
}



public List<Option> getOptions() {
    return options;
}

public void setOptions(List<Option> options) {
    this.options = options;
}


@Override
public AbstractAnswer createAnswer(User user) {
    SingleChoiceAnswer answer = new SingleChoiceAnswer();
    answer.setAnswerer(user);
    answer.setQuestion(this);
    answer.setId(0);
    answer.setVersion(0);
    answer.setAnswered(false);
    return answer;
}
}

Вопрос с множественным выбором:

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(discriminatorType = DiscriminatorType.STRING)
@DiscriminatorValue("MultipleChoice")
public class MultipleChoiceQuestion extends AbstractQuestion {

@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
@JoinTable(name = "multiplechoice_options", joinColumns = {
        @JoinColumn(name= "parent" )
    },inverseJoinColumns = {
        @JoinColumn(name = "child")
    }
)
private List<Option> options = new ArrayList<Option>();


public MultipleChoiceQuestion() {
    super();
    // TODO Auto-generated constructor stub
}

@Override
public void accept(QuestionVisitor q) {
    q.process(this);

}

public String getType() {
    return QuestionUtility.MULTIPLE_CHOICE_QUESTION;
}



public List<Option> getOptions() {
    return options;
}

public void setOptions(List<Option> options) {
    this.options = options;
}


@Override
public AbstractAnswer createAnswer(User user) {
    MultipleChoiceAnswer answer = new MultipleChoiceAnswer();
    answer.setAnswerer(user);
    answer.setQuestion(this);
    answer.setId(0);
    answer.setVersion(0);
    answer.setAnswered(false);
    return answer;
}
}

Опция:

@SuppressWarnings("serial")
@Entity
@Table(name = "option")
public class Option implements Serializable{

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;

@Column(name = "option", nullable=false)
private String option;

@Column(name = "weight", nullable=false)
private int weight;

@Version
private int version;

public Option() {
    super();
    // TODO Auto-generated constructor stub
}

public long getId() {
    return id;
}

public void setId(long id) {
    this.id = id;
}

public String getOption() {
    return option;
}

public void setOption(String option) {
    this.option = option;
}


public int getWeight() {
    return weight;
}

public void setWeight(int weight) {
    this.weight = weight;
}

public int getVersion() {
    return version;
}

public void setVersion(int version) {
    this.version = version;
}
}

А теперь давайте представим этот файл Excel: файл xlsx

Цель - вернуть список AbstractQuestion. Возможно ли это сделать? Если так, как я могу это сделать? Любое возможное решение будет оценено.

Спасибо.

...