java --导出Excel

在系统管理中,为了提高效率,通常需要批量导入数据。本文介绍了一种Java实现Excel模板导出的方法,允许用户根据模板填写数据,然后上传到系统中进行导入。JSP代码示例展示了如何生成Excel模板,导出文件名默认为当前时间,方便用户填写后导入系统。

在做基础系统过程中,有很多字典页面需要管理,也有大量的数据需要维护,有时候一条一条数据添加可能,是非常麻烦和低效的,就需要将规范的数据,通过文档的形式,上传到系统中,这样就方便了很多。

导入前,首先要编辑一个规范文档,这里我的想法是系统统一提供模板,让用户根据模板填数据,然后再导入系统。先来看看导出模板怎么写吧

JSP

<a   href="${pageContext.request.contextPath}/trainingPrograms/leadToExcelTemplet"
class="easyui-linkbutton"
style="width: 120px; margin-left: 350px; margin-top: 10px;">点击下载模板</a>
控制器
controller

	@RequestMapping("/trainingPrograms/leadToExcelTemplet")
	public void leadToExcel(HttpServletRequest request,
			HttpServletResponse response) {
		excelUtil = new ExcelUtil();
		try {
			// excel表格的表头,map
			LinkedHashMap<String, String> fieldMap = new LinkedHashMap<String, String>();
			fieldMap.put("CourseTypeName", "课程类型");
			fieldMap.put("courseCode", "课程编码");
			fieldMap.put("courseName", "课程名称");
			fieldMap.put("classHour", "学时");
			fieldMap.put("classPoint", "学分");
			fieldMap.put("theoryClassHour", "理论课时");
			fieldMap.put("practiceClassHour", "实践课时");
			fieldMap.put("academy", "开课学院");
			fieldMap.put("examOrNot", "考核形式");
			fieldMap.put("periodName", "开课学期");
			fieldMap.put("weekClass", "周课时");
			fieldMap.put("institutionName", "培养计划所属专业");
			fieldMap.put("schoolLevel", "该专业所属学校层次");
			fieldMap.put("beginweek", "开始周");
			fieldMap.put("endweek", "结束周");
			fieldMap.put("oddWeekOrNot", "是否单双周");
			fieldMap.put("courseNatureId", "公选类型");
			fieldMap.put("remark", "备注");
			String sheetName = "培养计划";
			// 导出模板
			excelUtil.leadToExcel(fieldMap, sheetName, response);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

这里有一个excel工具

package com.abc.ito.tool.exceluntil;

import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map.Entry;
import java.util.Set;

import javax.servlet.http.HttpServletResponse;

import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;

/**
 * 导入导出Excel工具类
 *
 * @author xlb
 * @version 1.0.0 
 */
public class ExcelUtil {
    /**
	 * 导出Excel模板
	 *
	 * @param fieldMap
	 *            类的英文属性和Excel中的中文列名的对应关系
	 * @param sheetName
	 *            工作表的名称
	 * @param response
	 *            使用response可以导出到浏览器
	 * @throws ExcelException
	 *             异常
	 */
	public <T> void leadToExcel(LinkedHashMap<String, String> fieldMap,
			String sheetName, HttpServletResponse response)
			throws ExcelException {

		// 设置默认文件名为当前时间:年月日时分秒
		String fileName = new SimpleDateFormat("yyyyMMddhhmmss").format(
				new Date()).toString();

		// 如果文件名没提供,则使用时间戳
		if (fileName == null || fileName.trim().equals("")) {
			// 设置默认文件名为当前时间:年月日时分秒
			fileName = new SimpleDateFormat("yyyyMMddhhmmss")
					.format(new Date()).toString();
		}

		// 设置response头信息
		response.reset();
		response.setContentType("application/vnd.ms-excel"); // 改成输出excel文件
		response.setHeader("Content-disposition", "attachment; filename="
				+ fileName + ".xls");

		// 创建工作簿并发送到浏览器
		try {

			OutputStream out = response.getOutputStream();

			int sheetSize = 65535;

			// 创建工作簿并发送到OutputStream指定的地方
			WritableWorkbook wwb;
			try {
				wwb = Workbook.createWorkbook(out);

				// 因为2003的Excel一个工作表最多可以有65536条记录,除去列头剩下65535条
				// 所以如果记录太多,需要放到多个工作表中,其实就是个分页的过程
				// 1.计算一共有多少个工作表
				// double sheetNum = Math.ceil(list.size()
				// / new Integer(sheetSize).doubleValue());

				double sheetNum = 1;

				// 2.创建相应的工作表,并向其中填充数据
				// 如果只有一个工作表的情况
				if (1 == sheetNum) {
					WritableSheet sheet = wwb.createSheet(sheetName, 1);

					// 定义存放英文字段名和中文字段名的数组
					String[] enFields = new String[fieldMap.size()];
					String[] cnFields = new String[fieldMap.size()];

					// 填充数组
					int count = 0;
					for (Entry<String, String> entry : fieldMap.entrySet()) {
						enFields[count] = entry.getKey();
						cnFields[count] = entry.getValue();
						count++;
					}
					// 填充表头
					for (int i = 0; i < cnFields.length; i++) {
						Label label = new Label(i, 0, cnFields[i]);
						sheet.addCell(label);
					}

					// 设置自动列宽
					setColumnAutoSize(sheet, 5);

				}

				wwb.write();
				wwb.close();

			} catch (Exception e) {
				e.printStackTrace();
				// 如果是ExcelException,则直接抛出
				if (e instanceof ExcelException) {
					throw (ExcelException) e;

					// 否则将其它异常包装成ExcelException再抛出
				} else {
					throw new ExcelException("导出Excel失败");
				}
			}

		} catch (Exception e) {
			e.printStackTrace();

			// 如果是ExcelException,则直接抛出
			if (e instanceof ExcelException) {
				throw (ExcelException) e;

				// 否则将其它异常包装成ExcelException再抛出
			} else {
				throw new ExcelException("导出Excel失败");
			}
		}
	}
}

导出功能也有很多形式,我这里只列出我用到的一种方式。

名字默认为下载当前时间


上面就画出了Excel,这样用户通过填充数据,可以被导入功能识别,并导入成功。

导出完,接下来就是导入功能了,为高效工作继续加油。

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值