2010-02-02 12 views
1

En utilisant ce codeincapable d'exporter le caractère thai dans Excel

<%@ 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> 

Je reçois des caractères thaïlandais 45IA, quand il devrait être quelque chose comme ซิตี้ แบงก์.

+0

voyager, vous avez ma gratitude éternelle. – BobMcGee

+0

<% @ page language = "java" contentType = "text/html; jeu de caractères = ISO-8859-1" pageEncoding = "ISO-8859-1"%> Voir le codage iso-8859-1 dans vos directives jsp est le premier signe d'ennuis. –

Répondre

0

Vous devez avoir le pack de langues asiatiques installé dans Windows, je crois. Les lettres et les chiffres étranges signifient généralement que vous n'avez pas de police contenant ce caractère (la plupart des polices ne supportent pas les caractères hindi/chinois/thaï).

+0

iam obtient le résultat correct (ซิตี้ แบงก์, ถ. รัชดาภิเษก 3 (เทเลคอม ทาวเวอร์)) dans la grille. mais en exportant iam obtenir un problème. – Ravikumar

+0

à quoi exportez-vous? Si ce n'est pas Unicode, vous ne pouvez pas représenter le personnage, il doit donc l'encoder spécialement de cette manière. – BobMcGee

0
  1. Êtes-vous sûr que le HSSFWorkbook lib prend en charge les caractères internationaux? Il y a beaucoup de librairies Excel qui ne le sont pas. Une qui fait est la version actuelle de la lib Excel Perl. Il écrit très bien les caractères I18N. En passant, le jeu de caractères par défaut pour Excel gère très bien le chinois et beaucoup d'autres langues dans Win XP SP 2 et Excel 2003. MS Arial couvre une énorme quantité d'espace Unicode juste pour éliminer ces sortes de problèmes de jeu de caractères. Si le problème est que votre bibliothèque ne supporte pas I18N, voir workaround Ce n'est pas joli mais ça marche bien. Je remarque que la page est définie sur ISO-8859-1. Bien sûr que ça ne devrait pas être UTF-8?

1

Hey, j'ai eu le même problème.

J'avais réglé mon système pour accepter les langues de droite à gauche et pourtant mes caractères hébraïques ne s'affichaient pas mais comme un groupe d'hex. J'avais défini la définition du projet eclipse par défaut à utf-8, mais un tas d'hex apparut sur le navigateur.

Puis voilà! J'ai mis les jsps/servlets à accepter aussi utf-8.

soit avoir cette (pour la sortie générale),

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

ou ce (pour la sortie html),

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

ou (pour les flux de feuille de calcul Excel),

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

dans votre jsp.

Il existe des paramètres équivalents pour les servlets sur les objets de réponse http. Par exemple,

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

Vous voyez, ISO-8859-1 est le enconding par défaut et je trouve qu'il est assez inutile pour l'internationalisation et pourquoi le net garderait toujours l'utiliser comme la valeur par défaut lorsque les pages Web font partie de, sinon le premier-moteur du mouvement de la mondialisation. Peut-être, vous pouvez également faire la configuration suivante à tomcat parce que les paramètres de requête http font partie de l'url dans une méthode get. Si vous ne le faites pas, vous devez autoriser uniquement la méthode post dans votre application web si vous avez un formulaire html ou des paramètres de requête http qui sont en thaï.

Dans $ CATALINA_HOME/conf/server.xml, ajoutez la ligne suivante, où le port # est le port de votre service http:

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

Merci pour donner des solutions. J'ai essayé avec le code suivant. ça fonctionne bien pour moi. POI prend en charge la Thaïlande (et tous les caractères Unicode) pour l'écriture fine de feuilles Excel.

Réglez simplement le codage de la cellule sur UTF-16 (par défaut c'est ISO-8859-1 qui ne prend PAS en charge le chinois), et utilisez une police qui a réellement les caractères que vous voulez afficher (par exemple Arial Unicode MS). Par exemple:

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");