POI 动态表头导出Excel 例子

package com.tonbusoft.dwgl.control.exportManager;

import java.io.OutputStream;
import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
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.springframework.web.servlet.mvc.multiaction.MultiActionController;

import com.tonbusoft.dwgl.bean.PersonnelBasInf;
import com.tonbusoft.dwgl.biz.exportManager.ExportHmcHandler;
import com.tonbusoft.dwgl.commons.annotation.Column;
import com.tonbusoft.dwgl.commons.utils.SendUtil;

/**
* 动态导出花名册
*
* @author dong.tang, 2015-10-10
*/
public class ExportController extends MultiActionController {

private ExportHmcHandler exporthmchandler;

/**
* 动态导出花名册到excel
*
* @author zhi.zhang, 2015-10-20
* @param request
* @param response
*/
public void exportHmc(HttpServletRequest request,
HttpServletResponse response) {
OutputStream out = null;
String date = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss")
.format(new Date());
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
String nowdate = format.format(new Date());
try {
String arrayId = request.getParameter("arrayId");
String arrayName = request.getParameter("arrayName");
String array2Id = request.getParameter("array2Id");
String array2Name = request.getParameter("array2Name");
String arrayOrderId = request.getParameter("arrayOrderId");
String[] personNmaeArray = arrayName.split(";");
String[] personIdArray = arrayId.split(";");
String[] cNameArray = array2Name.split(";");
String[] cIdArray = array2Id.split(";");
String[] orderIdArray = arrayOrderId.split(";");
response.setContentType("octets/stream");
response.addHeader("Content-Disposition","attachment;filename="+new String(("花名册-" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date())).getBytes("GBK"),"iso8859-1")+".xls");
out = response.getOutputStream();
// 创建一个空白的WorkBook
HSSFWorkbook wb = new HSSFWorkbook();

HSSFCellStyle cellStyle=wb.createCellStyle();   
cellStyle.setWrapText(true);   
// 人员基本信息不为空的时候,导出到人员基本信息sheet
if (arrayId != null && !"".equals(arrayId)) {
// 基于上面的WorkBook创建属于此WorkBook的Sheet,
// 3.0.1版在使用全角Sheet名的时候不必再setEncdoing了,个人感觉方便了许多。
HSSFSheet st = wb.createSheet("人员基本信息");
// 创建属于上面Sheet的Row,参数0可以是0~65535之间的任何一个,
// 注意,尽管参数是Int类型,但是Excel最多支持65536行
HSSFRow row = st.createRow(0);
// 设置第一行的人员选中列
int k = 0;
for (k = 0; k < personNmaeArray.length; k++) {
HSSFCell cell = row.createCell(k);
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
cell.setCellValue(personNmaeArray[k]);
}
List<Map<String, Object>> list = exporthmchandler.getList(orderIdArray);

for (int i = 1; i <= list.size(); i++) {
HSSFRow newRow = st.createRow(i);
for (int j = 0; j < personIdArray.length; j++) {
HSSFCell cell = newRow.createCell(j);
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
Map<String, Object> cmap = list.get(i - 1);
if (cmap.get(personIdArray[j].toUpperCase()) != null) {
String id = cmap.get(personIdArray[j].toUpperCase()).toString();
cell.setCellValue(id);
}
}
}
}
if (array2Id != null && !"".equals(array2Id)) {
if (array2Id.indexOf("ssry") != -1) {
// 基于上面的WorkBook创建属于此WorkBook的Sheet,
// 3.0.1版在使用全角Sheet名的时候不必再setEncdoing了,个人感觉方便了许多。
HSSFSheet grjlSheet = wb.createSheet("所获荣誉");
// 创建属于上面Sheet的Row,参数0可以是0~65535之间的任何一个,
// 注意,尽管参数是Int类型,但是Excel最多支持65536行
HSSFRow row = grjlSheet.createRow(0);
// 设置第一行的人员选中列

String ryayy[] = { "姓名", "身份证", "手机号码", "获奖名称", "备注" };
int k = 0;
for (k = 0; k < ryayy.length; k++) {
HSSFCell cell = row.createCell(k);
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
cell.setCellValue(ryayy[k]);
}
String ryayyId[] = { "F_VC_XM", "F_VC_SFZH", "F_VC_SJHM",
"F_VC_MC", "F_VC_BZ" };
List<Map<String, Object>> list = exporthmchandler
.getRyList();
for (int i = 1; i <= list.size(); i++) {
HSSFRow newRow = grjlSheet.createRow(i);
for (int j = 0; j < ryayyId.length; j++) {
HSSFCell cell = newRow.createCell(j);
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
Map<String, Object> cmap = list.get(i - 1);
if (cmap.get(ryayyId[j]) != null) {
String id = cmap.get(ryayyId[j]).toString();
cell.setCellValue(id);
}
}
}
}
if (array2Id.indexOf("grjl") != -1) {
// 基于上面的WorkBook创建属于此WorkBook的Sheet,
// 3.0.1版在使用全角Sheet名的时候不必再setEncdoing了,个人感觉方便了许多。
HSSFSheet grjlSheet = wb.createSheet("个人简历");
// 创建属于上面Sheet的Row,参数0可以是0~65535之间的任何一个,
// 注意,尽管参数是Int类型,但是Excel最多支持65536行
HSSFRow row = grjlSheet.createRow(0);
// 设置第一行的人员选中列

String ryayy[] = { "姓名", "身份证", "手机号码", "入职时间", "单位","职务名称","职级名称","职位(职级)全称","单位全称","离职时间" };
int k = 0;
for (k = 0; k < ryayy.length; k++) {
HSSFCell cell = row.createCell(k);
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
cell.setCellValue(ryayy[k]);
}
String ryayyId[] = { "F_VC_XM", "F_VC_SFZH", "F_VC_SJHM",
"F_DT_RZSJ","F_VC_GZDW","F_VC_ZW","F_VC_ZJ","F_VC_ZWMC","F_VC_GZDWMC","F_DT_LZSJ" };
List<Map<String, Object>> list = exporthmchandler
.getJlList();
for (int i = 1; i <= list.size(); i++) {
HSSFRow newRow = grjlSheet.createRow(i);
for (int j = 0; j < ryayyId.length; j++) {
HSSFCell cell = newRow.createCell(j);
// 设置自动换行
// cell.setCellStyle(cellStyle);
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
Map<String, Object> cmap = list.get(i - 1);
if (cmap.get(ryayyId[j]) != null) {
String id = cmap.get(ryayyId[j]).toString();
cell.setCellValue(id);
}
}
}
}
if (array2Id.indexOf("zjbh") != -1) {
// 基于上面的WorkBook创建属于此WorkBook的Sheet,
// 3.0.1版在使用全角Sheet名的时候不必再setEncdoing了,个人感觉方便了许多。
HSSFSheet grjlSheet = wb.createSheet("职级变化");
// 创建属于上面Sheet的Row,参数0可以是0~65535之间的任何一个,
// 注意,尽管参数是Int类型,但是Excel最多支持65536行
HSSFRow row = grjlSheet.createRow(0);
// 设置第一行的人员选中列
String ryayy[] = { "姓名", "身份证", "手机号码", "上岗时间","岗位名称","离岗时间","备注" };
int k = 0;
for (k = 0; k < ryayy.length; k++) {
HSSFCell cell = row.createCell(k);
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
cell.setCellValue(ryayy[k]);
}
String ryayyId[] = { "F_VC_XM", "F_VC_SFZH", "F_VC_SJHM",
"F_DT_SGSJ", "F_VC_GW","F_DT_LGSJ","F_VC_BZ" };
List<Map<String, Object>> list = exporthmchandler
.getZjList();
for (int i = 1; i <= list.size(); i++) {
HSSFRow newRow = grjlSheet.createRow(i);
for (int j = 0; j < ryayyId.length; j++) {
HSSFCell cell = newRow.createCell(j);
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
Map<String, Object> cmap = list.get(i - 1);
if (cmap.get(ryayyId[j]) != null) {
String id = cmap.get(ryayyId[j]).toString();
cell.setCellValue(id);
}
}
}
}
}
// File file = new File("c:/exceportHmc/" + nowdate);
// if (!file.exists() && !file.isDirectory())
// file.mkdir();
// xls是Excel97-2003的标准扩展名,2007是xlsx,目前的POI能直接生产的还是xls格式,
// 如果此处把扩展名改成xlsx,在用Excel2007打开此文件时会报错。
// FileOutputStream writeFile = new FileOutputStream("c:/exceportHmc/" + nowdate
// + "/" + date + ".xls");
// 把WorkBook写到流里
wb.write(out);
// 记得手动关闭流,官方文档已经做了特别说明,说POI不负责关闭用户打开的流。所以...
// writeFile.close();
} catch (Exception e) {
e.printStackTrace();
} finally{
try{
if(out != null){
out.flush();
out.close();
}
}catch(Exception e){
e.printStackTrace();
}
}

}

public Object createBl(Object o, int i) {
o = o.toString() + i;
return o;
}

/**
* 获取花名册列
*
* @param request
* @param response
*/
public void getBaseInfoColumns(HttpServletRequest request,
HttpServletResponse response) {
Class<PersonnelBasInf> personClass = PersonnelBasInf.class;
Field[] fields = personClass.getDeclaredFields();
List<Map<String, String>> columnNames = new LinkedList<Map<String, String>>();
for (Field field : fields) {
Column columns = field.getAnnotation(Column.class);
if (columns != null) {
Map<String, String> cMap = new HashMap<String, String>();
cMap.put(field.getName(), columns.name());
cMap.put("columnKey", field.getName());
cMap.put("columnValue", columns.name());
columnNames.add(cMap);
}
}
SendUtil.write(response, columnNames);
}

public static void main(String[] args) {

}

public ExportHmcHandler getExporthmchandler() {
return exporthmchandler;
}

public void setExporthmchandler(ExportHmcHandler exporthmchandler) {
this.exporthmchandler = exporthmchandler;
}
}

猜你喜欢

转载自417755712.iteye.com/blog/2261058