1

使用此代码

<%@ 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,而它应该是 ซิตี้แบงก์。

4

4 回答 4

1

Hey, I had the same problem.

I had set my system to accept Right-to-left languages and yet my Hebrew characters were not showing up but as a bunch of hex. I had set the eclipse project definition to default to utf-8 but still a bunch of hex showed up on the browser.

Then voila! I set the jsps/servlets to accept utf-8 too.

Either have this (for general output),

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

or this (for html output),

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

or (for excel spreadsheet streams),

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

in your jsp.

There are equivalent settings for servlets at the http response objects. For example,

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

You see, ISO-8859-1 is the default enconding and I found out that it is pretty useless for internationalisation and why the net would still keep using it as the default when web pages are part of, if not the prime-mover of, the globalisation movement.

Perhaps, you could also do the following config at tomcat because http request params are part of the url in a get method. If you don't, you have to allow only post method in your web app if you have html form or http request parameters that are in Thai.

At $CATALINA_HOME/conf/server.xml, add the following line, where port# is the port of your http service :

<Connector port="port#" URIEncoding="UTF-8"/>
于 2010-02-02T07:06:28.313 回答
0
  1. 确定HSSFWorkbook 库支持国际字符吗?有很多 Excel 库没有。一个是当前版本的 perl Excel 库。它可以很好地写入 I18N 个字符。顺便说一句,Excel 的默认字符集在 Win XP SP 2 和 Excel 2003 中可以很好地处理中文和许多其他语言。MS Arial 覆盖了大量的 Unicode 空间,只是为了消除这些字符集问题。

  2. 如果问题是您的 lib 不支持 I18N,请查看解决方法它不是很漂亮但效果很好。

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

于 2010-02-02T05:19:04.780 回答
0

感谢您提供解决方案。我尝试使用以下代码。它对我来说很好。

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"); 
于 2010-02-04T08:37:41.617 回答
0

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

于 2010-02-02T04:21:03.810 回答