java使用poi实现excel表格生成

通过使用poi技术生成Excel,使用反射技术实现自动映射列表的数据。

ExportTableUtil.java

public class ExportTableUtil {

	/**
	 *
	 * @Description: 获取csv格式的字符串
	 * @param @param 表格头
	 * @param @param fieldNameList 对应的属性名 按照先后与表头对应而且值与数据类型的属性名对应
	 * @param @param params 数据
	 * @param @return
	 * @param @throws IllegalArgumentException
	 * @param @throws IllegalAccessException
	 * @param @throws NoSuchFieldException
	 * @param @throws SecurityException 设定文件
	 * @return String 返回类型
	 */
	public static String csv(String[] headList, String[] fieldNameList, List<?> params) throws IllegalArgumentException, IllegalAccessException,
			NoSuchFieldException, SecurityException {
		StringBuilder stringBuilder = new StringBuilder();
		// add head on first
		for (int i = 0; null != headList && i < headList.length; i++) {
			stringBuilder.append(headList[i]);
			if (i < headList.length - 1) {
				stringBuilder.append(",");
			} else {
				stringBuilder.append("\r\n");
			}
		}
		// add data from second line to ---
		for (int i = 0; null != params && i < params.size(); i++) {
			Class<? extends Object> clazz = params.get(i).getClass();
			for (int j = 0; null != fieldNameList && j < fieldNameList.length; j++) {
				String fieldName = fieldNameList[j];
				if (!fieldName.contains(".")) {
					Field field = clazz.getDeclaredField(fieldName);
					if (null != field) {
						field.setAccessible(true);
						Object obj = field.get(params.get(i));
						if (null != obj) {
							stringBuilder.append(obj.toString());
						}
					} else {
						stringBuilder.append("");
					}
					if (j < fieldNameList.length - 1) {
						stringBuilder.append(",");
					}
				}else{
					Object param = params.get(i);
					Object valObj = vectorObj(clazz, fieldName, param);
					if(null!=valObj){
						stringBuilder.append(valObj.toString());
					}else {
						stringBuilder.append("");
					}
					if (j < fieldNameList.length - 1) {
						stringBuilder.append(",");
					}
				}
			}
			stringBuilder.append("\r\n");
		}

		return stringBuilder.toString();
	}

	/**
	 *
	 * @Description: 通过response下载文档
	 * @param @param response
	 * @param @param fileName
	 * @param @param headList
	 * @param @param fieldNameList
	 * @param @param params 设定文件
	 * @return void 返回类型
	 */
	public static void httpExportCSV(HttpServletRequest request, HttpServletResponse response, String fileName, String[] headList,
			String[] fieldNameList, List<?> params) {
		Map<String, Object> map = new HashMap<String, Object>();
		try {
			response.setCharacterEncoding("UTF-8");
			response.setContentType("application/x-download");
			final String userAgent = request.getHeader("USER-AGENT");
			String csvContent = csv(headList, fieldNameList, params);
			String finalFileName = null;
			if (StringUtils.contains(userAgent, "MSIE")) {// IE浏览器
				finalFileName = URLEncoder.encode(fileName, "UTF8");
			} else if (StringUtils.contains(userAgent, "Mozilla")) {// google,火狐浏览器
				finalFileName = new String(fileName.getBytes(), "ISO8859-1");
			} else {
				finalFileName = URLEncoder.encode(fileName, "UTF8");// 其他浏览器
			}

			response.setHeader("Content-Disposition", "attachment; filename=\"" + finalFileName + "\"");
			response.getOutputStream().write(csvContent.getBytes());
		} catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException | SecurityException | IOException e) {

			e.printStackTrace();
			map.put("state", "202");
			map.put("message", "数据转换异常");
			try {
				response.getOutputStream().write(JSONUtils.toJSONString(map).getBytes());
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		}

	}

	/**
	 *
	 * @Description: 得到excel表的二进制流
	 * @param @param headList 表头
	 * @param @param fieldNameList 属性名按照表头先后顺序对应而且必须在数据类型中存在属性名与之对应
	 * @param @param params
	 * @param @return
	 * @param @throws IllegalArgumentException
	 * @param @throws IllegalAccessException
	 * @param @throws NoSuchFieldException
	 * @param @throws SecurityException
	 * @param @throws IOException 设定文件
	 * @return byte[] 返回类型
	 */
	public static byte[] xls(String[] headList, String[] fieldNameList, List<?> params) throws IllegalArgumentException, IllegalAccessException,
			NoSuchFieldException, SecurityException, IOException {
		Workbook work = new HSSFWorkbook();
		Sheet sheet = work.createSheet();
		Row rowOne = sheet.createRow(0);
		for (int i = 0; null != headList && i < headList.length; i++) {// 表头
			Cell cellOne = rowOne.createCell(i);
			cellOne.setCellValue(headList[i]);// 填充值
		}

		// 数据填充
		for (int i = 0; null != params && i < params.size(); i++) {
			Class<? extends Object> clazz = params.get(i).getClass();
			Row dataRow = sheet.createRow(i + 1);
			for (int j = 0; null != fieldNameList && j < fieldNameList.length; j++) {
				String fieldName = fieldNameList[j];
				Cell cell = dataRow.createCell(j);
				if (!fieldName.contains(".")) {
					Field field = clazz.getDeclaredField(fieldName);
					field.setAccessible(true);
					Object obj = field.get(params.get(i));
					if (null != obj) {

						if (obj instanceof String) {
							cell.setCellValue(obj.toString());
						} else if (obj instanceof Double) {
							cell.setCellValue((double) obj);
						} else if (obj instanceof Boolean) {
							cell.setCellValue((boolean) obj);
						} else if (obj instanceof Date) {
							cell.setCellValue((Date) obj);
						} else {
							cell.setCellValue(obj.toString());
						}
					}
				} else if (fieldName.contains(".")) {
					Object param = params.get(i);
					Object valObj = vectorObj(clazz, fieldName, param);

					cell.setCellValue(null == valObj ? null : valObj.toString());
				}

			}

		}
		ByteOutputStream bos = new ByteOutputStream();
		work.write(bos);
		work.close();
		return bos.getBytes();
	}

	private static Object vectorObj(Class<? extends Object> clazz, String fieldName, Object obj) throws NoSuchFieldException, SecurityException,
			IllegalArgumentException, IllegalAccessException {
		if (!fieldName.contains(".")) {
			Field field = clazz.getDeclaredField(fieldName);
			field.setAccessible(true);
			return field.get(obj);
		} else {
			String fieldChildName = fieldName.substring(0, fieldName.indexOf("."));
			Object newObj = null;
			if (null != fieldChildName) {

				Field field = clazz.getDeclaredField(fieldChildName);
				field.setAccessible(true);
				newObj = field.get(obj);
				if (newObj == null) {
					return null;

				} else {
					Class<? extends Object> clazz2 = newObj.getClass();
					String fieldOtherChildName = fieldName.substring(fieldName.indexOf(".") + 1);
					return vectorObj(clazz2, fieldOtherChildName, newObj);
				}

			}
			return null;
		}

	}

	/**
	 *
	 * @Description: 导出xls表-------------从第一列开始
	 * @param @param request
	 * @param @param response
	 * @param @param fileName 文件名
	 * @param @param headList 表头
	 * @param @param fieldNameList 属性名 和按照表头先后顺序对应,值和数据列表中对象类型的属性名相同
	 * @param @param params 设定文件
	 * @return void 返回类型
	 */
	public static void httpExportXLS(HttpServletRequest request, HttpServletResponse response, String fileName, String[] headList,
			String[] fieldNameList, List<?> params) {
		Map<String, Object> map = new HashMap<String, Object>();
		try {
			response.setCharacterEncoding("UTF-8");
			response.setContentType("application/x-download");
			final String userAgent = request.getHeader("USER-AGENT");
			byte[] xlsContent = xls(headList, fieldNameList, params);
			String finalFileName = null;
			if (StringUtils.contains(userAgent, "MSIE")) {// IE浏览器
				finalFileName = URLEncoder.encode(fileName, "UTF8");
			} else if (StringUtils.contains(userAgent, "Mozilla")) {// google,火狐浏览器
				finalFileName = new String(fileName.getBytes(), "ISO8859-1");
			} else {
				finalFileName = URLEncoder.encode(fileName, "UTF8");// 其他浏览器
			}

			response.setHeader("Content-Disposition", "attachment; filename=\"" + finalFileName + "\"");
			response.getOutputStream().write(xlsContent);
		} catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException | SecurityException | IOException e) {

			e.printStackTrace();
			map.put("state", "202");
			map.put("message", "数据转换异常");
			try {
				response.getOutputStream().write(JSONUtils.toJSONString(map).getBytes());
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		}
	}

	/**
	 *
	 * @Description: 根据路径的后缀名导出对应的文件
	 * @param @param request
	 * @param @param response
	 * @param @param fileName------------文件名(格式*.xls,*.csv)
	 * @param @param headList--------------表格头部内容
	 * @param @param fieldNameList----------属性名和数据列表中类型的属性名相同,通过先后循序和表头对应。
	 * @param @param params--------------数据
	 * @param @throws Exception ----文件名不合法
	 * @return void 返回类型
	 */
	public static void httpExport(HttpServletRequest request, HttpServletResponse response, String fileName, String[] headList,
			String[] fieldNameList, List<?> params) throws Exception {
		if (null == fileName || StringUtils.isEmpty(fileName)) {
			throw new NullPointerException("文件名不可以为空");
		} else {
			String suffix = fileName.substring(fileName.indexOf(".") + 1);
			if (null != suffix) {
				System.out.println(suffix);
				switch (suffix) {
				case "csv":
					httpExportCSV(request, response, fileName, headList, fieldNameList, params);
					break;
				case "xls":
					httpExportXLS(request, response, fileName, headList, fieldNameList, params);
					break;
				case "xlsx":
					httpExportXLS(request, response, fileName, headList, fieldNameList, params);
					break;
				case "doc":
					break;
				case "docx":
					break;
				case "pdf":
					break;
				}
			} else {
				throw new Exception("文件名的格式不合法");
			}
		}
	}
}

  

时间: 2024-10-08 00:15:04

java使用poi实现excel表格生成的相关文章

java通过POI技术操作Excel(2)----模板读取,录入数据

先来回顾下通常把java对Excel的操作分为以下功能:1.生成模板,导出模板:2.填充模板,录入数据:3:读取数据库数据,导出数据:在上一篇博文中,我简单记录了模板生成和导出,在这篇博文中,主要来记录--Excel文件导入,数据录入(仍然是以jsp+servlet为例) 既然要解决这个问题,那首先来分析下我们需要面对的有哪些需求需要实现: 1.Excel文件导入(这是最基础的,巧妇难为无米之炊,导入环节也是查了好久才完成的); 2.Excel文件中数据的格式判定,你要读取文件,如果文件中其实没

Java通过POI技术操作Excel(3)----数据导出

在之前的博客中,总结了Excel模板生成和Excel数据录入,然后剩最后一个模块,数据库中数据读取,在之前的基础上我们来看这一模块,应该已经非常容易了,接下来简单的介绍一下: 这里我们仍然以jsp+servlet为例,对SqlServer2005数据库进行操作,如下都是基本步骤: 1.连接数据库:2.根据sql语句获取数据库中值:3.将值进行导出操作: 首先,我们来记性数据库的连接,这个相信接触过java的人都不会陌生,我就不赘述了 1 public class DataBase { 2 pri

JAVA使用POI操作excel

这里提一下,java操作excel的组件除了apache的poi,还有jexcelapi(jxl),其中poi组件的获取地址为poi.apache.org. poi组件中常用的类有HSSFworkbook表示一个完整的excel表格,HSSFsheet表示excel中的一个工作薄,HSSFRow表示工作薄中的一行,HSSFCell表示一个单元格 下面是一个简单的写入的demo public static void main(String [] args){ try { HSSFWorkbook

JAVA关于POI导出Excel内存溢出的解决方案

JAVA关于POI导出Excel内存溢出的解决方案 在我们使用JAVA开发过程中,经常要导出查询获得的数据,这些数据一般情况下都是以Excel存储的,因此我们在导出数据的时候要使用JAVA的POI库,其主要是对各种windows平台的数据格式进行操作,在这里,我们是对Excel操作. 生成Excel的过程原理是这样的,首先,我们对数据库进行查询,获取相应的结果集,一般是list集合,然后生成Workbook对象,根据生成的Workbook对象获取sheet对象,根据此sheet对象获取Row对象

【web开发】☆★之利用POI操作Excel表格系列教程【8】设置单元格对其方式

[web开发]☆★之利用POI操作Excel表格系列教程[8]设置单元格对其方式 package csg.xiaoye.poidemo; import java.io.FileOutputStream; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFRichTextString; import org.apache.poi.hssf.usermodel.HS

【web开发】☆★之利用POI操作Excel表格系列教程【9】单元格边框处理

[web开发]☆★之利用POI操作Excel表格系列教程[9]单元格边框处理 package csg.xiaoye.poidemo; import java.io.FileOutputStream; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.a

【web开发】☆★之利用POI操作Excel表格系列教程【10】单元格填充色和颜色操作

[web开发]☆★之利用POI操作Excel表格系列教程[10]单元格填充色和颜色操作 package csg.xiaoye.poidemo; import java.io.FileOutputStream; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import

【web开发】☆★之利用POI操作Excel表格系列教程【11】单元格合并

[web开发]☆★之利用POI操作Excel表格系列教程[11]单元格合并 package csg.xiaoye.poidemo; import java.io.FileOutputStream; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.p

JAVA使用POI获取Excel的列数与行数

Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能. 下面这篇文章给大家介绍了JAVA使用POI获取Excel列数和行数的方法,有需要的朋友们可以参考借鉴,下面来一起看看吧. 前言 报表输出是Java应用开发中经常涉及的内容,而一般的报表往往缺乏通用性,不方便用户进行个性化编辑.Java程序由于其跨平台特性,不能直接操纵Excel.因此,本文探讨一下POI视线Java程序