Я использовал 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 пользователей.