2012-05-16 38 views
10

Tôi đang sử dụng thư viện apache poi để đọc tệp excel. Tôi bị kẹt trong khi đọc ô mật khẩu. Nếu người dùng cung cấp ngày làm mật khẩu trong ô mật khẩu, tức là ngày 16/05/2012. Tôi đang đọc giá trị này là "41045" trong khi giá trị phải là "16/05/2012". Đây là mã của tôi:Đọc giá trị ngày tháng từ ô excel dưới dạng Chuỗi

cell = row.getCell(); // date in the cell password '16/05/2012' 
switch (cell.getCellType()) { 

case HSSFCell.CELL_TYPE_STRING: 
    cellValue = cell.getRichStringCellValue().getString(); 
    break; 
case HSSFCell.CELL_TYPE_NUMERIC: 
    if(cellCount == TEMPLATE_PASSWORD) {// if cell is password 
     cell.setCellType(Cell.CELL_TYPE_STRING); 
     cellValue = cell.getRichStringCellValue().getString(); // value read is 41045 and not "16/05/2012" 
    } 
    break; 
default: 
} 

ai cũng có thể trợ giúp về điều này?

Cảm ơn.

+0

hãy xem chủ đề này, nó gần như giống với vấn đề của bạn. http://stackoverflow.com/questions/3148535/how-to-read-excel-cell-having-date-with-apache-poi –

+0

@mashhur Trên liên kết của bạn, không có giải pháp theo yêu cầu của tôi. –

+0

Tôi nghĩ rằng bạn nhận được số thay vì chuỗi vì loại ô là số. Bạn có chắc chắn rằng loại số là chính xác cho ô mật khẩu? – ImLearning

Trả lời

14

Các lớp học mà bạn đang tìm kiếm trong POI là DataFormatter

Khi Excel viết các tập tin, một số tế bào được lưu trữ như Strings đen, trong khi những người khác được lưu trữ như số (bao gồm cả ngày tháng). Đối với sau này, một giá trị dấu chấm động biểu diễn ô được lưu trữ trong tệp, vì vậy khi bạn hỏi POI cho giá trị của ô đó là giá trị thực tế của nó.

Đôi khi, đặc biệt là khi thực hiện trích xuất văn bản (nhưng không phải lúc nào), bạn muốn làm cho giá trị ô giống như trong Excel. Nó không phải là luôn luôn có thể nhận được rằng chính xác trong một String (không đầy đủ không gian đệm ví dụ), nhưng lớp DataFormatter sẽ giúp bạn có được gần gũi.

Cũng lưu ý rằng trong Excel, ngày được lưu trữ dưới dạng số dấu phẩy động kể từ ~ 1900, đó là lý do tại sao bạn thấy số không phải là ngày. Sử dụng DataFormatter (hoặc tương tự) để nó được hiển thị dưới dạng ngày

+0

Vâng, tôi đã kiểm tra DataFormatter, tôi sẽ định dạng chuỗi ngày tức là "41045" thành " 16/05/2012 ". Nhưng nếu người dùng nhập chuỗi là "05/16/2012" thì sao? ở đây tôi sẽ có cùng chuỗi ngày "41045" nhưng theo logic nó sẽ chuyển thành "16/05/2012" và không thành "16/05/2012". HOẶC làm cách nào để biết người dùng nhập định dạng nào? –

+0

Khi người dùng nhập giá trị vào ô, định dạng được áp dụng cho nó (tự động hoặc rõ ràng), là định dạng được sử dụng để hiển thị nó. DataFormatter sẽ chỉ hiển thị ô dựa trên bất kỳ định dạng nào. – Gagravarr

4

Tiền tố giá trị ô bằng 'khi lưu nó vào xls sẽ hiển thị giá trị đó thành ô chuỗi. Vì vậy, bất cứ điều gì bạn đọc từ ô đó sẽ được coi là một chuỗi và đọc như là.

+1

Giải pháp này yêu cầu người dùng, người nhập dữ liệu, biết và nhớ điều này vì lợi ích của chương trình (mà thậm chí họ không biết) – Attila

5

Sử dụng mã bên dưới để có được ngày chính xác được định dạng khi bạn nhập vào bảng excel.

DataFormatter df = new DataFormatter(); 
stringCellValue = df.formatCellValue(cell); 
+0

Đó là điều tôi gọi là câu trả lời thực tế. Cảm ơn! –

Các vấn đề liên quan