import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.web.servlet.view.document.AbstractXlsView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.net.URLEncoder;
import java.util.Map;
/**
* @author xuezhiyan
* @date 2018/6/27
*/
public abstract class XlsView extends AbstractXlsView{
public CellStyle cellStyle;
/**
* 设置样式
*
* @param workbook
*/
protected abstract void setStyle(Workbook workbook);
/**
* 设置Row,由子类实现
*
* @param sheet
* @param map
*/
protected abstract void setRow(Sheet sheet, Map<String, Object> map);
@Override
protected void buildExcelDocument(Map<String, Object> map, Workbook workbook, HttpServletRequest request, HttpServletResponse response) throws Exception {
String title=(String)map.getOrDefault("title","Excel");
String excelName = map.get("name").toString() + ".xls";
String Agent = request.getHeader("User-Agent");
if (null != Agent) {
Agent = Agent.toLowerCase();
if (Agent.indexOf("firefox") != -1) {
response.setHeader("content-disposition", String.format("attachment;filename*=utf-8'zh_cn'%s", URLEncoder.encode(excelName, "utf-8")));
} else {
response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(excelName, "utf-8"));
}
}
// response.setContentType("application/ms-excel; charset=UTF-8");
//创建单sheet页
Sheet sheet = workbook.createSheet(title);
sheet.setDefaultColumnWidth(30);
this.setStyle(workbook);
setRow(sheet, map);
}
}
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author xuezhiyan
* @date 2018/6/27
*/
public class ExcelViews extends XlsView {
@Override
protected void setStyle(Workbook workbook) {
DefaultCellStyle defaultCellStyle = new DefaultCellStyleImpl();
super.cellStyle = defaultCellStyle.setCellStyle(workbook);
}
@Override
protected void setRow(Sheet sheet, Map<String, Object> map) {
String[] headers=(String[])map.get("headers");
//设定headers
int rowCount = 0;
Row header = sheet.createRow(rowCount++);
for(int i=0;i<headers.length;i++){
header.createCell(i).setCellValue(headers[i]);
header.getCell(i).setCellStyle(super.cellStyle);
}
//设定列表
String[] fields=(String[])map.get("fields");
List list=(List) map.get("list");
for(int i=0;i<list.size();i++){
Row temp = sheet.createRow(rowCount++);
Map<String, Object> mmap=objectToMap(list.get(i));
for(int j=0;j<fields.length;j++){
temp.createCell(j).setCellValue((String) mmap.get(fields[j]));
temp.getCell(j).setCellStyle(super.cellStyle);
}
}
}
public static Map<String, Object> objectToMap(Object obj) {
Map<String, Object> map = new HashMap<>();
try{
if(obj == null){
return null;
}
BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor property : propertyDescriptors) {
String key = property.getName();
if (key.compareToIgnoreCase("class") == 0) {
continue;
}
Method getter = property.getReadMethod();
Object value = getter!=null ? getter.invoke(obj) : null;
map.put(key, value);
}
}catch (Exception e){
}
return map;
}
}
@RequestMapping(value = "xls.json", method = RequestMethod.GET)
public ModelAndView download() {
List<UserInfo> list = new ArrayList<UserInfo>();
for (int i = 0; i < 5; i++) {
UserInfo userInfo = new UserInfo();
userInfo.setName("Kent" + i);
userInfo.setPassword("111111"+i);
userInfo.setSalt(UUID.randomUUID().toString());
list.add(userInfo);
}
Map<String, Object> map = new HashMap<String, Object>();
map.put("members", list);
map.put("name", "魅力城市");
String[] headers={"姓名","密码","盐"};
String[] fields={"name","password","salt"};
map.put("headers", headers);
map.put("fields", fields);
map.put("list", list);
ExcelViews excelView = new ExcelViews();
return new ModelAndView(excelView, map);
}
大致的一个demo,没有处理cell中数据的类型转换,当是日期等格式时,会报错。