java 导出xls 通用工具类

java  导出xls 通用工具类

package org.rui..util;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;

/**
 * 导入xls表格 把数据转换为数据流
 * 
 * 
 * @author liangrui
 * 
 *         encodFileNmae = java.net.URLEncoder.encode(tableName+".xls",
 *         "utf-8");
 *         response.setContentType("application/vnd.ms-excel;charset=utf-8");
 *         response.setHeader("Content-Disposition", "attachment;filename=" +
 *         encodFileNmae);
 *
 */
public class XlsUtil
{

	/**
	 * 把数据转换为输出流
	 * 
	 * @param sheetName
	 *            sheet名称
	 * @param header
	 *            表头map
	 * @param list
	 *            数据集合
	 * @param clz
	 *            对象字节码
	 * @param dateFormat
	 *            如果有日期 格式化的日期 默认 yyyy-MM-dd
	 * @return
	 * @throws Exception
	 */
	@SuppressWarnings("rawtypes")
	public static InputStream getXlsIO(String sheetName,
			Map<String, String> header, List<Object> list, Class clz,
			String dateFormat) throws Exception
	{

		HSSFWorkbook wb = new HSSFWorkbook();
		HSSFSheet sheet = wb.createSheet(sheetName);
		// 设置表格默认列宽度为15个字节
		sheet.setDefaultColumnWidth(15);

		HSSFRow row = sheet.createRow(0);
		// 第四步,创建单元格,并设置值表头 设置表头居中
		HSSFCellStyle style = wb.createCellStyle();
		style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建一个居中格式
		// 设置这些样式
		// style.setFillForegroundColor(HSSFColor.CORAL.index);//back
		// style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
		// style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
		// style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
		// style.setBorderRight(HSSFCellStyle.BORDER_THIN);
		// style.setBorderTop(HSSFCellStyle.BORDER_THIN);
		// style.setAlignment(HSSFCellStyle.ALIGN_CENTER);

		// 生成一个字体
		HSSFFont font = wb.createFont();
		font.setColor(HSSFColor.RED.index);
		font.setFontHeightInPoints((short) 12);
		font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
		// 把字体应用到当前的样式
		style.setFont(font);

		HSSFCell cell;

		List<String> tempSort = new ArrayList<String>();
		int cellIndex = 0;
		for (Entry<String, String> es : header.entrySet())
		{
			tempSort.add(es.getValue());
			cell = row.createCell(cellIndex);// 创建一个单元格,并放入数据
			cell.setCellStyle(style);
			cell.setCellType(HSSFCell.CELL_TYPE_STRING);
			// cell.setEncoding(HSSFCell.ENCODING_UTF_16);// 指定编码
			cell.setCellValue(es.getKey()); // 设值
			cellIndex++;
		}

		if (list != null)
		{
			for (int i = 0; i < list.size(); ++i)
			{
				Object obj = clz.newInstance();
				obj = list.get(i);
				row = sheet.createRow(i + 1);// 创建一行,从0开始

				// 根据 v 找到方法 并获取值
				for (int r = 0; r < tempSort.size(); r++)
				{
					// 获取值
					Object value = getMethodValue(clz, obj, tempSort.get(r));
					String strValue = converType(value, dateFormat);
					cell = row.createCell(r);
					cell.setCellValue(strValue);
				}
			}
		}

		// FileOutputStream fos = new FileOutputStream("D:/tewst.xls");
		ByteArrayOutputStream os = new ByteArrayOutputStream();// 字节数组输出流

		try
		{
			wb.write(os);// 写入字节输出流对象是
		} catch (IOException e)
		{
			e.printStackTrace();
		} finally
		{
			if (os != null)
			{
				os.close();
			}

		}

		byte[] bArry = os.toByteArray();// 获取字节数组

		// 将数组字节 写入到输入流对象
		InputStream isba = new ByteArrayInputStream(bArry);

		return isba;
	}

	/**
	 * 根据字段获取值
	 * 
	 * @param clz
	 * @param o
	 * @param field
	 * @return
	 */
	@SuppressWarnings("rawtypes")
	public static Object getMethodValue(Class clz, Object o, String field)
			throws NoSuchMethodException, SecurityException,
			IllegalAccessException, IllegalArgumentException,
			InvocationTargetException
	{

		Character charss = field.charAt(0);
		field = field.replaceFirst(charss.toString(),
				Character.toUpperCase(charss) + "");
		System.out.println(field);

		// 获取值
		@SuppressWarnings("unchecked")
		Method getMethod = clz.getDeclaredMethod("get" + field, new Class[] {});

		Object value = getMethod.invoke(o, new Object[] {});

		return value;
	}

	public static String converType(Object value, String dateFormat)
	{

		String rResult = "";

		// if (value instanceof Integer)
		// {
		// int result = (Integer) value;
		// return result;
		//
		// } else if (value instanceof Float)
		// {
		// float result = (Float) value;
		// return result;
		//
		// } else if (value instanceof Double)
		// {
		// double result = (Double) value;
		// return result;
		//
		// } else if (value instanceof Long)
		// {
		// long result = (Long) value;
		// return result;
		// }
		// if (value instanceof Boolean)
		// {
		// boolean result = (Boolean) value;
		// return result;
		//
		// } else
		if (value instanceof Date)
		{
			Date date = (Date) value;
			if ("".equals(dateFormat) || null == dateFormat)
			{
				dateFormat = "yyyy-MM-dd";

			}
			// IllegalArgumentException

			SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
			rResult = sdf.format(date);

		} else if (value instanceof byte[])
		{
			//
		} else
		{

			return value + "";
		}
		return rResult;
	}

}

package org.servlet;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.utils.XlsUtil;

import test.Student;

/**
 * Servlet implementation class ExpXls
 */
@WebServlet("/ExpXls")
public class ExpXls extends HttpServlet
{
	private static final long serialVersionUID = 1L;

	/**
	 * Default constructor.
	 */
	public ExpXls()
	{

	}

	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException
	{
		doPost(request, response);

	}

	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException
	{
		
		String tableName="报表名";
		try
		{
			Map<String, String> m = new HashMap<String, String>();
			m.put("id", "id");
			m.put("姓名", "name");
			m.put("年龄", "age");
			m.put("生日", "birth");

			List<Object> list = new ArrayList<Object>();
			SimpleDateFormat df = new SimpleDateFormat("yyyy-mm-dd");

			Student user1 = new Student(1, "张三张三张三张三张三张三三", 16,
					df.parse("1997-03-12"));
			Student user2 = new Student(2, "李四", 17, df.parse("1996-08-12"));
			Student user3 = new Student(3, "王五", 26, df.parse("1985-11-12"));
			list.add(user1);
			list.add(user2);
			list.add(user3);

			InputStream is = XlsUtil.getXlsIO("数据报表", m, list, Student.class,"");

			String encodFileNmae = "";

			encodFileNmae = java.net.URLEncoder.encode(tableName+".xls",
						"utf-8");
			response.setContentType("application/vnd.ms-excel;charset=utf-8");
			response.setHeader("Content-Disposition", "attachment;filename="
					+ encodFileNmae);

			// 输出流
			OutputStream os = null;
			// ByteArrayOutputStream os=null;
			int leng = 0;
			byte[] bytes = new byte[1024]; // 缓存buffer
			try
			{
				// 获取输出流对象
				//os = response.out;
				 os=response.getOutputStream();
				// k始读取
				while ((leng = is.read(bytes)) > 0)
				{
					// 开始写入
					os.write(bytes, 0, leng);
				}

			} catch (Exception e)
			{
				e.printStackTrace();
			} finally
			{
				try
				{
					if (is != null)
					{
						is.close();
					}
					if (os != null)
					{
						os.close();
					}
				} catch (IOException e)
				{
					
					e.printStackTrace();
				}
			}

		} catch (Exception e)
		{

			e.printStackTrace();
		}

	}

}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值