1. 程式人生 > >poi解析Excel,格式化日期型別

poi解析Excel,格式化日期型別

/**
	 * 解析excel
	 * 
	 * @param fileName
	 */
	public void parseExcelFile(String fileName) {
		// String fileName = System.getProperty("user.dir") +
		// "\\resources\\excelParse.xlsx";
		InputStream in = null;
		try {
			in = new FileInputStream(fileName);
			XSSFWorkbook workBook = new XSSFWorkbook(in);
			int sheetNum = workBook.getNumberOfSheets();
			XSSFSheet sheet = workBook.getSheetAt(sheetNum);
			sheetNum--;
			int rowNum = sheet.getLastRowNum();
			if (rowNum > 0) {
				for (int i = 0; i < rowNum; i++) {
					XSSFRow row = sheet.getRow(rowNum);
					if (row != null) {
						int cellNum = row.getLastCellNum();
						for (int j = 0; j < cellNum; j++) {
							XSSFCell cell = row.getCell(cellNum);
							String cellValue = getCellValue(cell);
						}
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				in.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * 獲取單元格的值
	 * 
	 * @param hcell
	 * @return
	 */
	private String getCellValue(XSSFCell hcell) {

		String value = null;
		if (null != hcell) {
			switch (hcell.getCellType()) {
			// 單元格是函式計算出來的資料
			case HSSFCell.CELL_TYPE_FORMULA:
				try {
					value = String.valueOf(hcell.getNumericCellValue());
				} catch (Exception e) {
					value = String.valueOf(hcell.getRichStringCellValue());
				}
				break;
			// 單元格是數字型別的
			case HSSFCell.CELL_TYPE_NUMERIC:
				// 獲取單元格的樣式值,即獲取單元格格式對應的數值
				int style = hcell.getCellStyle().getDataFormat();
				// 判斷是否是日期格式
				if (HSSFDateUtil.isCellDateFormatted(hcell)) {
					Date date = hcell.getDateCellValue();
					// 對不同格式的日期型別做不同的輸出,與單元格格式保持一致
					switch (style) {
					case 178:
						value = new SimpleDateFormat("yyyy'年'M'月'd'日'").format(date);
						break;
					case 14:
						value = new SimpleDateFormat("yyyy/MM/dd").format(date);
						break;
					case 179:
						value = new SimpleDateFormat("yyyy/MM/dd HH:mm").format(date);
						break;
					case 181:
						value = new SimpleDateFormat("yyyy/MM/dd HH:mm a ").format(date);
						break;
					case 22:
						value = new SimpleDateFormat(" yyyy/MM/dd HH:mm:ss ").format(date);
						break;
					default:
						break;
					}
				} else {
					switch (style) {
					// 單元格格式為百分比,不格式化會直接以小數輸出
					case 9:
						value = new DecimalFormat("0.00%").format(hcell
								.getNumericCellValue());
						break;
					// DateUtil判斷其不是日期格式,在這裡也可以設定其輸出型別
					case 57:
						value = new SimpleDateFormat(" yyyy'年'MM'月' ").format(hcell.getDateCellValue());
						break;
					default:
						value = String.valueOf(hcell.getNumericCellValue());
						break;
					}
				}

				break;
			// 單元格是字串型別的
			case HSSFCell.CELL_TYPE_STRING:
				value = String.valueOf(hcell.getRichStringCellValue());
				break;
			}
		}
		return value;
	}

1、這個解析的是07版的excel,03版的類似,只不過物件不一樣,03版的是HSSF*。

2、這裡只對單元格是否是函式、數字、字串型別做了判斷,還有boolean等型別。單元格的每一個格式都有一個樣式值與其對應,這樣就可以使輸出的格式與單元格的格式一致啦。

3、對日期做格式化的時候,要寫對標記,我之前寫的月份是mm,連26月都出來了,換成MM就可以啦。
4、excel中還有一種日期格式是“二〇〇一年三月十四日”,還沒弄出來怎麼格式化出來。