Java实现导出Excel

  POI:是对所有office资源进行读写的一套工具包、属于apache开源组织。

poi操作excel:

  • poi是把整个文件的属性都封装在HSSFWorkbook 中;
  • 通过HSSFWorkbook来操作单个工作薄。然后通过工作薄来操作行;
  • 在通过行来操控单元格。这样一级一级的分拆下来;
HSSFWorkbook---->HSSFSheet----->HSSFRow---->HSSFCell;

  由于是基于HSSFWorkbook对象一步步创建起来的,所以不用把创建好的单元格添加进这个对象中;如果需要对部分表格进行设置样式什么的,就可以创立HSSFCellStyle对象来进行设定样式。

参考属性:
在这里插入图片描述

实现思路:

  当一点击导出按钮就跳转到指定的Controller去执行对应方法,先调用dao对数据库数据进行查询,根据dao层的方法返回一个集合对象,然后把这个集合对象的数据交互给POI去动态生成单元格并设置进去。项目后端我用的是SSM框架搭建项目,所以逻辑代码我写在Controller类中。直接看以下代码示例:

基本操作步骤

  • 首先,需要引入jar(这里以SSM项目为例,在pom.xml配置文件中配置)
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>4.1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>4.1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-scratchpad -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-scratchpad</artifactId>
    <version>4.1.2</version>
</dependency>
  • 然后理解一下一个Excel的文件的组织形式

  一个Excel文件对应于一个workbook(HSSFWorkbook),一个workbook可以有多个sheet(HSSFSheet)组成,一个sheet是由多个row(HSSFRow)组成,一个row是由多个cell(HSSFCell)组成。
在这里插入图片描述

Controller层代码:

/**
 * 导出Excel
 * 
 * @param response
 * @param session
 */
@SuppressWarnings("unchecked")
@ResponseBody
@RequestMapping("/exportToExcel")
public void exportToExcel(HttpServletResponse response, HttpSession session) {
	Map<String, Object> filedNames = new LinkedHashMap<String, Object>();
	String titleName = "";
	Class<?> objClass = null;
	Object obj = null;
	try {
		List<FaultCodeVo> listFault = (List<FaultCodeVo>) session.getAttribute("listFault");
		if (listFault != null) {
			// 声明一个list集合接收Dao层查询所返回来的值
			obj = listFault;
			// excel标题和字段
			filedNames.put("dtc", "故障码\r\nDTC");
			filedNames.put("hexDtc", "故障码\r\n(hex)");
			filedNames.put("englishDescription", "故障码英文描述\r\nEnglish description");
			filedNames.put("chineseDescription", "故障码中文描述\r\nChinese description");
			filedNames.put("operatingConditions", "故障码运行条件\r\nDTC operating conditions");
			filedNames.put("settingConditions", "故障码设置条件\r\nDTC setting conditions");
			filedNames.put("settingAfterConditions", "故障码设置时发生的操作\r\nStrategy after DTC appears");
			filedNames.put("restoreConditions", "故障恢复条件\r\nDTC resume conditions");
			filedNames.put("activateMilRegulations", "激近故障灯原则\r\nActivate MIL regulations");
			filedNames.put("milOffRegulations", "熄灭故障灯原则\r\nMil Off regulations");
			filedNames.put("clearConditions", "清除故障码条件\r\nClear fault information conditions");
			titleName = "故障码信息表";
			objClass = FaultCodeVo.class;
			// 调用ExcelResponseUtil
			ExcelResponseUtil.exportToExcel(response, obj, filedNames, titleName, objClass);
		}
	} catch (Exception e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
}

ExcelResponseUtil 工具类:

package com.gx.util;

import java.io.OutputStream;
import java.lang.reflect.Method;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.servlet.http.HttpServletResponse;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
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.ss.usermodel.HorizontalAlignment;

@SuppressWarnings("all")
public class ExcelResponseUtil {

	/**
	 * 导出Excel
	 * 
	 * @param response
	 * @param list       导出数据集合
	 * @param filedNames excel标题&字段 此参数为map,实例为new LinkedHashMap<String, Object>();
	 * @param titleName  导出文件名
	 * @param objClass   实体类字节码.class
	 */
	public static void exportToExcel(HttpServletResponse response, Object list, Map<String, Object> filedNames,
			String titleName, Class<?> objClass) {
		// 第一步,创建一个webbook,对应一个Excel文件
		HSSFWorkbook wb = new HSSFWorkbook();
		// 第二步,在webbook中添加一个sheet,对应Excel文件中的sheet
		HSSFSheet sheet = wb.createSheet(titleName);
		// 设置列宽(如果不是很严谨的需要,或者其他地方共用次util类,可以不设置)
		sheet.setColumnWidth(0, 10 * 256);
		sheet.setColumnWidth(1, 10 * 256);
		sheet.setColumnWidth(2, 36 * 256);
		sheet.setColumnWidth(3, 36 * 256);
		sheet.setColumnWidth(4, 36 * 256);
		sheet.setColumnWidth(5, 36 * 256);
		sheet.setColumnWidth(6, 36 * 256);
		sheet.setColumnWidth(7, 36 * 256);
		sheet.setColumnWidth(8, 36 * 256);
		sheet.setColumnWidth(9, 36 * 256);
		sheet.setColumnWidth(10, 80 * 256);
		// 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short
		HSSFRow row = sheet.createRow(0);
		// 第四步,创建单元格,并设置值表头设置表头居中
		HSSFCellStyle style = wb.createCellStyle();
		style.setWrapText(true);
		style.setAlignment(HorizontalAlignment.CENTER);
		// 声明列对象
		HSSFCell cell = null;
		Set<String> fileds = filedNames.keySet();
		try {
			int i = 0;
			// 创建标题
			for (String filed : fileds) {
				cell = row.createCell(i);
				cell.setCellValue(filedNames.get(filed).toString());
				cell.setCellStyle(style);
				i++;
			}
			if (list instanceof List) {
				List lists = (List) list;
				for (int j = 0; j < lists.size(); j++) {
					Object obj = objClass.newInstance();// 获取对象实例
					row = sheet.createRow(j + 1);
					
					obj = lists.get(j);// 获取一条数据
					int k = 0;
					for (String filed : fileds) {
						String firstBig = filed.substring(0, 1).toUpperCase() + filed.substring(1);
						// ---获取getter方法,创建内容
						Method getMethod = objClass.getMethod("get" + firstBig);
						row.createCell(k).setCellValue(getMethod.invoke(obj).toString());
						row.getCell(k).setCellStyle(style);
						k++;
					}
				}
			}
			String fileName = "";// 文件名
			// 输出的文件名+以毫秒为单位返回当前时间
			fileName = new String((titleName + System.currentTimeMillis() + ".xls").getBytes(), "ISO8859-1");// ISO8859-1不能改为UTF-8,否则文件名是乱码
			response.setContentType("application/octet-stream;charset=ISO8859-1");// application应用;octet-stream八进制;charset字符集(请求应用)
			response.setHeader("Content-Disposition", "attachment;filename=" + fileName);// Content-Disposition内容配置;attachment附件;(下载完成提示)
			OutputStream os = response.getOutputStream();
			wb.write(os);
			os.flush();
			os.close();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

备注:

  • Dao层和Service层和你平时写查询一样,无需添加什么。
  • 页面请求时使用window.open(“URL”);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序yang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值