实现Excel导出SpringBoot项目中表格数据

简介: 最近写业务代码,涉及到这个,前阵子写了篇博客介绍了用JS以Excel形式导出后台返回给前台的数据,这种方法只能是导出一个页面的数据,并不能按分页的形式导出,所以今天就改写一下,实现将接口返回的所有数据进行全部导出。

Excel导出SpringBoot项目中表格数据

最近写业务代码,涉及到这个,前阵子写了篇博客介绍了用JS以Excel形式导出后台返回给前台的数据,这种方法只能是导出一个页面的数据,并不能按分页的形式导出,所以今天就改写一下,实现将接口返回的所有数据进行全部导出。

前台

jsp/html页面代码

<div class="p-sm border no-top-border">
        <button type="submit" class="btn btn-warning start export-btn lbox-btn">
        <i class="glyphicon glyphicon-export" aria-hidden="true"></i>
        <span>导出Excel</span>
</button>
      <div class="row">
       <div class="col-md-12">
          <table class="table table-bordered text-center table_ellipsis" id="_table" style="width: 100%">
         </table>
       </div>
     </div>
</div>

js

js是用来向后请求Controller方法,并传递相关的字段参数。

 $(".export-btn").on("click", function () {
                var url = $("#path").val() + "/rest/qday/exportExcel?orgId=" + orgId + "&startDate=" + startTime.replace(/-/g, "") + "&endDate=" + endTime.replace(/-/g, "") + "&leixing=0";
                window.location.href = url;
        });

Controller

 @RequestMapping(value = "/exportExcel", method = RequestMethod.GET)
    public void exportExcel(String startDate, String endDate, String orgId, String leixing, HttpServletRequest request, HttpServletResponse response) {
        try {
            //当前页数
            int pageNum = 1;
            //每页显示条数
            int pageSize = 10000;
            String orgIdStr = "";
            if (orgId.contains("--")) {
                orgIdStr = orgId.substring(0, 6);
            } else {
                orgIdStr = orgId;
            }
            //通过接口来取得数据
            JSONObject json =XXXService.receiveData(startDate, endDate, orgIdStr,
                    interfaceUrl + JSONObject.parseObject(jqrqlUrl).getString("1"), "&type=" + leixing + "&pageNum=" + pageNum + "&pageSize=" + pageSize);
            if (json != null && json.size() > 0) {
                //excel文件名
                String[] title = new String[]{"编号", "名称", "单位", "状态"};
                String name = null;
                //根据不同的类型来进行excel文件的命名
                switch (leixing) {
                    case "0":
                        name = "第一个";
                        break;
                    case "100001":
                        name = "第二个";
                        break;
                    case "100002":
                        name = "第三个";
                        break;
                    case "100003":
                        name = "第四个";
                        break;
                    default:
                        break;
                }
                String fileName = URLEncoder.encode(name + startDate + "至" + endDate + name + ".xls", "UTF-8");
                //sheet名
                String sheetName = name;
                //取json字符穿中data对象,里面有一个list数组和total对象
                JSONObject object = (JSONObject) json.get("data");
                //取出List数组
                JSONArray earlyList = (JSONArray) object.get("list");
                //字符串二维数据用来保存表格数据
                String[][] content = new String[earlyList.size()][];
                //循环遍历
                for (int i = 0; i < earlyList.size(); i++) {
                    content[i] = new String[title.length];
                    JSONObject pojo = (JSONObject) earlyList.get(i);
                    //list数据类型为:[{"name":"张","password":"jian"},{"name":"张","password":"chao"}],所以这里取key值
                    if (pojo.get("name") != null) {
                        content[i][0] = (String) pojo.get("name");
                    }
                    if (pojo.get("password") != null) {
                        content[i][1] = (String) pojo.get("password");
                    }
                    //如果是int类型数据将其转换成String
                    if (pojo.get("XXX") != null) {
                        content[i][2] = pojo.getBigDecimal("XXX").toString();
                    }
                    if (pojo.get("xxx") != null) {
                        content[i][3] =  pojo.getBigDecimal("xxx").toString();
                    }
               /* if (pojo.gettWarnStatus() != null) {
                    // 状态 0关闭;1开启;
                    String warnStatus = "";
                    switch (pojo.gettWarnStatus()) {
                        case 0:
                            warnStatus = "已关闭";
                            break;
                        case 1:
                            warnStatus = "已开启";
                            break;
                    }
                    content[i][4] = warnStatus;
                }*/
                }
                HSSFWorkbook wb = ExcelUtil.getHSSFWorkbook(sheetName, title, content, null);
                ExcelUtil.setResponseHeader(response, fileName);
                OutputStream os = response.getOutputStream();
                wb.write(os);
                os.flush();
                os.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
            logger.error(e.getMessage(), e);
        }
    }

下面是重头戏啦。

ExcelUtil

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFRichTextString;
import javax.servlet.http.HttpServletResponse;
import javax.swing.text.Style;
import java.beans.IntrospectionException;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.InvocationTargetException;
import java.net.URLEncoder;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
public class ExcelUtil {
    public static HSSFWorkbook getHSSFWorkbook(String sheetName, String[] title, String[][] values, HSSFWorkbook wb) {
        // 第一步,创建一个HSSFWorkbook,对应一个Excel文件
        if (wb == null) {
            wb = new HSSFWorkbook();
        }
        // 第二步,在workbook中添加一个sheet,对应Excel文件中的sheet
        HSSFSheet sheet = wb.createSheet(sheetName);
        // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制
        HSSFRow row = sheet.createRow(0);
        // 第四步,创建单元格,并设置值表头 设置表头居中
        HSSFCellStyle style = wb.createCellStyle();
        style.setAlignment(HorizontalAlignment.CENTER); // 创建一个居中格式
        sheet.setColumnWidth(0, 20 * 256);
        sheet.setColumnWidth(1, 30 * 256);
        sheet.setColumnWidth(2, 50 * 256);
        sheet.setColumnWidth(3, 30 * 256);
        sheet.setColumnWidth(4, 10 * 256);
        sheet.setColumnWidth(5, 20 * 256);
        sheet.setColumnWidth(6, 20 * 256);
        //声明列对象
        HSSFCell cell = null;
        //创建标题
        for (int i = 0; i < title.length; i++) {
            cell = row.createCell(i);
            cell.setCellValue(title[i]);
            cell.setCellStyle(style);
        }
        //创建内容
        for (int i = 0; i < values.length; i++) {
            row = sheet.createRow(i + 1);
            for (int j = 0; j < values[i].length; j++) {
                //将内容按顺序赋给对应的列对象
                row.createCell(j).setCellValue(values[i][j]);
                /*if (values[i][j] != null) {
                    sheet.setColumnWidth(i, values[i][j].toString().length() * 512);
                }*/
            }
        }
        return wb;
    }
    //发送响应流方法
    public static void setResponseHeader(HttpServletResponse response, String fileName) {
        try {
            try {
                fileName = new String(fileName.getBytes(), "gbk");
            } catch (UnsupportedEncodingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            response.setContentType("application/octet-stream;charset=utf-8");
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
            response.addHeader("Pargam", "no-cache");
            response.addHeader("Cache-Control", "no-cache");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    /**
     * 生成表格数据
     */
    public void outputByDataSXSSF(HttpServletResponse response, List<List<String>> matrix, String title, String titles) throws UnsupportedEncodingException {
        Workbook workbook = null;
        try {
            // 生成workBook,导出Excel对象
            //ExcelSheetBean excelSheetBean = new ExcelSheetBean(matrix, title);
            // List<ExcelSheetBean> excelSheetBeans = new ArrayList<>();
            // excelSheetBeans.add(excelSheetBean);
            workbook = generateWorkbooks(matrix, title);
            downloadExport(workbook, response, titles);
        } catch (IllegalArgumentException | IllegalAccessException
                | InvocationTargetException | ClassNotFoundException
                | IntrospectionException | ParseException e) {
            e.printStackTrace();
        }
    }
    private Workbook generateWorkbooks(List<List<String>> matrix, String title) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException, ClassNotFoundException, IntrospectionException, ParseException, UnsupportedEncodingException {
        Workbook workBook = new SXSSFWorkbook();
        Integer maxColumnIndex = 0;
        if (matrix.size() > 0) {
            maxColumnIndex = matrix.get(0).size() - 1;
        }
        Sheet sheet = workBook.createSheet();
                /*if (title != null) {
                    workBook.setSheetName(i, title);
                }*/
        // ExcelUtil.createFontssf(workBook);
        // 标题行
        Row row0 = sheet.createRow(0);
        Cell cell = row0.createCell(0);
        CellRangeAddress range0 = new CellRangeAddress(0, 0, 0, maxColumnIndex);
        row0.setHeightInPoints(100);
        sheet.addMergedRegion(range0);
        cell.setCellValue(title);
        // 标题样式
        CellStyle style = workBook.createCellStyle();
        style.setAlignment(HorizontalAlignment.CENTER); // 指定单元格居中对齐
        style.setVerticalAlignment(VerticalAlignment.CENTER);// 设置单元格垂直居中
        //style.setAlignment(XSSFCellStyle.ALIGN_CENTER);
        Font font = workBook.createFont();
        font.setFontName("黑体");
        font.setFontHeight((short) 400);
        style.setFont(font);
        style.setWrapText(true);//设置自动换行
        cell.setCellStyle(style);
        // 标题行样式
        CellStyle stylehang = workBook.createCellStyle();
        Font fonts = workBook.createFont();
        fonts.setFontName("宋体");
        fonts.setFontHeight((short) 200);
        stylehang.setFont(fonts);
        CellStyle Headhang = workBook.createCellStyle();
        Font Headfonts = workBook.createFont();
        Headfonts.setFontName("宋体");
        Headfonts.setFontHeight((short) 200);
        Headhang.setFont(fonts);
        Headhang.setAlignment(HorizontalAlignment.CENTER);
        //内容行
        if (matrix != null && matrix.size() > 0) {
            Row currRows = sheet.createRow(1);
            List<String> rowDatas = matrix.get(0);
            if (rowDatas != null && rowDatas.size() > 0) {
                for (int k = 0; k < rowDatas.size(); k++) {
                    Cell currCell = currRows.createCell(k);
                    currCell.setCellValue(rowDatas.get(k));
                    currCell.setCellStyle(Headhang);
                }
            }
            for (int j = 1; j < matrix.size(); j++) {
                Row currRow = sheet.createRow(1 + j);
                List<String> rowData = matrix.get(j);
                rowData.removeAll(Collections.singleton(null));
                if (rowData != null && rowData.size() > 0) {
                    for (int k = 0; k < rowData.size(); k++) {
                        Cell currCell = currRow.createCell(k);
                        currCell.setCellValue(rowData.get(k));
                        currCell.setCellStyle(stylehang);
                    }
                }
            }
        }
        int maxColumn = maxColumnIndex;
        for (int j = 0; j <= maxColumn; j++) {
            // sheet.autoSizeColumn(j);
            sheet.setColumnWidth(j, sheet.getColumnWidth(j) * 19 / 5);
        }
        return workBook;
    }
    /*// SXSSFWorkbook样式
    public static void createFontssf(SXSSFWorkbook workbook) {
        // 表头
        CellStyle fontStyle = workbook.createCellStyle();
        Font font1 = workbook.createFont();
        font1.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);
        font1.setFontName("黑体");
        font1.setFontHeightInPoints((short) 14);// 设置字体大小
        fontStyle.setFont(font1);
        fontStyle.setAlignment(HorizontalAlignment.CENTER); // 居中
        // 表头2
        CellStyle fontContentStyle = workbook.createCellStyle();
        Font font3 = workbook.createFont();
        fontContentStyle.setFont(font3);
        fontContentStyle.setAlignment(HorizontalAlignment.CENTER); // 居中
        fontContentStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
        // 内容
        CellStyle fontStyle2 = workbook.createCellStyle();
        Font font2 = workbook.createFont();
        font2.setFontName("宋体");
        font2.setFontHeightInPoints((short) 10);// 设置字体大小
        fontStyle2.setFont(font2);
        fontStyle2.setBorderBottom(XSSFCellStyle.BORDER_THIN); // 下边框
        fontStyle2.setBorderLeft(XSSFCellStyle.BORDER_THIN);// 左边框
        fontStyle2.setBorderTop(XSSFCellStyle.BORDER_THIN);// 上边框
        fontStyle2.setBorderRight(XSSFCellStyle.BORDER_THIN);// 右边框
        fontStyle2.setAlignment(XSSFCellStyle.ALIGN_CENTER); // 居中
        fontStyle2.setWrapText(true);//设置自动换行
    }*/
    public void downloadExport(Object obj, HttpServletResponse response, String title) {
        response.reset();
        try {
            title = URLEncoder.encode(title, "UTF-8");
        } catch (Exception e) {
            e.getMessage();
        }
        // 指定下载的文件名
        response.setHeader("Content-Disposition", "attachment;filename=" + title + ".xlsx");
        //response.setContentType("multipart/form-data");
        response.setContentType("application/vnd.ms-excel;charset=UTF-8");
        response.setHeader("Pragma", "no-cache");
        response.setHeader("Cache-Control", "no-cache");
        response.setDateHeader("Expires", 0);
        OutputStream output;
        try {
            output = response.getOutputStream();
            SXSSFWorkbook workbook = (SXSSFWorkbook) obj;
            workbook.write(output);
            output.flush();
            output.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

我也是进行了一个参考,如果后面遇到了可以更好的拿来用,先记录到这里了,后面还有比较好用的小插件我还会继续进行总结,可以更方便自己的开发,如有不对的地方还请多多指正。

相关文章
|
4天前
|
前端开发 Java API
SpringBoot整合Flowable【06】- 查询历史数据
本文介绍了Flowable工作流引擎中历史数据的查询与管理。首先回顾了流程变量的应用场景及其局限性,引出表单在灵活定制流程中的重要性。接着详细讲解了如何通过Flowable的历史服务API查询用户的历史绩效数据,包括启动流程、执行任务和查询历史记录的具体步骤,并展示了如何将查询结果封装为更易理解的对象返回。最后总结了Flowable提供的丰富API及其灵活性,为后续学习驳回功能做了铺垫。
15 0
SpringBoot整合Flowable【06】- 查询历史数据
|
1月前
|
数据采集 数据可视化 数据挖掘
利用Python自动化处理Excel数据:从基础到进阶####
本文旨在为读者提供一个全面的指南,通过Python编程语言实现Excel数据的自动化处理。无论你是初学者还是有经验的开发者,本文都将帮助你掌握Pandas和openpyxl这两个强大的库,从而提升数据处理的效率和准确性。我们将从环境设置开始,逐步深入到数据读取、清洗、分析和可视化等各个环节,最终实现一个实际的自动化项目案例。 ####
157 10
|
2月前
|
Java API Apache
Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
【10月更文挑战第29天】Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
177 5
|
22天前
|
存储 Java easyexcel
招行面试:100万级别数据的Excel,如何秒级导入到数据库?
本文由40岁老架构师尼恩撰写,分享了应对招商银行Java后端面试绝命12题的经验。文章详细介绍了如何通过系统化准备,在面试中展示强大的技术实力。针对百万级数据的Excel导入难题,尼恩推荐使用阿里巴巴开源的EasyExcel框架,并结合高性能分片读取、Disruptor队列缓冲和高并发批量写入的架构方案,实现高效的数据处理。此外,文章还提供了完整的代码示例和配置说明,帮助读者快速掌握相关技能。建议读者参考《尼恩Java面试宝典PDF》进行系统化刷题,提升面试竞争力。关注公众号【技术自由圈】可获取更多技术资源和指导。
|
4天前
|
存储 前端开发 Java
SpringBoot整合Flowable【05】- 使用流程变量传递业务数据
本文介绍了如何使用Flowable的流程变量来管理绩效流程中的自定义数据。首先回顾了之前的简单绩效流程,指出现有流程缺乏分数输入和保存步骤。接着详细解释了流程变量的定义、分类(运行时变量和历史变量)及类型。通过具体代码示例展示了如何在绩效流程中插入全局和局部流程变量,实现各节点打分并维护分数的功能。最后总结了流程变量的使用场景及其在实际业务中的灵活性,并承诺将持续更新Flowable系列文章,帮助读者更好地理解和应用Flowable。 简要来说,本文通过实例讲解了如何利用Flowable的流程变量功能优化绩效评估流程,确保每个环节都能记录和更新分数,同时提供了全局和局部变量的对比和使用方法。
29 0
|
2月前
|
前端开发
实现Excel文件和其他文件导出为压缩包,并导入
实现Excel文件和其他文件导出为压缩包,并导入
39 1
|
2月前
|
数据格式 UED
记录一次NPOI库导出Excel遇到的小问题解决方案
【11月更文挑战第16天】本文记录了使用 NPOI 库导出 Excel 过程中遇到的三个主要问题及其解决方案:单元格数据格式错误、日期格式不正确以及合并单元格边框缺失。通过自定义单元格样式、设置数据格式和手动添加边框,有效解决了这些问题,提升了导出文件的质量和用户体验。
269 3
|
2月前
|
SQL 前端开发 关系型数据库
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
82 9
|
2月前
|
SQL 数据可视化 数据挖掘
想让Excel表格设计更美观?试试这几款好用工具!
Excel表格设计在项目管理和数据分析中至关重要。本文推荐四款辅助工具:板栗看板、Excel自动图表助手、Think-Cell Chart 和 Power BI,分别在任务管理、图表生成、数据可视化等方面表现突出,帮助你设计出更专业、美观的表格。
103 2
|
2月前
|
Java API Apache