动态导出Excel

一、概述

在工作过程中,都会遇到这样一个需求,动态选择想要导出的字段,这里写成通用的导出Excel的工具。

二、项目实现

1、构建pom.xml

我的工程是利用Maven来构建的,这里仅给出最核心的包

<!--jxi导出-->
<dependency>
    <groupId>net.sourceforge.jexcelapi</groupId>
    <artifactId>jxl</artifactId>
    <version>2.6.12</version>
</dependency>

三、jxi导出Excel工具类

import jxl.SheetSettings;
import jxl.Workbook;
import jxl.format.Alignment;
import jxl.format.VerticalAlignment;
import jxl.write.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.*;


/**
 * @Auther: admin
 * @Date: 2018/10/28 12:35
 * @Description:
 */
public class JXIExcelUtils {

    private final static Logger logger = LoggerFactory.getLogger(JXIExcelUtils.class);


    /**
     * @param : response
     * @param : fileName    文件名,如20150703.xls
     * @param : listData    数据源
     * @param : sheetName   表头名称
     * @param : columns     列名称集合,例如(姓名,年龄)
     * @return: void
     * @date : 2018/10/28 12:49
     * @Description: 下载Excel
     */
    public static void exportExcel(HttpServletResponse response, String fileName, List<Map<String, Object>> listData,
                                   String sheetName, List<String> columns) throws Exception {
        response.setContentType("application/vnd.ms-excel");
        response.setHeader("Content-disposition", "attachment; fileName" + URLEncoder.encode(fileName, "UTF-8"));
        exportToExcel(response, listData, sheetName, columns);
    }

    private static void exportToExcel(HttpServletResponse response, List<Map<String, Object>> objData, String sheetName, List<String> columns) {

        try {
            OutputStream outputStream = response.getOutputStream();
            //创建WritableWorkbook对象
            WritableWorkbook book = Workbook.createWorkbook(outputStream);
            //获取sheet对象
            WritableSheet sheet = book.createSheet(sheetName, 0);
            SheetSettings settings = sheet.getSettings();
            settings.setVerticalFreeze(1);
            WritableFont font = new WritableFont(WritableFont.createFont("微软雅黑"), 10, WritableFont.BOLD);
            WritableCellFormat format = new WritableCellFormat(font);
            //format.setBackground(Colour.YELLOW);
            format.setAlignment(Alignment.CENTRE);
            format.setVerticalAlignment(VerticalAlignment.CENTRE);

            if (columns != null && columns.size() > 0) {
                for (int i = 0; i < columns.size(); i++) {
                    sheet.addCell(new Label(i, 0, columns.get(i), format));
                }
                if (objData != null && objData.size() > 0) {
                    for (int i = 0; i < objData.size(); i++) {
                        Map<String, Object> map = objData.get(i);
                        for (int j = 0; j < columns.size(); j++) {
                            sheet.addCell(new Label(j, i + 1, "null".equals(String.valueOf(map.get(columns.get(j)))) ?
                                    null : String.valueOf(map.get(columns.get(j)))));
                        }
                    }
                }
                book.write();
                book.close();
                outputStream.flush();
                outputStream.close();
            }
            logger.info("导入成功");
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("导入" + e.getMessage());
        }
    }

    //整合内容
    public static List<Map<String, Object>> assembelDats(List<Map<String, Object>> result, LinkedHashMap<String, String> map) {

        List<Map<String, Object>> daList = new ArrayList<>();
        Map<String, Object> tempMap = null;
        for (int i = 0; i < result.size(); i++) {
            tempMap = new HashMap<String, Object>();
            for (Map.Entry<String, Object> entrySet : result.get(i).entrySet()) {
                tempMap.put(map.get(entrySet.getKey()), entrySet.getValue());
            }
            daList.add(tempMap);
        }
        return daList;
    }

    //整合内容(不带泛型)
    public static List<Map<String, Object>> assembelDats2(List<Map> result, LinkedHashMap map) {
        List<Map<String, Object>> daList = new ArrayList<>();
        Map<String, Object> tempMap = null;

        for (int i = 0; i < result.size(); i++) {
            tempMap = new HashMap();
            for (Object key : result.get(i).keySet()) {
                tempMap.put((String) map.get(key), result.get(i).get(key));
            }
            daList.add(tempMap);
        }
        return daList;
    }
}

三、Service代码
@Override
public List<Map> queryCase(Map<String, Object> params) {
    return excelFormDao.queryCase(params);
}

四,Controller,讲解下思路,前端传过来一个数组column,以逗号分割

    /**
    * @date   : 2018/10/28 15:25
    * @param  : [params, response, request]
    * @return : void
    * @exception:
    * @Description: jxi动态导出Excel,导出字段可选
    *
    */
@RequestMapping("/JxiexportExcel.do")
@ResponseBody
public void JxiexportExcel(@RequestParam HashMap params, HttpServletResponse response,HttpServletRequest request) {
    logger.info("调用JxiexportExcel请求参数params"+params);
    String fileName="查询"+System.currentTimeMillis()+".xls";
    String  sheetName="xxx表";
    //获取前端请求的input选中的的值,前端传参格式是:数组,以,分割
    String [] titles=request.getParameterValues("column");
    params.put("column",titles);

    List<Map> resultSet=excelService.queryCase(params);
    LinkedHashMap <String,String> map=new LinkedHashMap<>();
    //name,age对应pojo属性
    map.put("name","姓名");
    map.put("age","年龄");
    map.put("sex","性别");
    map.put("address","上海");
    //整合表头
    List<String> columns=new ArrayList<>();
    for (int i = 0; i <titles.length; i++) {
        columns.add(map.get(titles[i]));
    }
    List <Map<String,Object>>  listData=JXIExcelUtils.assembelDats2(resultSet,map);
    try {
        JXIExcelUtils.exportExcel(response,fileName,listData,sheetName,columns);
    } catch (Exception e) {
        logger.error(e.getMessage());
        logger.error("导出查询失败:"+ExceptionUtils.getStackTrace(e));
    }
}

五.前端页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%String path = request.getContextPath();
    String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";%>
<html>
<head>
    <base href="<%=basePath%>">
    <title>导出</title>
    <script src="js/jquery-3.1.1.min.js"></script>
</head>
<body>

<form id="form_login" action="http://localhost:8080/Mybatis_PageHelper/JxiexportExcel.do" method="get">
    <div class="modal" id="mymodal1">
        <div class="modal-dialog">
            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span
                            class="sr-only">Close</span></button>
                    <h4 class="modal-title">选择信息</h4>
                </div>
                <div class="modal-body">
                    姓名<input type="checkbox" name="checkbox1" value="name" />
                    性别<input type="checkbox" name="checkbox1" value="sex"/>
                    年龄<input type="checkbox" name="checkbox1" value="age"/>
                    地址<input type="checkbox" name="checkbox1" value="address"/>
                </div>
                <div class="modal-footer">
                    <button type="submit" >JXI导出</button>
                    <button id="btn" type="button" onclick="openpage()">导出</button>
                </div>
            </div>
        </div>
    </div>
</form>

</body>
<script type="text/javascript">
    function openpage(){
        window.location.replace("export.do");
    }
</script>
</html>

六,导出效果如下

猜你喜欢

转载自blog.csdn.net/qq_40428665/article/details/83590201