POI類庫是JAVA平臺下操作EXCEL的類庫,功能很強大,相信大家都在工作已經使用得很熟練了,這裏就不詳細介紹了,簡單的說, 一個Excel文件的層次:Excel文件->工作表->行->單元格 , 對應到POI中爲:workbook->sheet->row->cell 。
今天要說的是在創建工作表時,用中文做文件名和工作表名會出現亂碼的問題,先說以中文作爲工作表名,大家創建工作表的代碼一般如下:
HSSFWorkbook workbook = new HSSFWorkbook();//創建EXCEL文件
HSSFSheet sheet= workbook.createSheet(sheetName); //創建工作表
這樣在用英文名作爲工作表名是沒問題的,但如果sheetName是中文字符,就會出現亂碼,解決的方法如下代碼:
HSSFSheet sheet= workbook.createSheet();
workbook.setSheetName(0, sheetName,(short)1); //這裏(short)1是解決中文亂碼的關鍵;而第一個參數是工作表的索引號。
沒有太多原因,POI就是如此;再說導出的EXCEL文件名的中文亂碼問題, 導出時代碼如下:
.....
this.getResponse().reset();
this.getResponse().setContentType("application/msexcel");
this.getResponse().setHeader("Content-Disposition", "inline;filename=中文名.xls");
try {
em.getExcelMutliIO(this.getResponse().getOutputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
這個時候導出去時,文件名會爲亂碼,解決的辦法如下,在你的代碼增加下列函數:
public static String toUtf8String(String s){
StringBuffer sb = new StringBuffer();
for (int i=0;i<s.length();i++){
char c = s.charAt(i);
if (c >= 0 && c <= 255){sb.append(c);}
else{
byte[] b;
try { b = Character.toString(c).getBytes("utf-8");}
catch (Exception ex) {
System.out.println(ex);
b = new byte[0];
}
for (int j = 0; j < b.length; j++) {
int k = b[j];
if (k < 0) k += 256;
sb.append("%" + Integer.toHexString(k).toUpperCase());
}
}
}
return sb.toString();
}
然後在導出時,對文件名引用該函數,代碼如下:
this.getResponse().setHeader("Content-Disposition", "inline;filename=" +toUtf8String("中文文件名.xls"));