`

excel 导出文件中文问题

 
阅读更多
package com.tzdr.common.utils;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;

/**
 * 
 * @author LiuQing
 * @see excel 导出工具类
 * 使用方法
 * class EntityObjectClass {
 * 
 *      @AllowExcel(name="姓名")
 * 		private String name;
 * 
 *      @AllowExcel(name="生日")
 *      private Date birthday
 * 
 * }
 * 
 * ExportExcel<EntityObjectClass> export = new ExportExcel<EntityObjectClass>();
 * List<EntityObjectClass> data = new ArrayList<EntityObjectClass>();
 * InputStream inputStream = export.createExcel(data);
 * 
 * @version 1.0
 * @datetime 2011-11-24
 *
 */
public class ExportExcel<T extends Serializable> {
	
	/**
	 * 定义Excel hander 
	 */
	private Workbook excelHander = new HSSFWorkbook();
	
	/**
	 * 生成sheet 名称
	 */
	private String sheetName = "sName";
	
	private boolean showHeader = true;
	
	private Collection<T> tempData = new ArrayList<T>();
	
	private boolean isFirst = true;
	
	/**
	 * 缓存成员变量
	 */
	private List<String> fieldNameCaches = new ArrayList<String>();
	
	
	public ExportExcel() {
		
	}
    public ExportExcel(Collection<T> data) {
		this.tempData = data;
	}
    
    public ExportExcel(Collection<T> data,HttpServletRequest request,HttpServletResponse response,String filename) {
    	
    	String userAgent = request.getHeader("USER-AGENT");
    	this.filename = filename;
    	String finalFileName = null;
        try {
			if(StringUtils.contains(userAgent, "MSIE")){//IE浏览器
			    finalFileName = URLEncoder.encode(this.filename,"UTF8");
			}
			else if(StringUtils.contains(userAgent, "Mozilla")){//google,火狐浏览器
			    finalFileName = new String(this.filename.getBytes(), "ISO8859-1");
			}
			else{
			    finalFileName = URLEncoder.encode(this.filename,"UTF8");//其他浏览器
			}
		} 
        catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
    	this.filename = finalFileName;
    	response.resetBuffer();
		this.tempData = data;
		this.execute(response);
	}
    
	/**
	 * @see 生成Excel 文件
	 * @param data
	 * @return
	 * @throws IllegalAccessException
	 */
	public InputStream createExcel(Collection<T> data) throws Exception {
		this.tempData = data;
		this.createHeader(data);
		return this.getInputStream();
	}
	
	public static String string2Unicode(String string) {
		 
	    StringBuffer unicode = new StringBuffer();
	    for (int i = 0; i < string.length(); i++) {
	        // 取出每一个字符
	        char c = string.charAt(i);
	        // 转换为unicode
	        unicode.append("\\u" + Integer.toHexString(c));
	    }
	    return unicode.toString();
	}
	
	private String filename = "export.xls";
	
	public void execute(HttpServletResponse response) {
		try {
			InputStream input = this.createExcel();
			String contentType = "application/vnd.ms-excel";
			response.setContentType(contentType);
			response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
			OutputStream output = response.getOutputStream();
			byte b[] = new byte[1024];
			while (true) {
				int length = input.read(b);
				if (length == -1) {
					break;
				}
				output.write(b,0,length);
			}
		} 
		catch (Exception e) {
			e.printStackTrace();
		}
		
	}
	
	public void addDate(T t) throws Exception {
		this.tempData.add(t);
	}
	
	/**
	 * 
	 * @return
	 * @throws Exception
	 */
	public InputStream createExcel() throws Exception {
		this.createHeader(this.tempData);
		return this.getInputStream();
	}
	
	/**
	 * 创建器
	 * @param data
	 * @throws IllegalAccessException
	 */
	private void createHeader(Collection<T> data) throws Exception {
		//Sheet 创建工作表
		Sheet sheet = excelHander.createSheet(sheetName);
		
		int j = 0;
		for (T t:data) {
			Field[] fields = t.getClass().getDeclaredFields();
			/**
			 * 加入允许字段缓存数据
			 * if == 0时表示要添加缓存数据
			 */
			if (j == 0) {
				Row headRow = null;
				if (this.showHeader) {
					headRow = sheet.createRow(0);
				}
				int i = 0;
				for (Field field:fields) {
					//判断Excel 安全允许注解
					AllowExcel allowExcel = field.getAnnotation(AllowExcel.class);
					if (allowExcel != null && allowExcel.value()) {
						//显示关部信息
						if (this.showHeader) {
							Cell cell = headRow.createCell(i);
							cell.setCellValue(allowExcel.name());
							i++;
						}
						this.fieldNameCaches.add(field.getName());
					}
				}
				j++;
			}
			//创建产生行数据
			Row hssfRow = sheet.createRow(j);
			this.setCellValueToRow(t, hssfRow);
			j++;
			
		}
	}
	
	/**
	 * 输出Excel Row 信息
	 * @param t T extends Serializable
	 * @param hssfRow HSSFRow
	 * @return HSSFRow 
	 * @throws IllegalAccessException
	 * @throws NoSuchMethodException 
	 * @throws SecurityException 
	 */
	public Row setCellValueToRow(T t,Row hssfRow) throws Exception {
		Class clazz = t.getClass();
		Field fields[] = clazz.getDeclaredFields();
		
		//定义Excel 输出行数
		int i = 0;
		for (Field field:fields) {
			//缓存中是否存在允许字段
			if (this.isCacheFiledName(field.getName())) {
				Cell cell = hssfRow.createCell(i);
				i++;
				field.setAccessible(true);
				Class clazzType = field.getType();
				String methodName = "";
				if (clazzType.getName().equals("boolean") || 
						clazzType.getName().equals("java.lang.Boolean")) {
					methodName = "is" + this.toFirstToUp(field.getName());
				}
				else {
					methodName = "get" + this.toFirstToUp(field.getName());
				}
				Object obj = clazz.getMethod(methodName, null).invoke(t, null);
				//Object obj = clazz.getDeclaredMethod(methodName, null).invoke(t, null);
				//类型转换
				if (obj instanceof Integer ) {
					cell.setCellValue((Integer)obj);
				}
				else if (obj instanceof String) {
					cell.setCellValue((String)obj);
				}
				else if (obj instanceof Date) {
					cell.setCellValue((Date)obj);
				}
				else if (obj instanceof Double) {
					cell.setCellValue((Double)obj);
				}
				else if (obj instanceof Boolean) {
					cell.setCellValue((Boolean)obj);
				}
				else if (obj instanceof Float) {
					cell.setCellValue((Float)obj);
				}
				else if (obj instanceof Long) {
					cell.setCellValue((Long)obj);
				}
				else if (obj instanceof BigDecimal) {
					cell.setCellValue(obj.toString());
				}
				else if (obj instanceof BigInteger) {
					cell.setCellValue(obj.toString());
				}
				else {
					try {
					cell.setCellValue(obj.toString());
					}
					catch(Exception e){}
					//System.out.println(obj);
					
					//throw new TypeNotPresentException("类型不支持", null);
				}
				
			}
		}
		return hssfRow;
	}
	
	/**
	 * 判断Cache 是否有对应的FiledName
	 * @param fieldName String
	 * @return boolean
	 */
	private boolean isCacheFiledName(String fieldName) {
		if (fieldName == null) {
			return false;
		}
		for (String fieldNameCache:this.fieldNameCaches) {
			if (fieldName.equals(fieldNameCache)) {
				return true;
			}
		}
		return false;
	}
	
	/**
	 * 获得输入流
	 * @return InputStream
	 */
	private InputStream getInputStream() {
		
		ByteArrayOutputStream output = new ByteArrayOutputStream();
		InputStream inputStream = null;
		try {
			this.excelHander.write(output);
			byte b[] = output.toByteArray();
			inputStream = new ByteArrayInputStream(b);
		} 
		catch (IOException e) {
			e.printStackTrace();
		}
		finally {
			try {
				output.flush();
				output.close();
			} 
			catch (IOException e) {
				e.printStackTrace();
			}
		}
		return inputStream;
	}
	
	/**
	 * 查找对应的类自定义方法
	 * @param methodName
	 * @return boolean
	 */
	public boolean isClassMethodName(String methodName) {
		if (methodName != null) {
			if ("getClass".equals(methodName)) {
				return false;
			}
			if (methodName.startsWith("get") 
					|| methodName.startsWith("is")
					|| methodName.startsWith("set")) {
				return true;
			}
			return false;
		}
		return false;
	}
	
	/**
	 * 
	 * @param str
	 * @return String
	 */
	public static String toFirstToLower(String str) {
		char chars[] = str.toCharArray();
		if (chars != null && chars.length > 0) {
			if (chars[0] > 'A') {
				chars[0] = (char) (chars[0] + 32);
			}
		}
		return new String(chars);
		
	}
	
	/**
	 * 首字母转为大写
	 * @param str String
	 * @return String
	 */
	public static String toFirstToUp(String str) {
		char chars[] = str.toCharArray();
		if (chars != null && chars.length > 0) {
			if (chars[0] >= 'a') {
				chars[0] = (char) (chars[0] - 32);
			}
		}
		return new String(chars);
		
	}
	public String getFilename() {
		return filename;
	}
	public void setFilename(String filename) {
		this.filename = filename;
	}

}

 

package com.tzdr.common.utils;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 
 * <p>根据条件VO对象</p>
 * @author QingLiu
 * @see 
 * @version 2.0
 * 2012年3月4日上午10:34:27
 */
public class ConnditionVo implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -4054776286797309226L;
	
	/**
	 * 条件数据
	 */
	private Map<String,Object> connditionData = new HashMap<String,Object>();
	
	/**
	 * 添加参数数据
	 */
	private List<String> params = new ArrayList<String>();
	
	private HttpServletRequest request;
	
	public ConnditionVo() {
		
	}
	
	/**
	 * 
	 * @param request HttpServletRequest
	 */
	public ConnditionVo(HttpServletRequest request) {
		this.request = request;
		Enumeration<String> enu = request.getParameterNames();
		while (enu.hasMoreElements()) {
			this.addParam(enu.nextElement());
		}
		
	}
	private static final String EXCEL_TYPE = "excelType9000000_0000_0001";
	
	/**
	 * 
	 * @return boolean
	 */
	public boolean isExcel() {
		String excelType = TypeConvert.objToStrIsNotNull(this.getValue(EXCEL_TYPE));
		if (excelType != null && "true".equals(excelType)) {
			return true;
		}
		else {
			return false;
		}
	}
	
	/**
	 * 
	 * @param data Collection<?>导出数据
	 * @param response HttpServletResponse
	 * @param filename String导出显示文件名
	 * @return boolean if true is excel export 
	 */
	public boolean isExcel(Collection<?> data,HttpServletResponse response,String filename) {
		if (this.isExcel()) {
			new ExportExcel(data,this.request,response,filename);
			return true;
		}
		else {
			return false;
		}
	}
	
	/**
	 * 
	 * @param data Collection<?>导出数据
	 * @param response HttpServletResponse
	 * @param filename String导出显示文件名
	 * @return boolean if false will auto export excel file 
	 */
	public boolean isNotExcel(Collection<?> data,HttpServletResponse response) {
		if (this.isExcel()) {
			String filename = "export.xls";
			new ExportExcel(data,this.request,response,filename);
			return false;
		}
		else {
			return true;
		}
	}
	
	/**
	 * 
	 * @param data Collection<?>导出数据
	 * @param response HttpServletResponse
	 * @param filename String导出显示文件名
	 * @return boolean if false will auto export excel file 
	 */
	public boolean isNotExcel(Collection<?> data,HttpServletResponse response,String filename) {
		if (this.isExcel()) {
			int posPoint = filename.indexOf(".");
			filename = posPoint == -1?filename + ".xls":filename;
			new ExportExcel(data,this.request,response,filename);
			return false;
		}
		else {
			return true;
		}
	}
	
	
	public void execute() {
		for (String key:params) {
			String paramValueStr = request.getParameter(key);
			connditionData.put(key, paramValueStr);
		}
		this.isExecute = true;
	}
	
	public void addParam(String key) {
		params.add(key);
	}
	
	
	
	/**
	 * 添加参数
	 * @param key T
	 * @param value V
	 */
	public void addParam(String key,Object value) {
		connditionData.put(key, value);
	}
	
	/**
	 * 获取对应的值
	 * @param key T
	 * @return V
	 */
	public Object getValue(String key) {
		if (!this.isExecute) {
			this.execute();
		}
		return connditionData.get(key);
	}
	
	public String getValueStr(String key) {
		if (!this.isExecute) {
			this.execute();
		}
		return TypeConvert.objToStrIsNotNull(connditionData.get(key));
	}
	
	/**
	 * 释放所以
	 */
	public void release() {
		connditionData.clear();
	}

	/**
	 * 
	 * @return HttpServletRequest
	 */
	public HttpServletRequest getRequest() {
		return request;
	}

	/**
	 * 设置数据对象值
	 * @param request HttpServletRequest
	 */
	public void setRequest(HttpServletRequest request) {
		this.request = request;
		Enumeration<String> enu = request.getParameterNames();
		while (enu.hasMoreElements()) {
			this.addParam(enu.nextElement());
		}
	}
	//是否已经执行过初始化
	private boolean isExecute = false;
	

}

 

 

 

分享到:
评论

相关推荐

    易语言EXCEL数据导入导出

    打开文件 (导出文件路径, 0, , , , , ) .工作表 (1).选择 .循环 (数据行数) .工作表 (1).单元格 (行索引, 1).写入文本 (数据列1) .工作表 (1).单元格 (行索引, 2).写入文本 (数据列2) .... .结束循环 .对象....

    flex air 导出 excel 支持中文

    在导出文件时,通常会使用FileReference类来进行本地文件的保存。你需要确保用户有足够的权限,并遵循正确的安全策略,如提示用户选择保存位置。 在实际开发中,可能还会遇到其他问题,比如性能优化、大量数据处理...

    plsql导出数据到excel的三种方法

    2. **导出数据**:在查询结果集上,即在结果显示区域(注意不要选中任何具体的行或单元格),点击鼠标右键,选择【Copy to Excel】选项下的【Copy as xls/xlsx】,将数据导出为Excel文件。需要注意的是,根据PL/SQL ...

    Excel导入导出

    在提供的压缩包文件中,可能包含已经封装好的方法和DLL,这些预封装的方法简化了Excel导入导出的过程,使得开发者可以直接调用,而无需关心底层的实现细节。这通常会提高开发效率,减少错误,并且便于代码维护。 ...

    C# 导出Excel文件

    ### C# 导出Excel文件的关键技术点与实现方法 #### 概述 在实际开发过程中,导出数据到Excel是一种常见的需求,特别是在企业级应用中。本文将深入探讨如何使用C#语言来实现导出数据到Excel的功能,并提供一份实用的...

    注解反射导出Excel自定义中文表头

    对于具有大量定制需求的Excel导出,这种方法尤其适用,因为它允许我们在不修改核心导出逻辑的情况下,通过修改注解轻松地改变表头内容。 总的来说,注解反射导出Excel自定义中文表头是一种高效且灵活的方法,它结合...

    poi excel 模板读取并导出带公式的excel文档

    - 注意处理Excel文件的编码问题,避免中文乱码。 - 考虑到性能问题,如果数据量非常大,可能需要采取分批次处理的方式。 - 对于复杂的公式,建议先在Excel中测试其正确性,再应用于模板文件中。 综上所述,通过使用...

    易语言高级表格导出EXCEL

    导出表格数据到Excel文件则是另一个关键步骤。在易语言中,这通常通过创建Excel对象并调用其方法来实现。首先,我们需要创建一个Excel应用程序对象,然后打开一个新的工作簿,接着在工作簿中创建工作表,并将表格...

    导出excel汉字乱码以及GridView分页问题

    总结起来,解决导出Excel汉字乱码问题的关键在于正确设置字符集和编码;而处理GridView分页问题则需要在导出前临时禁用分页功能,并在完成后恢复。通过这些技巧,可以确保用户能够顺利地下载到包含所有数据且无乱码...

    易语言excel导出导入模块

    易语言提供的Excel导出导入模块,使得开发者可以方便地在程序中与Excel文件进行交互,这对于数据处理和报表生成等场景非常实用。 导出Excel文件通常涉及到以下几个关键知识点: 1. **创建工作簿**:在易语言中,...

    TOAD导出EXCEL文件时中文乱码解决办法.txt

    2. **更改导出文件格式**: - 当选择保存文件类型时,建议选择“XLSX”而不是“XLS”。因为XLSX是基于XML的文件格式,支持UTF-8编码,而XLS是旧版本的Excel文件格式,默认使用ANSI编码。使用XLSX格式可以更好地支持...

    Toad中文导出到Excel的乱码解决办法

    然而,当涉及到导出包含中文字符的数据到Excel时,可能会遇到乱码问题,这给用户带来了困扰。本文将详细阐述如何解决Toad在导出到Excel时出现的中文乱码问题。 首先,一个简单且通常有效的解决方案是改变导出格式为...

    EXCEL快速导入导出(增加数据库直接导出及2007文件格式支持).zip

    本篇将围绕“EXCEL快速导入导出(增加数据库直接导出及2007文件格式支持)”这一主题,深入解析易语言中实现Excel数据导入导出的技术细节,并结合提供的压缩包文件进行分析。 一、易语言Excel接口调用 易语言作为...

    解决tableExport导出到excel中文乱码

    解决tableExport导出到excel中文乱码,解决tableExport导出到excel中文乱码,解决tableExport导出到excel中文乱码,解决tableExport导出到excel中文乱码

    导出EXCEL,支持中文

    在"压缩包子文件的文件名称列表"中,"zqw测试-excel导出-修改base64"可能是一个示例文件或者代码示例,它展示了如何进行上述操作的实际应用。这个文件名可能包含了测试用的数据、Excel导出的代码片段以及对Base64...

    CloseXML导出Excel Demo

    这个"CloseXML导出Excel Demo"提供了使用CloseXML库在C#中创建和导出Excel文件的示例。下面我们将深入探讨CloseXML库以及如何利用它来实现Excel操作。 CloseXML是一个开源的.NET库,它为处理Open XML文档(如...

    ASP.NET导出Excel乱码的终极解决方案

    然而,在处理文件导出,尤其是将数据导出为Excel格式时,开发者经常会遇到一个令人头疼的问题——乱码。这个问题的根源在于字符编码的不匹配,而解决这一问题对于确保数据正确性和用户体验至关重要。 ### ASP.NET...

    delphi 导出数据到EXCEL通用文件

    delphi 导出数据到EXCEL 将文件复制到项目下,就可以调用了。 只要准备好数据集就行。 EXCLE的模板文件可有可无。

    java导出excel文件并且下载到客户端(包括解决中文乱码).txt

    ### Java导出Excel文件并下载到客户端(含解决中文乱码问题) 在现代的企业级应用开发中,数据导出功能是非常常见的一种需求。特别是在B/S架构的应用中,用户经常需要将查询结果导出为Excel文件以便进行后续的数据...

    excel导出TTF16

    Excel导出TTF16指的是在Microsoft Excel中将数据导出为TrueType Font(TTF)格式,其中“16”可能表示字符编码是UTF-16。在Excel中,通常我们不会直接导出为字体文件,而是处理数据或者创建表格。然而,如果你需要将...

Global site tag (gtag.js) - Google Analytics