Прочитайте xls и загрузите сущность таблицы (apache poi) - PullRequest
0 голосов
/ 26 октября 2019

У меня есть две таблицы:

@Entity
@Table(name="Drug")
public class Drug implements Serializable {
    private static final long serialVersionUID = 1L;


    @Id
    @SequenceGenerator(name="DRUG_IDDRUG_GENERATOR", sequenceName="SEQ_DRUG", allocationSize = 1)
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="DRUG_IDDRUG_GENERATOR")
    @Column(name="ID_DRUG", unique=true, nullable=false, precision=14)
    @NotNull
    private long idDrug;

    @Column(name="ORIGINAL_CODE", length=100)
    private String originalCode;

    @Column(name="NM_USER", length=30)
    private String nmUser;

    @Column(name="NM_USER_LAST_MODIFY", length=30)
    private String nmUserLastModify;

    @Column(name="TS_INSERT")
    private Timestamp tsInsert;

    @Column(name="TS_LAST_MODIFY")
    private Timestamp tsLastModify;

    //bi-directional many-to-one association to StateDrug
    @JsonIgnore
    @ManyToOne
    @JoinColumn(name="ID_STATE_DRUG", nullable=false)
    @NotNull
    @OrderColumn
    private StateDrug stateDrug;

    //bi-directional many-to-one association to StateDrug
    @ManyToOne
    @JoinColumn(name="ID_NUM", nullable=false)
    @NotNull
    @OrderColumn
    @JsonManagedReference
    private StateDrug codeNum;

    //bi-directional many-to-one association to StateDrug
    @ManyToOne
    @JoinColumn(name="ID_Drug_Shape", nullable=false)
    @NotNull
    @OrderColumn
    @JsonManagedReference
    private DrugState drugShape;

    //bi-directional many-to-one association to DrugState
    @ManyToOne
    @JoinColumn(name="ID_MISURE", nullable=false)
    @NotNull
    @OrderColumn
    @JsonManagedReference
    private DrugState misure;

    //bi-directional many-to-one association to DrugState
    @ManyToOne
    @JoinColumn(name="ID_UNITY", nullable=false)
    @NotNull
    @OrderColumn
    @JsonManagedReference
    private DrugState unity;

    //bi-directional many-to-one association to DrugState
    @ManyToOne
    @JoinColumn(name="ID_ACTIVE_PRINCIPLE", nullable=false)
    @NotNull
    @OrderColumn
    @JsonManagedReference
    private DrugState activePrinciple;


    public Drug() {
    }

    public long getIdDrug() {
        return this.idDrug;
    }

    public void setIdDrug(long idDrug) {
        this.idDrug = idDrug;
    }

    public String getOriginalCode() {
        return this.originalCode;
    }

    public void setOriginalCode(String OriginalCode) {
        this.originalCode = originalCode;
    }

    public String getNmuser() {
        return this.nmUser;
    }

    public void setNmUser(String nmUser) {
        this.nmUser = nmUser;
    }

    public String getNmUserLastModify() {
        return this.nmUserLastModify;
    }

    public void setNmUserLastModify(String nmUserLastModify) {
        this.nmUserLastModify = nmUserLastModify;
    }

    public Timestamp getTsInsert() {
        return this.tsInsert;
    }

    public void setTsInsert(Timestamp tsInsert) {
        this.tsInsert = tsInsert;
    }

    public Timestamp getTsLastModify() {
        return this.tsLastModify;
    }

    public void setTsLastModify(Timestamp tsLastModify) {
        this.tsLastModify = tsLastModify;
    }

    public DrugState getDrugState() {
        return this.drugState;
    }

    public void setDrugState(DrugState drugState) {
        this.drugState = drugState;
    }

    public DrugState getcodeNum() {
        return this.codeNum;
    }

    public void setcodeNum(DrugState codeNum) {
        this.codeNum = codeNum;
    }

    public DrugState getDrugShape() {
        return this.drugShape;
    }

    public void setDrugShape(DrugState drugShape) {
        this.drugShape = drugShape;
    }

    public DrugState getMisure() {
        return this.misure;
    }

    public void setDosaggio(DrugState misure) {
        this.misure = misure;
    }

    public DrugState getUnity() {
        return this.unity;
    }

    public void setUnity(DrugState unity) {
        this.unity = unity;
    }

    public DrugState getActivePrinciple() {
        return this.activePrinciple;
    }

    public void setActivePrinciple(DrugState activePrinciple) {
        this.activePrinciple = activePrinciple;
    }

}

DrugState - это еще одна сущность с аннотацией @OneToMany для некоторого поля, а методы получателя возвращают List.

Теперь я хотел бы создатьметод, который: - хранит файл xls (со списком лекарств), который пользователь загружает на мой сервер;- проверяет количество столбцов загруженного файла xls и, если он находит больше строк, чем количество строк в таблице Drug, сопоставьте файл xls, добавив в таблицу объект Drug.

У меня две проблемы: - некоторые поля Drug имеют нотацию ManyToOne, поэтому установить это поле нелегко;класс ячеек Apache может возвращать только Double (getNumericCellValue ()) или String (getStringCellValue ()).

Я начал писать метод, но не могу его окончательно ...

@PostMapping("/importXls")
    public void importXls (@RequestParam("pathFile") String pathFile) throws IOException {
        try ( FileInputStream file = new FileInputStream(new File("pathFile/UserFile.xls"));){
            HSSFWorkbook workbook = new HSSFWorkbook(file);

            HSSFSheet sheet = workbook.getSheetAt(0); 

            List<Drug> list = drugService.getAll();

            int totalDrugs = list.size();   
            int lastRow = sheet.getLastRowNum();

            int newDrugs = lastRow-totalDrugs;
            Drug entityToSave = new Drug();
            if (newDrugs>0) {
                Row row = sheet.getRow(totalDrugs++);
                Iterator<Cell> iterCell =row.cellIterator();
                while (iterCell.hasNext()) {
                    Cell cell = iterCell.next();
                    if (cell.getColumnIndex()==0) {
                 /* here problems start     
                  entityToSave.setOriginalCode(cell.getStringCellValue());
                    }
                    if (cell.getColumnIndex()==1) {
                        entityToSave.setCodeNum((cell.getNumericCellValue());
                    }
                    if (cell.getColumnIndex()==2) {

                entityToSave.setActivePrinciple((cell.getStringCellValue()));
                    }
                    if (cell.getColumnIndex()==3) {
                            entityToSave.setDrugShape(cell.getStringCellValue());
                    }
                    if (cell.getColumnIndex()==4) {

                    entityToSave.setMisure(cell.getStringCellValue());
                    }
                    if (cell.getColumnIndex()==5) {
                  entityToSave.setUnity(cell.getStringCellValue());
                    }
                   drugService.saveOrUpdate(entityToSave);
                   newDrugs--;
                  */
               }
           }
           FileOutputStream newFile = new FileOutputStream(new File("PATH_DB/Drugs.xls")); 
           workbook.write(newFile);
        } catch(Exception e) {
            new IOException (e.getMessage(), e);
        }
    }

Как решить этот метод?

...