diff --git a/pom.xml b/pom.xml
index bedad98..b61a1f8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -306,6 +306,15 @@
javase
3.5.3
-
+
+ org.apache.poi
+ poi
+ 5.2.5
+
+
+ org.apache.poi
+ poi-ooxml
+ 5.2.5
+
diff --git a/src/main/java/BsK/client/ui/component/DataDialog/DataDialog.java b/src/main/java/BsK/client/ui/component/DataDialog/DataDialog.java
index ec393b9..3f8847a 100644
--- a/src/main/java/BsK/client/ui/component/DataDialog/DataDialog.java
+++ b/src/main/java/BsK/client/ui/component/DataDialog/DataDialog.java
@@ -21,6 +21,13 @@ import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Calendar;
import java.util.Date;
+import BsK.client.ui.component.DataDialog.ExcelExporter;
+import javax.swing.filechooser.FileNameExtensionFilter;
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicReference;
public class DataDialog extends JDialog {
@@ -38,6 +45,8 @@ public class DataDialog extends JDialog {
private int totalPages = 1;
private int recordsPerPage = 20;
private int totalRecords = 0;
+ private boolean isExporting = false;
+ private File fileForExport = null;
private JPanel mainPanel;
private JPanel paginationPanel;
@@ -201,7 +210,7 @@ public class DataDialog extends JDialog {
AddDialog addDialog = new AddDialog((Frame) getParent());
addDialog.setVisible(true);
});
- exportExcelButton.addActionListener(e -> JOptionPane.showMessageDialog(this, "Chức năng xuất Excel đang được phát triển", "Thông báo", JOptionPane.INFORMATION_MESSAGE));
+ exportExcelButton.addActionListener(e -> handleExportToExcel());
filterButton.addActionListener(e -> {
saveFiltersToLocalStorage(); // <-- SAVE STATE BEFORE FETCHING
@@ -300,6 +309,31 @@ public class DataDialog extends JDialog {
// --- MODIFIED: Process raw data into Patient DTOs and populate table correctly ---
private void handleGetCheckupDataResponse(GetCheckupDataResponse response) {
+ // --- START OF MODIFICATION ---
+ // Check if we are in export mode
+ if (isExporting) {
+ List patientsToExport = new ArrayList<>();
+ if (response.getCheckupData() != null) {
+ for (String[] rowData : response.getCheckupData()) {
+ patientsToExport.add(new Patient(rowData));
+ }
+ }
+
+ try {
+ ExcelExporter.exportToExcel(patientsToExport, this.fileForExport);
+ JOptionPane.showMessageDialog(this, "Xuất file Excel thành công!\n" + this.fileForExport.getAbsolutePath(), "Thành công", JOptionPane.INFORMATION_MESSAGE);
+ } catch (IOException ex) {
+ JOptionPane.showMessageDialog(this, "Lỗi khi ghi file Excel: " + ex.getMessage(), "Lỗi", JOptionPane.ERROR_MESSAGE);
+ } finally {
+ // Reset the flag and file variable after exporting
+ isExporting = false;
+ fileForExport = null;
+ }
+ return; // IMPORTANT: Stop further execution to avoid updating the UI table
+ }
+ // --- END OF MODIFICATION ---
+
+ // This is your existing code for updating the table for pagination
SwingUtilities.invokeLater(() -> {
this.currentPage = response.getCurrentPage();
this.totalPages = response.getTotalPages();
@@ -346,6 +380,29 @@ public class DataDialog extends JDialog {
resultCountLabel.setText(String.format("Hiển thị %d đến %d của %d kết quả", startRecord, endRecord, totalRecords));
}
+ private void handleExportToExcel() {
+ JFileChooser fileChooser = new JFileChooser();
+ fileChooser.setDialogTitle("Lưu file Excel");
+ fileChooser.setFileFilter(new FileNameExtensionFilter("Excel Workbook (*.xlsx)", "xlsx"));
+ fileChooser.setSelectedFile(new File("DanhSachKhamBenh.xlsx"));
+
+ if (fileChooser.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) {
+ this.fileForExport = fileChooser.getSelectedFile();
+ // Ensure the file has a .xlsx extension
+ if (!this.fileForExport.getName().toLowerCase().endsWith(".xlsx")) {
+ this.fileForExport = new File(this.fileForExport.getParentFile(), this.fileForExport.getName() + ".xlsx");
+ }
+
+ // Set the flag to true
+ this.isExporting = true;
+
+ JOptionPane.showMessageDialog(this, "Đang chuẩn bị dữ liệu để xuất file...", "Thông báo", JOptionPane.INFORMATION_MESSAGE);
+
+ // Call fetchData with a special page number (-1) to signal "get all"
+ fetchData(-1);
+ }
+ }
+
private void updatePaginationControls() {
paginationPanel.removeAll();
diff --git a/src/main/java/BsK/client/ui/component/DataDialog/ExcelExporter.java b/src/main/java/BsK/client/ui/component/DataDialog/ExcelExporter.java
new file mode 100644
index 0000000..708a7d3
--- /dev/null
+++ b/src/main/java/BsK/client/ui/component/DataDialog/ExcelExporter.java
@@ -0,0 +1,69 @@
+package BsK.client.ui.component.DataDialog;
+
+import BsK.common.entity.Patient;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.xssf.usermodel.XSSFSheet;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.List;
+
+public class ExcelExporter {
+
+ public static void exportToExcel(List patientList, File file) throws IOException {
+ // Create a new Excel workbook
+ try (XSSFWorkbook workbook = new XSSFWorkbook()) {
+ XSSFSheet sheet = workbook.createSheet("DanhSachKhamBenh");
+
+ // Define header titles
+ String[] headers = {
+ "Mã Khám", "Mã BN", "Họ", "Tên", "Năm Sinh", "Giới Tính", "Số Điện Thoại",
+ "Địa Chỉ", "Ngày Khám", "Loại Khám", "Bác Sĩ Khám", "CCCD/DDCN", "Cân Nặng (kg)",
+ "Chiều Cao (cm)", "Nhịp Tim (l/p)", "Huyết Áp (mmHg)", "Chẩn Đoán", "Kết Luận",
+ "Đề Nghị", "Ghi Chú", "Ngày Tái Khám"
+ };
+
+ // Create the header row
+ Row headerRow = sheet.createRow(0);
+ for (int i = 0; i < headers.length; i++) {
+ Cell cell = headerRow.createCell(i);
+ cell.setCellValue(headers[i]);
+ }
+
+ // Fill data rows
+ int rowNum = 1;
+ for (Patient patient : patientList) {
+ Row row = sheet.createRow(rowNum++);
+ row.createCell(0).setCellValue(patient.getCheckupId());
+ row.createCell(1).setCellValue(patient.getCustomerId());
+ row.createCell(2).setCellValue(patient.getCustomerLastName());
+ row.createCell(3).setCellValue(patient.getCustomerFirstName());
+ row.createCell(4).setCellValue(patient.getCustomerDob());
+ row.createCell(5).setCellValue(patient.getCustomerGender());
+ row.createCell(6).setCellValue(patient.getCustomerNumber());
+ row.createCell(7).setCellValue(patient.getCustomerAddress());
+ row.createCell(8).setCellValue(patient.getCheckupDate());
+ row.createCell(9).setCellValue(patient.getCheckupType());
+ row.createCell(10).setCellValue(patient.getDoctorName());
+ row.createCell(11).setCellValue(patient.getCccdDdcn());
+ row.createCell(12).setCellValue(patient.getCustomerWeight());
+ row.createCell(13).setCellValue(patient.getCustomerHeight());
+ row.createCell(14).setCellValue(patient.getHeartBeat());
+ row.createCell(15).setCellValue(patient.getBloodPressure());
+ row.createCell(16).setCellValue(patient.getDiagnosis());
+ row.createCell(17).setCellValue(patient.getConclusion());
+ row.createCell(18).setCellValue(patient.getSuggestion());
+ row.createCell(19).setCellValue(patient.getNotes());
+ row.createCell(20).setCellValue(patient.getReCheckupDate());
+ }
+
+ // Write the output to a file
+ try (FileOutputStream fileOut = new FileOutputStream(file)) {
+ workbook.write(fileOut);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/BsK/server/network/handler/ServerHandler.java b/src/main/java/BsK/server/network/handler/ServerHandler.java
index 7232908..293a2e6 100644
--- a/src/main/java/BsK/server/network/handler/ServerHandler.java
+++ b/src/main/java/BsK/server/network/handler/ServerHandler.java
@@ -4,7 +4,7 @@ import BsK.common.packet.Packet;
import BsK.common.packet.PacketSerializer;
import BsK.common.packet.req.*;
import BsK.common.packet.res.*;
-import BsK.common.packet.res.ErrorResponse.Error;
+import BsK.common.Error;
import BsK.common.entity.Status;
import BsK.common.util.date.DateUtils;
import BsK.server.Server;
diff --git a/src/main/resources/database/BSK.db b/src/main/resources/database/BSK.db
index 6f727b3..f18f4eb 100644
Binary files a/src/main/resources/database/BSK.db and b/src/main/resources/database/BSK.db differ