Должен ли я использовать Node JS или Java для чтения, сохранения и создания файлов Excel? - PullRequest
0 голосов
/ 30 октября 2019

Я использовал Apache POI в Java для чтения файлов Excel и сохранения его в своей базе данных (MySQL) в созданном мной веб-приложении. Он отлично работает, и я мог заблокировать ячейки с помощью пароля при экспорте. Код, который я использовал для извлечения / создания платы из / в файл Excel, прилагается ниже. Я пытаюсь повторить эту функцию в узле JS. Я видел несколько пакетов npm, которые могут это сделать, но я боюсь, что когда данные в файле Excel увеличиваются (некоторые другие файлы Excel действительно огромные, 252 * 100000 огромных), происходит сбой узла, лаг, idk. Я не профессионал узла (не Java также). Так как узел является асинхронным и однопоточным, подумайте, как мне подходить к этому или какие пакеты использовать. Мой текущий план состоит в том, чтобы запустить сервер Node js и сервер Java и позволить серверу Java обрабатывать чтение / запись в Excel. Но я действительно не хочу тратить ресурсы на работу двух серверных серверов. Поэтому, если вы можете посоветовать мне или указать правильное направление, было бы замечательно.

Фрагмент кода 1: Для извлечения данных и сохранения в базе данных

public void ImportFee(String filepath) throws Exception {
        //System.out.println("Started importing fee");
        //System.out.println("Creating database connection");
        Dbb db = new Dbb();
        //System.out.println("Created database connection");
        //System.out.println("Starting Apache POI");
        FileInputStream input = new FileInputStream(filepath);
        XSSFWorkbook workbook = new XSSFWorkbook(input);
        XSSFSheet sheet = workbook.getSheetAt(0);
        Row row;
        for (int i = 1; i <= sheet.getLastRowNum(); i++) {
            row = (Row) sheet.getRow(i);
            int primary_key = Integer.valueOf(row.getCell(0).getStringCellValue());
            float fee = (float) row.getCell(4).getNumericCellValue();
            Date udue = row.getCell(5).getDateCellValue();
            java.sql.Date due = new java.sql.Date(udue.getTime());

            String sql = "INSERT INTO fee (fee_id) VALUES (?) ON DUPLICATE KEY UPDATE fee_amount =?,fee_due=?";
            PreparedStatement fee_import = db.getPreparedstatement(sql);
            fee_import.setInt(1, primary_key);
            fee_import.setFloat(2, fee);
            fee_import.setDate(3, (java.sql.Date) due);
            fee_import.executeUpdate();

        }
        /* System.out.println("Import excel to fee table success"); */

    }

Фрагмент кода 2:Для извлечения из базы данных и сохранения в формате Excel


    public void ExportFee(String filepath,String user) throws Exception {
        //System.out.println("Started exporting fee");
        //System.out.println("Creating database connection");
        Dbb db = new Dbb();
        //System.out.println("Created database connection");
        //System.out.println("Starting Apache POI");
        String sql = "SELECT fee.fee_id,student.Student_id,student.Student_course,student.Student_name,fee.fee_amount,fee.fee_due FROM student INNER JOIN fee ON student.Student_pid=fee.Student_id RIGHT JOIN school ON student.Sch_id=school.Sch_id WHERE school.Sch_email =?";
        PreparedStatement export_fees = db.getPreparedstatement(sql);
        export_fees.setString(1, user);
        ResultSet retrieved_fee_data = export_fees.executeQuery();

        XSSFWorkbook workbook = new XSSFWorkbook();
        XSSFSheet sheet = workbook.createSheet("Fee Details");
        sheet.protectSheet("jLdxdJqqkZPc9DSe");
        XSSFRow rowhead = sheet.createRow((short) 0);
        rowhead.createCell((short) 0).setCellValue("Do not Edit or Delete");
        rowhead.createCell((short) 1).setCellValue("Roll No");
        rowhead.createCell((short) 2).setCellValue("Course");
        rowhead.createCell((short) 3).setCellValue("Student");
        rowhead.createCell((short) 4).setCellValue("Fee");
        rowhead.createCell((short) 5).setCellValue("Fee Due Date");

        int i = 1;

        CellStyle EditableCell = workbook.createCellStyle();
        EditableCell.setLocked(false);

        CellStyle DatecellStyle = workbook.createCellStyle();
        CreationHelper createHelper = workbook.getCreationHelper();
        short dateFormat = createHelper.createDataFormat().getFormat("yyyy-mm-dd");
        DatecellStyle.setDataFormat(dateFormat);
        DatecellStyle.setLocked(false);

        while (retrieved_fee_data.next()) {

            XSSFRow row = sheet.createRow((short) i);

            Cell FeeId = row.createCell((int) 0);
            FeeId.setCellValue(Integer.toString(retrieved_fee_data.getInt("fee_id")));

            Cell RollNo = row.createCell((int) 1);
            RollNo.setCellValue(retrieved_fee_data.getInt("Student_id"));
            RollNo.setCellStyle(EditableCell);
            Cell Course = row.createCell((short) 2);
            Course.setCellValue(retrieved_fee_data.getString("Student_course"));
            Course.setCellStyle(EditableCell);
            Cell Name = row.createCell((short) 3);
            Name.setCellValue(retrieved_fee_data.getString("Student_name"));
            Name.setCellStyle(EditableCell);
            Cell Amount = row.createCell((int) 4);
            Amount.setCellValue(retrieved_fee_data.getFloat("fee_amount"));
            Amount.setCellStyle(EditableCell);
            Cell DateCell = row.createCell(5);
            DateCell.setCellValue(retrieved_fee_data.getDate("fee_due"));
            DateCell.setCellStyle(DatecellStyle);

            i++;
        }
        sheet.autoSizeColumn(2);
        sheet.autoSizeColumn(3);
        sheet.autoSizeColumn(4);
        sheet.autoSizeColumn(5);
        String FileName= "Fees.xlsx";
        String SavePath = filepath+FileName;
        int lastRowNum = sheet.getLastRowNum();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd");

        DataValidationHelper dvHelper = sheet.getDataValidationHelper();
        DataValidationConstraint dvConstraint = dvHelper.createDateConstraint(OperatorType.BETWEEN,
                "" + DateUtil.getExcelDate(sdf.parse("1800-01-01")),
                "" + DateUtil.getExcelDate(sdf.parse("3000-12-31")), "");
        CellRangeAddressList addressList = new CellRangeAddressList(1, lastRowNum, 5, 5);
        DataValidation validation = dvHelper.createValidation(dvConstraint, addressList);

        validation.setShowErrorBox(true);

        sheet.addValidationData(validation);
        FileOutputStream fileOut = new FileOutputStream(SavePath);
        workbook.write(fileOut);
        fileOut.close();
        //System.out.println("Ended exporting fee");
    }
}

PS: мое веб-приложение одновременно может использовать не более 100 пользователей.

...