spring boot 下通过XlsView导出Excel

本文介绍了一个使用Spring MVC框架进行Excel文件导出的具体实现方法。通过自定义`XlsView`类及其子类`ExcelViews`,实现了对Excel表格样式的设置及数据填充。该示例适用于需要将数据库查询结果批量导出为Excel文件的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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中数据的类型转换,当是日期等格式时,会报错。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

大巨魔战将

如果对您有帮助,请打赏1分钱

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

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

打赏作者

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

抵扣说明:

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

余额充值