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”);