一键按下 Apache POI / Excel 中的新行
Apache POI / new row in Excel with one button press
我目前正在尝试编写一个可以更好地安排您的工作时间的程序。所以我使用 Apache POI 创建了一个 Excel 文件。我已经比较远了,但我无法在某一点上进一步。我的问题是您输入每天的小时数,程序将它们写入相应的 Excel 文件中。但是,如果我想进入第二天,程序会覆盖 Excel 文件,并且删除前一天。
所以我的问题是我不知道如何在下面的行中书写。
我已经尝试过 FileInputStream,但它并没有真正起作用,因为我每个月都会创建一个新文件。
这是我创建和编写 Excel 文件的代码。
public void speichern(ActionEvent event) throws Exception {
LocalDate localDate = date.getValue();
datum = String.valueOf(localDate);
do {
if(btnNextMon.isArmed()){
monClick++;
System.out.println(monClick);
}
if (btnSave.isArmed()){
saveClick++;
}
try {
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet("Stundenabrechnung");
sheet.setDefaultColumnWidth(18);
Map<String, Object[]> data = new TreeMap<>();
data.put("1", new Object[]{"DATUM:", " INS. ABG. STUNDEN:", " ABGR. STUNDEN:", " BESCHREIBUNG:"});
data.put("2", new Object[]{datum, ergbnis + "0", LHabg.getText(), taBes.getText()});
Set<String> keyset = data.keySet();
int rownum = 0;
for (String key : keyset) {
XSSFRow row = sheet.createRow(rownum++);
Object[] objArr = data.get(key);
int cellnum = 0;
for (Object obj : objArr) {
XSSFCell cell = row.createCell(cellnum++);
CellStyle cellStyle = workbook.createCellStyle();
cellStyle.setAlignment(HorizontalAlignment.CENTER);
cellStyle.setVerticalAlignment(VerticalAlignment.TOP);
cell.setCellStyle(cellStyle);
if (obj instanceof String) {
cell.setCellValue((String) obj);
} else if (obj instanceof Integer) {
cell.setCellValue((Integer) obj);
}
}
}
FileOutputStream outputStream = new FileOutputStream("Stundenabrechnung" + monClick +".xlsx");
workbook.write(outputStream);
workbook.close();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("ExcelFile is created succsessfully");
}while (btnNextMon.isPressed());
}
感谢您的帮助:)
我认为您应该在创建新书和电子表格之前检查该文件是否已经存在
您可以使用类似的东西:
编辑: 我更改了导致问题的行
try {
boolean fileExists = new File("Stundenabrechnung" + monClick +".xlsx").exists();
XSSFWorkbook workbook;
XSSFSheet sheet;
if (fileExists) {
workbook = new XSSFWorkbook(new FileInputStream(new File("Stundenabrechnung" + monClick +".xlsx")));
sheet = workbook.getSheetAt(0);
Map<String, Object[]> data = new TreeMap<>();
data.put("3", new Object[]{datum, ergbnis + "0", LHabg.getText(), taBes.getText()});
Set<String> keyset = data.keySet();
int rownum = sheet.getLastRowNum() + 1;
for (String key : keyset) {
XSSFRow row = sheet.createRow(rownum++);
Object[] objArr = data.get(key);
int cellnum = 0;
for (Object obj : objArr) {
XSSFCell cell = row.createCell(cellnum++);
CellStyle cellStyle = workbook.createCellStyle();
cellStyle.setAlignment(HorizontalAlignment.CENTER);
cellStyle.setVerticalAlignment(VerticalAlignment.TOP);
cell.setCellStyle(cellStyle);
if (obj instanceof String) {
cell.setCellValue((String) obj);
} else if (obj instanceof Integer) {
cell.setCellValue((Integer) obj);
}
}
}
} else {
workbook = new XSSFWorkbook();
sheet = workbook.createSheet("Stundenabrechnung");
sheet.setDefaultColumnWidth(18);
Map<String, Object[]> data = new TreeMap<>();
data.put("1", new Object[]{"DATUM:", " INS. ABG. STUNDEN:", " ABGR. STUNDEN:", " BESCHREIBUNG:"});
data.put("2", new Object[]{datum, ergbnis + "0", LHabg.getText(), taBes.getText()});
Set<String> keyset = data.keySet();
int rownum = 0;
for (String key : keyset) {
XSSFRow row = sheet.createRow(rownum++);
Object[] objArr = data.get(key);
int cellnum = 0;
for (Object obj : objArr) {
XSSFCell cell = row.createCell(cellnum++);
CellStyle cellStyle = workbook.createCellStyle();
cellStyle.setAlignment(HorizontalAlignment.CENTER);
cellStyle.setVerticalAlignment(VerticalAlignment.TOP);
cell.setCellStyle(cellStyle);
if (obj instanceof String) {
cell.setCellValue((String) obj);
} else if (obj instanceof Integer) {
cell.setCellValue((Integer) obj);
}
}
}
}
FileOutputStream outputStream = new FileOutputStream("Stundenabrechnung" + monClick +".xlsx");
workbook.write(outputStream);
workbook.close();
} catch (Exception e) {
e.printStackTrace();
}
我目前正在尝试编写一个可以更好地安排您的工作时间的程序。所以我使用 Apache POI 创建了一个 Excel 文件。我已经比较远了,但我无法在某一点上进一步。我的问题是您输入每天的小时数,程序将它们写入相应的 Excel 文件中。但是,如果我想进入第二天,程序会覆盖 Excel 文件,并且删除前一天。 所以我的问题是我不知道如何在下面的行中书写。 我已经尝试过 FileInputStream,但它并没有真正起作用,因为我每个月都会创建一个新文件。
这是我创建和编写 Excel 文件的代码。
public void speichern(ActionEvent event) throws Exception {
LocalDate localDate = date.getValue();
datum = String.valueOf(localDate);
do {
if(btnNextMon.isArmed()){
monClick++;
System.out.println(monClick);
}
if (btnSave.isArmed()){
saveClick++;
}
try {
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet("Stundenabrechnung");
sheet.setDefaultColumnWidth(18);
Map<String, Object[]> data = new TreeMap<>();
data.put("1", new Object[]{"DATUM:", " INS. ABG. STUNDEN:", " ABGR. STUNDEN:", " BESCHREIBUNG:"});
data.put("2", new Object[]{datum, ergbnis + "0", LHabg.getText(), taBes.getText()});
Set<String> keyset = data.keySet();
int rownum = 0;
for (String key : keyset) {
XSSFRow row = sheet.createRow(rownum++);
Object[] objArr = data.get(key);
int cellnum = 0;
for (Object obj : objArr) {
XSSFCell cell = row.createCell(cellnum++);
CellStyle cellStyle = workbook.createCellStyle();
cellStyle.setAlignment(HorizontalAlignment.CENTER);
cellStyle.setVerticalAlignment(VerticalAlignment.TOP);
cell.setCellStyle(cellStyle);
if (obj instanceof String) {
cell.setCellValue((String) obj);
} else if (obj instanceof Integer) {
cell.setCellValue((Integer) obj);
}
}
}
FileOutputStream outputStream = new FileOutputStream("Stundenabrechnung" + monClick +".xlsx");
workbook.write(outputStream);
workbook.close();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("ExcelFile is created succsessfully");
}while (btnNextMon.isPressed());
}
感谢您的帮助:)
我认为您应该在创建新书和电子表格之前检查该文件是否已经存在
您可以使用类似的东西:
编辑: 我更改了导致问题的行
try {
boolean fileExists = new File("Stundenabrechnung" + monClick +".xlsx").exists();
XSSFWorkbook workbook;
XSSFSheet sheet;
if (fileExists) {
workbook = new XSSFWorkbook(new FileInputStream(new File("Stundenabrechnung" + monClick +".xlsx")));
sheet = workbook.getSheetAt(0);
Map<String, Object[]> data = new TreeMap<>();
data.put("3", new Object[]{datum, ergbnis + "0", LHabg.getText(), taBes.getText()});
Set<String> keyset = data.keySet();
int rownum = sheet.getLastRowNum() + 1;
for (String key : keyset) {
XSSFRow row = sheet.createRow(rownum++);
Object[] objArr = data.get(key);
int cellnum = 0;
for (Object obj : objArr) {
XSSFCell cell = row.createCell(cellnum++);
CellStyle cellStyle = workbook.createCellStyle();
cellStyle.setAlignment(HorizontalAlignment.CENTER);
cellStyle.setVerticalAlignment(VerticalAlignment.TOP);
cell.setCellStyle(cellStyle);
if (obj instanceof String) {
cell.setCellValue((String) obj);
} else if (obj instanceof Integer) {
cell.setCellValue((Integer) obj);
}
}
}
} else {
workbook = new XSSFWorkbook();
sheet = workbook.createSheet("Stundenabrechnung");
sheet.setDefaultColumnWidth(18);
Map<String, Object[]> data = new TreeMap<>();
data.put("1", new Object[]{"DATUM:", " INS. ABG. STUNDEN:", " ABGR. STUNDEN:", " BESCHREIBUNG:"});
data.put("2", new Object[]{datum, ergbnis + "0", LHabg.getText(), taBes.getText()});
Set<String> keyset = data.keySet();
int rownum = 0;
for (String key : keyset) {
XSSFRow row = sheet.createRow(rownum++);
Object[] objArr = data.get(key);
int cellnum = 0;
for (Object obj : objArr) {
XSSFCell cell = row.createCell(cellnum++);
CellStyle cellStyle = workbook.createCellStyle();
cellStyle.setAlignment(HorizontalAlignment.CENTER);
cellStyle.setVerticalAlignment(VerticalAlignment.TOP);
cell.setCellStyle(cellStyle);
if (obj instanceof String) {
cell.setCellValue((String) obj);
} else if (obj instanceof Integer) {
cell.setCellValue((Integer) obj);
}
}
}
}
FileOutputStream outputStream = new FileOutputStream("Stundenabrechnung" + monClick +".xlsx");
workbook.write(outputStream);
workbook.close();
} catch (Exception e) {
e.printStackTrace();
}