无法将泰文字符导出为ex​​cel

使用这个代码

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@page import="java.io.*"%> <%@page import="com.db.action.SearchFormDBImage"%> <%@ page import=" java.util.*"%> <%@page import ="org.apache.poi.hssf.usermodel.HSSFSheet"%> <%@page import ="org.apache.poi.hssf.usermodel.HSSFWorkbook"%> <%@page import ="org.apache.poi.hssf.usermodel.HSSFRow"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <meta http-equiv="refresh" content="600;URL=Logout"/> <title>ExportToExcel</title> </head> <body > <form name="" method="post" id="exportForm" > <%! ServletOutputStream stream = null; FileOutputStream fout = null; RequestDispatcher dispatcher=null; String userID=""; String CountryCode=""; %> <% userID=(String)session.getAttribute("userID"); CountryCode=(String)session.getAttribute("CountryCode"); if(userID==null || CountryCode==null ){ response.sendRedirect("SelectCountry.jsp"); } else{ %> <% try { response.setHeader("Pragma", ""); response.setHeader("Expires","0"); response.setHeader("Cache-Control", ""); String filename = "SearchResults.xls"; response.setHeader("content-disposition","attachment; filename="+filename); response.setContentType("application/excel"); OutputStream stream = null; HSSFWorkbook wb=null; HSSFRow row=null; ArrayList alSearch; List list_records=(List)session.getAttribute("alSearch"); if (list_records != null && !list_records.isEmpty()) { int size =list_records.size(); wb = new HSSFWorkbook(); HSSFSheet sheet = wb.createSheet("new sheet"); row = sheet.createRow((short)0); row.createCell((short)(0)).setCellValue("Business Date"); row.createCell((short)(1)).setCellValue("Work Source ID"); row.createCell((short)(2)).setCellValue("Batch Number"); row.createCell((short)(3)).setCellValue("Trans ID"); row.createCell((short)(4)).setCellValue("Item Type"); row.createCell((short)(5)).setCellValue("Amount"); row.createCell((short)(6)).setCellValue("Stub Account Number"); row.createCell((short)(7)).setCellValue("Invoice No"); row.createCell((short)(8)).setCellValue("Cheque Acct Number"); row.createCell((short)(9)).setCellValue("Cheque Number"); row.createCell((short)(10)).setCellValue("Bank Branch Code"); row.createCell((short)(11)).setCellValue("Credit Note Indicator"); row.createCell((short)(12)).setCellValue("Unique Identifier"); row.createCell((short)(13)).setCellValue("Hope"); int rowIncrement=1; int index=0; for(index = 0; rowIncrement<=size; index++) { com.db.bean.Bean obj=(com.db.bean.Bean)list_records.get(index); row = sheet.createRow((short)rowIncrement); row.createCell((short)(0)).setCellValue((String)obj.getBusDate()); row.createCell((short)(1)).setCellValue((String)obj.getWSIDDesc()); row.createCell((short)(2)).setCellValue((String)obj.getBatchNum()); row.createCell((short)(3)).setCellValue((String)obj.getTransID()); row.createCell((short)(4)).setCellValue((String)obj.getItemType()); String AmountPaid=""; AmountPaid=(String)obj.getAmtPaid(); if(AmountPaid.length()>2 ){ AmountPaid=AmountPaid.substring(0,AmountPaid.length()-2)+"."+AmountPaid.substring(AmountPaid.length()-2,AmountPaid.length()); } if(AmountPaid.length()==1){ AmountPaid="0.0"+AmountPaid; } if(AmountPaid.length()==2){ AmountPaid="0."+AmountPaid; } row.createCell((short)(5)).setCellValue(AmountPaid); row.createCell((short)(6)).setCellValue((String)obj.getStubAccNum()); row.createCell((short)(7)).setCellValue((String)obj.getInvoiceNo()); row.createCell((short)(8)).setCellValue((String)obj.getChequeAccNum()); row.createCell((short)(9)).setCellValue((String)obj.getChequeNum()); row.createCell((short)(10)).setCellValue((String)obj.getBankBranchCode()); row.createCell((short)(11)).setCellValue((String)obj.getCni()); row.createCell((short)(12)).setCellValue((String)obj.getUI()); row.createCell((short)(13)).setCellValue((String)obj.getEField2Value()); rowIncrement++; } stream = response.getOutputStream(); wb.write(stream); stream.flush(); } else { response.sendRedirect("SelectCountry.jsp"); } } catch ( Exception ex ) { ex.printStackTrace(); System.out.println("Exception caught while generating the excel report: "+ex); response.sendRedirect("ExcelNotFound.jsp"); } finally { try{ stream.close(); session.removeAttribute("alSearch"); } catch ( Exception ex ) { ex.printStackTrace(); System.out.println("Exception caught while closing the the excel stream: "+ex); } } %> <%}%> </body> </html> 

我得到泰国字符为45IA,当它应该是像ซิตี้แบงก์。

嘿,我有同样的问题。

我已经设置我的系统接受从右到左的语言,但我的希伯来字符没有显示,但作为一堆hex。 我已经将eclipse项目定义默认设置为utf-8,但仍然在浏览器上显示一堆hex。

那么瞧! 我设置jsps / servlets也接受utf-8。

要么有这个(对于一般输出),

 <%@ page pageEncoding="utf-8"%> 

或者这个(对于html输出),

 <%@ page contentType="text/html; charset=UTF-8" %> 

或者(对于Excel电子表格stream)

 <%@ page contentType="application/vnd.ms-excel; charset=UTF-8" %> 

在你的jsp。

在http响应对象上有相当于servlet的设置。 例如,

 setContentType( "text/html; charset=UTF-8" ); 

你知道,ISO-8859-1是默认的enconding,我发现它对于国际化来说是没用的,为什么当网页是网页的一部分时,networking仍然会继续使用它作为默认网页,全球化运动。

也许,你也可以在tomcat中执行以下configuration,因为http请求参数是get方法中url的一部分。 如果你不这样做,你必须只允许你的web应用程序中的post方法,如果你有泰国的HTML表单或http请求参数。

在$ CATALINA_HOME / conf / server.xml中添加以下行,其中port#是http服务的端口:

 <Connector port="port#" URIEncoding="UTF-8"/> 

我相信你需要在Windows中安装亚洲语言包。 奇怪的字母和数字通常意味着你缺less包含该字符的字体(大多数字体不支持印地文/中文/泰文字符)。

  1. 确定 HSSFWorkbook lib支持国际字符吗? 那里有很多Excel库没有。 一个是perl Excel库的当前版本。 它写入I18N字符就好了。 顺便说一下,Excel的默认字符集在Win XP SP 2和Excel 2003中处理中文和许多其他语言。MS Arial覆盖了大量的Unicode空间,以消除这些字符集问题。

  2. 如果问题是您的lib不支持I18N,请参阅解决方法这不是很好,但效果很好。

  3. 我注意到,您将页面设置为ISO-8859-1字符集。 当然,不应该是UTF-8?

感谢您提供解决scheme。 我试着用下面的代码。 它对我来说工作得很好。

POI支持泰国(和任何Unicode字符)用于编写Excel工作表。 只要将单元格编码设置为UTF-16(默认为不支持中文的ISO-8859-1),并使用实际上具有要显示的字符的字体(例如Arial Unicode MS)。 例如:

 HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet = wb.createSheet("New sheet"); HSSFFont font = wb.createFont(); font.setFontName("Arial Unicode MS"); HSSFCellStyle style = wb.createCellStyle(); style.setFont(font); HSSFRow row = sheet.createRow((short) 0); HSSFCell cell = row.createCell((short) 0); cell.setEncoding(HSSFCell.ENCODING_UTF_16); cell.setCellStyle(style); cell.setCellValue("\u53f8");