java导出excel弹框下载

如下:最近使用POI导出97(.xls)excel文件,做个记录。

使用反射通过拼接实体类的get方法获取到指定字段里面的值

java代码:

/**
	 * 
	 * 导出方法
	 * <p>
	 * 
	 * @param dataList
	 *            数据集合
	 * @param fieldArray
	 *            属性字段与列名的数组,如:[{"name":"sex",label:"性别"}]
	 * @param response
	 * @throws Exception
	 */
	@SuppressWarnings("resource")
	public static <T> void exportExcelData(List<T> dataList, String[] fieldArray, HttpServletResponse response) throws Exception {
		if (null == dataList || null == fieldArray) {
			throw new Exception("导出数据与字段不能为空");
		}
		// 创建工作簿
		HSSFWorkbook workBook = new HSSFWorkbook();
		Sheet sheet = workBook.createSheet();
		int rowIndex = 0;
		for (T t : dataList) {
			// 超出最大限定行数则新建工作表
			if (rowIndex % 65535 == 0 || rowIndex == 0) {
				if (rowIndex != 0) {
					sheet = workBook.createSheet();
				}
				// 设定标题行
				Row titleRow = sheet.createRow(0);
				setRowContent(titleRow, fieldArray, true, t);
				// index下标从第一开始写入
				rowIndex = 1;
			}
			// 设定行内容
			Row row = sheet.createRow(rowIndex);
			setRowContent(row, fieldArray, false, t);
			rowIndex++;
		}
		// 设置默认文件名为当前时间:年月日时分秒
		String fileName = new SimpleDateFormat("yyyyMMddhhmmss").format(new Date()).toString();

		// 设置response头信息
		response.reset();
		response.setContentType("application/ms-excel;charset=UTF-8"); // 改成输出excel文件
		response.setHeader("Content-disposition", "attachment; filename=" + fileName + ".xls");
		// 响应输出流
		OutputStream out = response.getOutputStream();
		workBook.write(out);
		out.flush();
		out.close();
	}

	/**
	 * 
	 * 根据isTitle标记设置行的内容
	 * <p>
	 * 
	 * @param row
	 *            行对象
	 * @param fieldArray
	 *            字段数组
	 * @param isTitle
	 *            是否设置标题行内容
	 * @param t
	 *            实体对象
	 * @throws Exception
	 */
	private static <T> void setRowContent(Row row, String[] fieldArray, boolean isTitle, T t) throws Exception {
		for (int j = 0; j < fieldArray.length; j++) {
			JSONObject jsonObject = JSONObject.fromObject(fieldArray[j]);
			String name = jsonObject.optString("name");
			String label = jsonObject.optString("label");
			if (StringUtils.isBlank(name)) {
				continue;
			}
			if (isTitle) {
				row.createCell(j).setCellValue(label);
			} else {
				row.createCell(j).setCellValue(getFieldValue(t, name));
			}
		}
	}

	/**
	 * 
	 * 根据字段名获取到字段值,拼接实体的get方法
	 * <p>
	 * 
	 * @param <T>
	 * 
	 * @param clazz
	 * @param name
	 * @return
	 * @throws SecurityException
	 * @throws NoSuchMethodException
	 */
	private static <T> String getFieldValue(T t, String name) throws Exception {
		// 拼接get方法名
		String methodName = "get" + name.substring(0, 1).toUpperCase() + name.substring(1);
		Object object = t.getClass().getMethod(methodName, new Class[] {}).invoke(t, new Object[] {});
		String resultStr = "";
		if (null == object) {
			return resultStr;
		}
		// 根据类型转换成对应值。如有其它再自行添加
		if (object instanceof Date) {
			resultStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(object);
		} else if (object.getClass().isEnum()) {
			resultStr = getEnumValueByKey(object.toString());
		} else {
			resultStr = object.toString();
		}
		return resultStr;
	}

	/**
	 * 
	 * 获取到类型的值,如DATABASE:数据库
	 * <p>
	 * 
	 * @param key
	 * @return
	 */
	public static String getEnumValueByKey(String key) {
		Map<String, String> map = new HashMap<String, String>();
		map.put("DATABASE", "数据库");
		map.put("FILE", "文件");
		map.put("WEBSERVICE", "WS");
		map.put("RESTFUL", "REST");
		return map.get(key);
	}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值