2012-11-28 3 views
0

Apache POI를 사용하여 Excel 데이터를 읽으며 Java로 처리하고 있습니다. 처리 할 데이터가 Excel 시트에 있으며 이는 Toad에서 채워집니다. 백엔드는 Oracle이므로 데이터 형식에는 Excel에서이 형식으로 채워지는 날짜 및 시간 소인 열도 포함됩니다. 날짜 : 07/01/2012 00:00:00 타임 스탬프 : 01/07/2012 00:00 : 00.000.처리 시간 소인 Apache POI - Java의 Excel 열

엑셀 파일 이름은 정적이지만 다양한 간격으로 다른 테이블/뷰의 데이터로 채워지기 때문에 포함 된 데이터가 달라집니다. HSSFDateUtil.isCellDateFormatted 아무튼이 TIMESTAMP 컬럼에 올 때
이 그러나, HSSFCell.CELL_TYPE_NUMERIC 따라서 그 세포에 대한 진정한 보유하지 않습니다 내가

//Set the date format for the data fields 
HSSFCellStyle dateStyle = workBook.createCellStyle(); 
short dateFormat = workBook.createDataFormat().getFormat("yyyy-mm-dd hh:mm:ss"); 
dateStyle.setDataFormat(dateFormat); 
DataFormatter fmt = new DataFormatter(); 

if (hssfCell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) 
    //Check if data in the cell is a date 
    if (HSSFDateUtil.isCellDateFormatted(hssfCell)) 
     hssfCell.setCellStyle(dateStyle); 

문제를 사용하여 DATE 열을 처리 할 수 ​​있어요

그들과 함께 일하지 마라. 그래서 나는 TIMESTAMP 컬럼을위한 포맷을 지정할 수 없다. Excel에서 데이터를 Oracle 테이블의 실제 데이터와 비교합니다 (Java를 사용하여 쿼리).이 형식 문제로 인해 일치하지 않습니다.

저는 Java와 POI에 익숙하지 않으므로 여기에 어리석은 것을 놓친 것 같습니다. 이 문제를 해결할 수있는 방법에 대한 의견이 있으십니까?

업데이트

내가 타임 스탬프 데이터가 특정 형식이 될 것으로 기대 정적 접근 방식을 찍은되는 시간 동안, 대안 솔루션에 대한 웹 검색 후

String timestampIn = "dd/MM/yyyy HH:mm:ss.SSS"; 
String timestampOut = "yyyy-MM-dd HH:mm:ss.SSS"; 
try 
{ 
    Date date = (new SimpleDateFormat(timestampIn)).parse(fmt.formatCellValue(hssfCell).toString().trim()); 
    //Add data in the cell to the ArrayList 
    cellTempList.add((new SimpleDateFormat(timestampOut)).format(date)); 
} 
catch (ParseException pe) { 
    //Add data in the cell to the ArrayList 
    cellTempList.add(fmt.formatCellValue(hssfCell)); 
} 

이 만 Excel의 타임 스탬프 형식이 dd/MM/yyyy HH : mm : ss.SSS 형식 인 경우 작동합니다.

다른 형식으로 타임 스탬프 값을 처리하기위한 효과적인 해결책은 인정 될 것입니다.

답변

0

좋습니다, 쉽게 할 수 있습니다.

DB에서 TIMESTAMP 데이터 유형이있는 열 이름을 가져 와서 Excel 시트의 헤더와 비교하십시오.

Excel 헤더가 DB의 열 이름과 일치하면 별도의 SimpleDateFormat ("yyyy-MM-dd'T'HH : mm : ss.S'Z '")을 사용하여 작업을 수행하십시오.

괜찮습니까?

+0

이 방법에 익숙하지 않습니다. - Class _class = Class.forName (columnNo); 이것을 사용하여 Excel 컬럼의 클래스 세부 사항을 추출하는 방법에 대한 세부 사항을 제공 할 수 있습니까? – user1669327

+0

지금 내 대답이 업데이트되었습니다. Pl 체크 –

+0

나는이 접근 방법에 대해 이미 생각해 왔지만 현재 구현이 먼저 Excel 데이터를 추출하고이를 arraylist에 채운 다음 실제 쿼리를 실행하여 Excel 데이터와 비교함으로써 복잡성을 초래합니다. 실제 쿼리는 간단한 쿼리, 함수, 프로 시저 또는 임의의 블록 일 수 있습니다. 그래서 이전에 제안한 것과 같은 간단한 솔루션을 찾고 있었는데, 엑셀 열을 검사하여 데이터베이스에 의존하지 않고 타임 스탬프인지 확인할 수있었습니다. 첫 번째 제안은 실현 가능하고 구현하기 쉽습니까? – user1669327