Postingan ini sebenarnya seperti biasa, catatan pribadi namun sengaja saya share siapa tahu berguna bagi pembaca, karena saya sendiri juga sering lupa 😁. Yaitu import data dari file Excel ke tabel MySQL yang kebetulan ada salah satu fitur yang ada dalam project kecil saya, yaitu API Data Jamaah(project non-komersial lho ini, atau lebih tepatnya project sinahu. xixixi 😁).
Adapun library yang saya gunakan adalah Apache POI.
Apa itu Apache POI
Apache POI adalah sebuah library Java untuk mengelola(membuat, membaca dan mengedit) dokumen Microsoft Office seperti Word (.docx), Excel, (.xlsx) dan PowerPoint (.pptx). Ingin tahu lebih banyak, bisa anda baca sendiri disini.
Dalam kasus ini, fungsi yang akan kita gunakan adalah membaca file Excel, kemudian nanti hasilnya berupa List<JamaahEntity> kita insert all ke dalam tabel MySQL.
Setup Apache POI
Karena saya menggunakan gradle, sehingga untuk menginstall Apache POI tinggal menambahkan dependensi berikut ini. Oh ya, saat postingan ini ditulis, versi Apache POI erbaru adalah versi 5.0.0.
0 |
implementation 'org.apache.poi:poi-ooxml:5.0.0' |
Kemudian Sync gradle.
Siapkan Entity/Tabel-nya
Entity untuk menyimpan datanya adalah JamaahEntity, dengan table name =”jamaah” yang saya simpan dalam package models.entities.
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
@Entity @Table(name = "jamaah") public class JamaahEntity { @Id @Column(name = "id", nullable = false) @GeneratedValue(strategy = GenerationType.AUTO) private int id; private String nama; private String alamat; private String status; private String skill; private String sex; private String photoUrl; public String getPhotoUrl() { return photoUrl; } public void setPhotoUrl(String photoUrl) { this.photoUrl = photoUrl; } private boolean aktif; public boolean isAktif() { return aktif; } public void setAktif(boolean aktif) { this.aktif = aktif; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getNama() { return nama; } public void setNama(String nama) { this.nama = nama; } public String getAlamat() { return alamat; } public void setAlamat(String alamat) { this.alamat = alamat; } public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } public String getSkill() { return skill; } public void setSkill(String skill) { this.skill = skill; } @Override public String toString() { return "JamaahEntity{" + "id=" + id + ", nama='" + nama + '\'' + ", alamat='" + alamat + '\'' + ", status='" + status + '\'' + ", skill='" + skill + '\'' + '}'; } public int getId() { return id; } public void setId(int id) { this.id = id; } } |
Membuat Helper.
Sebelum membuat helper, mari kita perhatikan file Excelnya. Cell yang akan kita ambil hanya kolom A, B, C dan E, sedangkan kolom D tidak. Sehingga boleh dibilang column index ke 0, 1, 2 dan 4.
Kemudian saya membuat kelas JamaahExcelHelper.java yang didalamnya akan kita buat static method yaitu excelToJamaahEntitys() untuk membaca sekaligus menggenerate List<JamaahEntity> sehingga nanti pada kelas JamaahSerice tinggal dipanggil.
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
public class JamaahExcelHelper { public static final String TYPE = "application/vnd.openxmlformats -officedocument.spreadsheetml.sheet"; static final String SHEET = "Sheet1"; // <-- Sheet Name public static boolean isExcelFormat(MultipartFile file) { return TYPE.equals(file.getContentType()); } public static List excelToJamaahEntitys(InputStream is) { try { Workbook workbook = new XSSFWorkbook(is); Sheet sheet = workbook.getSheet(SHEET); Iterator rows = sheet.iterator(); List JamaahEntitys = new ArrayList<>(); int rowNumber = 0; while (rows.hasNext()) { Row currentRow = rows.next(); // skip header if (rowNumber == 0) { rowNumber++; continue; } Iterator cellsInRow = currentRow.iterator(); // Entitas/ tabel JamaahEntity jamaahEntity = new JamaahEntity(); int columnIndex = 0; while (cellsInRow.hasNext()) { Cell currentCellInRow = cellsInRow.next(); switch (columnIndex) { case 0: jamaahEntity.setNama(currentCellInRow.getStringCellValue()); break; case 1: jamaahEntity.setSex(currentCellInRow.getStringCellValue()); break; case 2: jamaahEntity.setAlamat(currentCellInRow.getStringCellValue()); break; case 4: jamaahEntity.setStatus(String.valueOf(currentCellInRow .getNumericCellValue())); break; default: break; } jamaahEntity.setSkill(""); columnIndex++; } JamaahEntitys.add(jamaahEntity); } workbook.close(); return JamaahEntitys; } catch (IOException e) { throw new RuntimeException("fail to parse Excel file: " + e.getMessage()); } } } |
Kelas helper ini saya simpan jadi satu package dengan JamaahService.java dan JamaahServiceImpl.java, yaitu di package models.services.
Implementasi di Controller
Kemudian dari controller, tempat dimana terdapat ResquestMapping atau method yang akan dipanggil oleh Front-End Dev. Nah, kita bisa memanggil method importExcel yang ada di kelas JamaahService.
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
@PostMapping(value = "upload") public ResponseEntity uploadExcelFile(@RequestParam("file") MultipartFile file) { String message; // Upload and import Excel if (JamaahExcelHelper.isExcelFormat(file)) { try { jamaahService.importExcel(file); message = "Uploaded the file successfully: " + file.getOriginalFilename(); return ResponseEntity .status(HttpStatus.OK) .body(new CommonResponse(message, 200, null)); } catch (IOException e) { e.printStackTrace(); return ResponseEntity .status(HttpStatus.EXPECTATION_FAILED) .body(new CommonResponse(e.getMessage(), 500, null)); } } message = "Please upload an excel file!"; return ResponseEntity .status(HttpStatus.BAD_REQUEST) .body(new CommonResponse(message, 400, null)); } |
Siap di Tes
Siap di test. Silahkan pake Rest Client yang anda suka misal PostMan atau Insomnia. Saya pake Insomnia. Hehe..
Mau lihat full Source Code boleh unduh disini. Selamat mencoba, terimakasih.