[JAVA] Excel POI 讀檔寫檔(XSSFWorkbook)

摘要:[JAVA] Excel POI 讀檔寫檔(XSSFWorkbook)

在java內可以透過org.apache.poi API 實現讀檔與寫檔的動作

目前常見的是用HSSFWorkbook ...etc

但所轉出的為Excel 97-2003 版的Excel

Excel 2007-10的版本為XSSFWorkbook

這邊假設data 已經轉成inputStream

整個excel的包裝是workbook 為最外層

裡面包含多格sheet ,sheet中包含很多列row

row 則由多個cell組成。

XSSFWbook=>XSSFSheet=>XSSFRow=>XSSFCell

從Excel讀取到後端處理

XSSFWorkbook workbook = new XSSFWorkbook(is);
XSSFSheet sheet = workbook.getSheetAt(0);
XSSFRow row;
/* 第一列為title 所以i從1開始略過0 */
for (int i = 1; i < sheet.getPhysicalNumberOfRows(); i++) {
     row = sheet.getRow(i); // 取得第 i Row
     Certification cert = new Certification();
     if (row.getCell(0) != null) {
         cert.setName(row.getCell(Constants.ONE).toString().trim());
         cert.setIdNo(row.getCell(Constants.TWO).toString().trim());

     }
}

從後端資料寫成Excel

輸出為ByteArrayOutputStream

        XSSFWorkbook workbook = new XSSFWorkbook(); // 建立Excel物件
	ByteArrayOutputStream bos = new ByteArrayOutputStream();
	//字體格式
	XSSFFont font = workbook.createFont();
	font.setColor(HSSFColor.BLACK.index); // 顏色
	font.setBoldweight(Font.BOLDWEIGHT_NORMAL); // 粗細體
	// 設定儲存格格式 
	XSSFCellStyle styleRow1 = workbook.createCellStyle();
	// styleRow1.setFillForegroundColor(HSSFColor.GREEN.index);//填滿顏色
	// styleRow1.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
	styleRow1.setFont(font); // 設定字體
	styleRow1.setAlignment(XSSFCellStyle.ALIGN_CENTER); // 水平置中
	styleRow1.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER); // 垂直置中
	// 設定框線 
	styleRow1.setBorderBottom((short) 1);
	styleRow1.setBorderTop((short) 1);
	styleRow1.setBorderLeft((short) 1);
	styleRow1.setBorderRight((short) 1);
	styleRow1.setWrapText(true); // 自動換行
	/* Title */
	XSSFSheet sheet = workbook.createSheet("檢定名冊");
	sheet.autoSizeColumn(0); // 自動調整欄位寬度
	sheet.setColumnWidth(0, CHAR_SIZE * Constants.TEN);
	sheet.setColumnWidth(Constants.ONE, CHAR_SIZE * Constants.TEN);
	sheet.setColumnWidth(Constants.TWO, CHAR_SIZE * Constants.FIFTEEN);

	XSSFRow rowTitle = sheet.createRow(0);
	rowTitle.createCell(0).setCellValue("編號");
	rowTitle.createCell(1).setCellValue("姓名");
	rowTitle.createCell(2).setCellValue("身分證字號");

	for (int i = 0; i < examineeList.size(); i++) {
	    XSSFRow rowContent = sheet.createRow(i + 1); // 建立儲存格
	    Calendar cal = Calendar.getInstance();
	    cal.setTime(examineeList.get(i).getBirthday());

	    XSSFCell cellContent = rowContent.createCell(0);
	    cellContent.setCellValue(examineeList.get(i).getGrantNo());
	    cellContent = rowContent.createCell(1);
	    cellContent.setCellValue(examineeList.get(i).getName());
	    cellContent = rowContent.createCell(2);
        }

        workbook.write(bos);
        return bos;