專案目錄
├── src/
│ ├── XlsMain.java // 讀取 .xls (HSSF)
│ ├── XlsDto2Excel.java // 寫入 .xls
│ └── XlsDto.java // 資料實體
├── pldrxkxxmb.xls // 範例檔
└── lib/
├── poi-3.17.jar
├── poi-ooxml-3.17.jar // .xlsx 支援 (XSSF)
└── ...
public class XlsMain {
public static void main(String[] args) throws IOException {
XlsMain main = new XlsMain();
List<XlsDto> list = main.readXls();
XlsDto2Excel.xlsDto2Excel(list); // 寫回新檔
list.forEach(dto -> System.out.println(dto.getXh() + " " + dto.getXm() + " " +
dto.getYxsmc() + " " + dto.getKcm() + " " + dto.getCj()));
}
private List<XlsDto> readXls() throws IOException {
try (InputStream is = new FileInputStream("pldrxkxxmb.xls")) {
HSSFWorkbook wb = new HSSFWorkbook(is);
List<XlsDto> list = new ArrayList<>();
for (int si = 0; si < wb.getNumberOfSheets(); si++) {
HSSFSheet sheet = wb.getSheetAt(si);
if (sheet == null) continue;
for (int ri = 1; ri <= sheet.getLastRowNum(); ri++) { // 跳過標題列
HSSFRow row = sheet.getRow(ri);
if (row == null) continue;
XlsDto dto = new XlsDto();
dto.setXh(getCellValue(row.getCell(0))); // 學號
dto.setXm(getCellValue(row.getCell(1))); // 姓名
dto.setYxsmc(getCellValue(row.getCell(2))); // 學院
dto.setKcm(getCellValue(row.getCell(3))); // 課程
dto.setCj(Float.parseFloat(getCellValue(row.getCell(4)))); // 成績
list.add(dto);
}
}
return list;
}
}
private String getCellValue(HSSFCell cell) {
if (cell == null) return "";
switch (cell.getCellType()) {
case BOOLEAN: return String.valueOf(cell.getBooleanCellValue());
case NUMERIC: return String.valueOf(cell.getNumericCellValue());
default: return String.valueOf(cell.getStringCellValue());
}
}
}
public class XlsDto2Excel {
public static void xlsDto2Excel(List<XlsDto> list) throws Exception {
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("pldrxkxxmb");
// 標題列
String[] headers = {"學號", "姓名", "學院", "課程名", "成績"};
HSSFRow headerRow = sheet.createRow(0);
for (int i = 0; i < headers.length; i++) {
HSSFCell cell = headerRow.createCell(i);
cell.setCellValue(new HSSFRichTextString(headers[i]));
}
// 資料列
for (int i = 0; i < list.size(); i++) {
XlsDto dto = list.get(i);
HSSFRow row = sheet.createRow(i + 1);
row.createCell(0).setCellValue(dto.getXh());
row.createCell(1).setCellValue(dto.getXm());
row.createCell(2).setCellValue(dto.getYxsmc());
row.createCell(3).setCellValue(dto.getKcm());
row.createCell(4).setCellValue(dto.getCj());
}
try (OutputStream out = new FileOutputStream("POI2Excel/pldrxkxxmb.xls")) {
wb.write(out);
System.out.println("資料庫導出成功");
}
}
}
public class XlsDto {
private Integer xkh; // 選課號
private String xh; // 學號
private String xm; // 姓名
private String yxsmc; // 學院
private Integer kch; // 課程號
private String kcm; // 課程名
private float cj; // 成績
// Getter/Setter 略
}
資料庫導出成功
1.0 hongten 信息技術學院 計算機網絡應用基礎 80.0
2.0 王五 信息技術學院 計算機網絡應用基礎 81.0
3.0 李勝基 信息技術學院 計算機網絡應用基礎 82.0
4.0 五班古 信息技術學院 計算機網絡應用基礎 83.0
5.0 蔡詩芸 信息技術學院 計算機網絡應用基礎 84.0
// 只需替換類前綴 HSSF → XSSF
XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream("file.xlsx"));
XSSFSheet sheet = wb.getSheetAt(0);
// 其餘 API 幾乎相同
POI 4.0+ 統一支援 WorkbookFactory.create(inputStream) 自動偵測格式。
DateUtil.isCellDateFormatted(cell) 判斷SXSSFWorkbook (流式寫入) 避免 OOMsheet.addMergedRegion(new CellRangeAddress(...))