2012-02-08 28 views
7

Tôi đã sử dụng POI để phân tích thành công các tệp XLS và XLSX thành công. Tuy nhiên, tôi không thể trích xuất chính xác các ký tự đặc biệt, chẳng hạn như các ký tự được mã hóa UTF-8 như tiếng Trung hoặc tiếng Nhật, từ bảng tính Excel. Tôi đã tìm ra cách trích xuất dữ liệu từ tệp csv hoặc tab được phân tách bằng UTF-8, nhưng không may mắn với tệp Excel. Có ai giúp được không?Cách phân tích cú pháp các ký tự UTF-8 trong các tệp Excel bằng POI

(Edit: đoạn Mã từ bình luận)

HSSFSheet sheet = workbook.getSheet(worksheet); 
HSSFEvaluationWorkbook ewb = HSSFEvaluationWorkbook.create(workbook); 
while (rowCtr <= lastRow && !rowBreakOut) 
{ 
    Row row = sheet.getRow(rowCtr);//rows.next(); 
    for (int col=firstCell; col<lastCell && !breakOut; col++) { 
     Cell cell; 
     cell = row.getCell(col,Row.RETURN_BLANK_AS_NULL); 
     if (ctype == Cell.CELL_TYPE_STRING) { 
     sValue = cell.getStringCellValue(); 
     log.warn("String value = "+sValue); 
     String encoded = URLEncoder.encode(sValue, "UTF-8"); 
     log.warn("URL-encoded with UTF-8: " + encoded); 
     .... 
+0

Bạn có thể trỏ đến các phần của API POI mà bạn đang sử dụng hoặc hiển thị cho chúng tôi một số mã không? Điều đó sẽ giúp chúng tôi đề xuất các thay đổi API và chẩn đoán có thể giúp gỡ lỗi. –

+0

Excel không lưu trữ các ký tự dưới dạng UTF-8, vì vậy tôi nghĩ bạn có thể bị nhầm lẫn ở đâu đó ... – Gagravarr

+0

Ảnh chụp màn hình của tệp Excel: – user1198370

Trả lời

7

tôi đã cùng một vấn đề trong khi giải nén văn bản Ba Tư từ một file Excel. Tôi đã sử dụng Eclipse, và chỉ cần vào Project -> Properties và thay đổi "text file encoding" thành UTF-8 đã giải quyết được vấn đề.

+0

Làm việc như một sự quyến rũ. Cảm ơn. – Abhishek

3

trong POI bạn có thể sử dụng như thế này:

Workbook wb = new HSSFWorkbook(); 
Sheet sheet = wb.createSheet("new sheet"); 

// Create a row and put some cells in it. Rows are 0 based. 
Row row = sheet.createRow(1); 

// Create a new font and alter it. 
Font font = wb.createFont(); 
font.setCharSet(FontCharset.ARABIC.getValue()); 
font.setFontHeightInPoints((short)24); 
font.setFontName("B Nazanin"); 
font.setItalic(true); 
font.setStrikeout(true); 

// Fonts are set into a style so create a new one to use. 
CellStyle style = wb.createCellStyle(); 
style.setFont(font); 

// Create a cell and put a value in it. 
Cell cell = row.createCell(1); 
cell.setCellValue("سلام"); 
cell.setCellStyle(style); 

// Write the output to a file 
FileOutputStream fileOut = new FileOutputStream("workbook.xls"); 
wb.write(fileOut); 
fileOut.close(); 

và có thể sử dụng charset khác trong FontCharset

0

Nhận byte sử dụng UTF như sau

cell.getStringCellValue().getBytes(Charset.forName("UTF-8")); 
1

Giải pháp là đơn giản, để đọc giá trị chuỗi ô của bất kỳ mã hóa nào (ký tự không phải tiếng Anh); chỉ cần sử dụng các phương pháp sau đây:

sValue = cell.getRichStringCellValue().getString(); 

thay vì:

sValue = cell.getStringCellValue(); 

này áp dụng cho UTF-8 ký tự mã hóa như Trung Quốc, tiếng Ả Rập hoặc tiếng Nhật.

PS nếu ai đang sử dụng dòng lệnh tiện ích nullpunkt/excel-to-json mà sử dụng các "Apache POI" thư viện, sửa đổi các tập tin chuyển đổi/ExcelToJsonConverter.java bằng cách thay thế các lần xuất hiện của "getStringCellValue()" để tránh đọc các ký tự không phải tiếng Anh là "???".

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