精华内容
下载资源
问答
  • SpringBoot导出Excel表格

    2020-06-09 09:31:06
    SpringBoot导出excel表格 第一步 导入依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.8</version> </...

    SpringBoot导出excel表格

    第一步 导入依赖

            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi</artifactId>
                <version>3.8</version>
            </dependency>
    

    第二步 编写导出excel表格的工具类

    package com.xjpower.web.core.export;
    
    import org.apache.commons.lang3.StringUtils;
    import org.apache.poi.hssf.usermodel.*;
    import org.apache.poi.hssf.util.HSSFColor;
    import org.apache.poi.ss.usermodel.CellStyle;
    import org.apache.poi.ss.usermodel.CreationHelper;
    import org.apache.poi.ss.usermodel.Font;
    import org.apache.poi.ss.util.DateFormatConverter;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.OutputStream;
    import java.io.UnsupportedEncodingException;
    import java.lang.reflect.Field;
    import java.net.URLEncoder;
    import java.util.*;
    
    import com.xjpower.web.core.export.ExcelExtGrid.GridColumn;
    import org.springframework.util.ReflectionUtils;
    import org.springframework.web.servlet.view.document.AbstractExcelView;
    
    /**
     * Excel 导出的View
     */
    @SuppressWarnings("unchecked")
    public class ExcelExportView extends AbstractExcelView {
    
        /**
         * 一个像素转换为多少宽度
         */
        static final float PIX_TO_WIDTH = 100 * 50 / 132;
    
        static final String DATE_COLUMN_XTYPE = "datecolumn";
        static final String LINK_COLUMN_XTYPE = "linkcolumn";
        static final String NUMBER_COLUMN_XTYPE = "numbercolumn ";
        static final String BOOLEAN_COLUMN_XTYPE = "booleancolumn";
        static final String COLUMN_XTYPE = "gridcolumn";
    
        /**
         * 返回默认文件名
         *
         * @return
         */
        static final String getDefaultExportFileName() {
            return "export.xls";
        }
    
        /**
         * 构造函数需要的配置
         */
        ExcelExtGrid grid = null;
    
        /**
         * 填充数据所需要列表数据
         */
        List data = null;
    
        /**
         * 通过ExtjsGrid的Column配置导出
         *
         * @param grid grid配置(列)
         * @param data 查询数据
         */
        public ExcelExportView(ExcelExtGrid grid, List data) {
            this.grid = grid;
            this.data = data;
        }
    
        protected void buildExcelDocument(Map model, HSSFWorkbook workbook, HttpServletRequest req, HttpServletResponse resp) throws Exception {
            this.generateExcel(workbook, grid, data);
            String fileName = StringUtils.isNotEmpty(grid.fileName) ? grid.fileName : getDefaultExportFileName();
            fileName = fileName.endsWith(".xls") ? fileName : fileName + ".xls";
            String filename = encodeFilename(fileName, req);//处理中文文件名
            resp.setContentType("application/vnd.ms-excel");
            resp.setHeader("Content-disposition", "attachment;filename=" + filename);
    
            OutputStream ouputStream = resp.getOutputStream();
            workbook.write(ouputStream);
            ouputStream.flush();
            ouputStream.close();
        }
    
        /**
         * 设置下载文件中文件的名称
         *
         * @param filename
         * @param request
         * @return
         */
        public static String encodeFilename(String filename, HttpServletRequest request) {
            /**
             * 获取客户端浏览器和操作系统信息
             * 在IE浏览器中得到的是:User-Agent=Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; Alexa Toolbar)
             * 在Firefox中得到的是:User-Agent=Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.7.10) Gecko/20050717 Firefox/1.0.6
             */
            try {
                return URLEncoder.encode(filename, "UTF-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            return filename;
        }
    
        /**
         * grid的xtype对应到单元格赋值
         */
        Map<String, String> gridColumnXtypeFormat = null;
    
        public Map<String, String> getGridColumnXtypeFormat() {
            if (gridColumnXtypeFormat == null)
                gridColumnXtypeFormat = new HashMap<String, String>();
            String dateFormat = DateFormatConverter.convert(Locale.SIMPLIFIED_CHINESE, "yyyy-MM-dd HH:mm:ss");
            gridColumnXtypeFormat.put(DATE_COLUMN_XTYPE, dateFormat);// "yyyy-MM-dd
            // HH:mm:ss");
            return gridColumnXtypeFormat;
        }
    
        private int toColumnWidth(int pixWidth) {
            Float colWdt = pixWidth * PIX_TO_WIDTH;
            return colWdt.intValue();
        }
    
        /**
         * /**
         * 通过参数和数据生成Excel文件
         *
         * @param workbook 电子表格
         * @param grid     ExtjsGrid导出列配置
         * @param data     查询数据
         * @return
         * @throws Exception
         */
        @SuppressWarnings("unchecked")
        protected HSSFWorkbook generateExcel(HSSFWorkbook workbook, ExcelExtGrid grid, List data) throws Exception {
            workbook = workbook == null ? new HSSFWorkbook() : workbook;
    
            HSSFSheet sheet = workbook.createSheet();// 创建一个Excel的Sheet
            sheet.createFreezePane(1, 1);// 冻结header
    
            // 列头的样式
            HSSFCellStyle columnHeadStyle = getColumnHeaderStyle(workbook);
    
            try {
                // 创建第一行
                HSSFRow row0 = sheet.createRow(0);
                // 设置行高
                row0.setHeight((short) 500); // 50pix高度
    
                // 初始化列头和数据列单元格样式
                Map<String, HSSFCellStyle> columnStyleMap = new HashMap<String, HSSFCellStyle>();
    
                for (int i = 0; i < grid.columns.size(); i++) {
                    GridColumn col = grid.columns.get(i);
                    if (col.width != null) {
                        sheet.setColumnWidth(i, toColumnWidth(col.width));// 70pix宽度
                    } else
                        sheet.setColumnWidth(i, toColumnWidth(100));
    
                    HSSFCell cell = row0.createCell(i);
                    cell.setCellStyle(columnHeadStyle);
                    cell.setCellValue(new HSSFRichTextString(col.header));
    
                    columnStyleMap.put(col.dataIndex, getDataCellStyle(workbook, col.xtype));
                }
    
                // 填充数据内容
                for (int i = 0; i < data.size(); i++) {
                    Object robj = data.get(i);
                    HSSFRow row = sheet.createRow(i + 1);// 除去头部
                    HSSFCell cell = null;
                    // 当行赋值
                    for (int c = 0; c < grid.columns.size(); c++) {
                        GridColumn col = grid.columns.get(c);
                        cell = row.createCell(c);
    
                        setDataCellValue(robj, cell, col, workbook);
    
                        cell.setCellStyle(columnStyleMap.get(col.dataIndex));
                    }
                }
    
                return workbook;
    
            } catch (Exception e) {
                throw new Exception("导出Excel文件[" + grid.fileName + "]出错", e);
            }
        }
    
        /**
         * 设置列值 (日期类型赋值date,默认类型String
         *
         * @param rdata 汗数据
         * @param cell  单元格
         * @param col   列
         */
        private void setDataCellValue(Object rdata, HSSFCell cell, GridColumn col, HSSFWorkbook workbook) {
            Object o = null;
    
            if (rdata instanceof Map) {
                o = ((Map) rdata).get(col.dataIndex);
            } else {
                o = getFieldValue(rdata, col.dataIndex);
            }
    
            if (o == null)
                return;
    
            if (DATE_COLUMN_XTYPE.equals(col.xtype)) {
                if (o instanceof Date) {
                    cell.setCellValue((Date) o);
                }
            } else {
                cell.setCellValue(o.toString());
            }
        }
    
        /**
         * @param src
         * @param valuePath
         * @return
         */
        public static Object getFieldValue(Object src, String valuePath) {
            String[] valuePaths = valuePath.split("\\.");
            Object o = src;
            for (String field : valuePaths) {
                Field f = ReflectionUtils.findField(src.getClass(), field);
                ReflectionUtils.makeAccessible(f);
    
                o = ReflectionUtils.getField(f, o);
            }
            return o;
        }
    
        /**
         * 获取每个数据内容单元格的样式
         *
         * @param workbook
         * @param gridColumnXtype 默认配置格式化
         * @return
         */
        private HSSFCellStyle getDataCellStyle(HSSFWorkbook workbook, String gridColumnXtype) {
            HSSFFont font = workbook.createFont();
            CreationHelper createHelper = workbook.getCreationHelper();
    
            font.setFontName("宋体");
            font.setFontHeightInPoints((short) 10);
            // 普通单元格样式
            HSSFCellStyle style = workbook.createCellStyle();
            style.setFont(font);
            style.setAlignment(CellStyle.ALIGN_LEFT);// 左右居中
            style.setVerticalAlignment(CellStyle.VERTICAL_TOP);// 上下居中
            style.setWrapText(true);
            style.setLeftBorderColor(HSSFColor.BLACK.index);
            style.setBorderLeft((short) 1);
            style.setRightBorderColor(HSSFColor.BLACK.index);
            style.setBorderRight((short) 1);
            style.setBorderBottom(CellStyle.BORDER_THIN); // 设置单元格的边框为粗体
            style.setBottomBorderColor(HSSFColor.BLACK.index); // 设置单元格的边框颜色.
            style.setFillForegroundColor(HSSFColor.WHITE.index);// 设置单元格的背景颜色.
    
            String format = getGridColumnXtypeFormat().get(gridColumnXtype);
            if (StringUtils.isNotEmpty(format)) {// "m/d/yy h:mm"
                style.setDataFormat(createHelper.createDataFormat().getFormat(format));
            }
    
            return style;
        }
    
        /**
         * 生成列头样式
         *
         * @param workbook
         * @return
         */
        private HSSFCellStyle getColumnHeaderStyle(HSSFWorkbook workbook) {
            HSSFFont columnHeadFont = workbook.createFont();
            columnHeadFont.setFontName("宋体");
            columnHeadFont.setFontHeightInPoints((short) 10);
            columnHeadFont.setBoldweight(Font.BOLDWEIGHT_BOLD);
    
            HSSFCellStyle columnHeadStyle = workbook.createCellStyle();
            columnHeadStyle.setFont(columnHeadFont);
            columnHeadStyle.setAlignment(CellStyle.ALIGN_CENTER);// 左右居中
            columnHeadStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);// 上下居中
            columnHeadStyle.setLocked(true);
            columnHeadStyle.setWrapText(true);
            columnHeadStyle.setLeftBorderColor(HSSFColor.BLACK.index);// 左边框的颜色
            columnHeadStyle.setBorderLeft((short) 1);// 边框的大小
            columnHeadStyle.setRightBorderColor(HSSFColor.BLACK.index);// 右边框的颜色
            columnHeadStyle.setBorderRight((short) 1);// 边框的大小
            columnHeadStyle.setBorderBottom(CellStyle.BORDER_THIN); // 设置单元格的边框为粗体
            columnHeadStyle.setBottomBorderColor(HSSFColor.BLACK.index); // 设置单元格的边框颜色
            columnHeadStyle.setFillForegroundColor(HSSFColor.WHITE.index); // 设置单元格的背景颜色(单元格的样式会覆盖列或行的样式)
            return columnHeadStyle;
        }
    }
    

    第三步 编写映射到excel表格的样式类

    package com.xjpower.web.core.export;
    
    import java.util.ArrayList;
    import java.util.List;
    
    
    /**
     * 映射到ExtjsGrid的 Excel导出格式
     */
    public class ExcelExtGrid {
    
        public String fileId;
    
        public String fileName;
    
        /**
         * 增加 Grid column
         *
         * @param header
         * @param width
         * @param dataIndex
         */
        public void addGridColumn(String header, Integer width, String dataIndex, String xtype) {
            GridColumn col = new GridColumn();
            col.header = header;
            col.width = width;
            col.dataIndex = dataIndex;
            col.xtype = xtype;
            this.columns.add(col);
        }
    
        /**
         * 表列布局
         */
        public List<GridColumn> columns = new ArrayList<GridColumn>();
    
        /**
         * extjs grid的属性映射
         */
        public static class GridColumn {
            /**
             * 列头
             */
            public String header;
    
            /**
             * 列宽度
             */
            public Integer width;
    
            /**
             * 访问值
             */
            public String dataIndex;
    
            /**
             * 数据类型
             */
            public String xtype;
        }
    }
    

    第四步 编写Controller

     /*导出表格*/
        @RequestMapping("outInRecord/exportList")
        @ResponseBody
        public ModelAndView exportList(String name) {
            ExcelExportView excelExportView = null;
            try {
               /* JSONObject jsonObject = JSONObject.parseObject(qp);
                ExportDto exportDto = jsonObject.getObject("q", ExportDto.class);*/
                int start = 0;
                int limit = 2000;//最大导出总数
                ExcelExtGrid grid = new ExcelExtGrid();
                grid.fileName = "员工责任表";
                grid.addGridColumn("编号", 80, "ID", "gridcolumn");
                grid.addGridColumn("名字", 80, "name", "gridcolumn");
                grid.addGridColumn("责任", 80, "bility", "gridcolumn");
                /*从数据库查出来相对应的数据*/
                PageInfo<People> outInRecordDetailPageInfo = peopleService.SelectAll(name,start, limit);
    
                excelExportView = new ExcelExportView(grid, outInRecordDetailPageInfo.getList());
            } catch (Exception e) {
                logger.error("OutInRecordController.exportList异常:", e); //不用写也行
            }
            return new ModelAndView(excelExportView);
        }
    

    第五步 js调用后端得到数据

    $("#exportList").on('click', function (event) {
           // FormUtils.create("people/outInRecord/exportList");
            alert("ss");
            window.location.href="outInRecord/exportList";
            event.stopPropagation();
        });
    
    展开全文
  • springboot 导出excel表格

    2018-08-28 18:03:33
    相信很多写后端的小伙伴都会遇到需要导出Excel表格是需求,产品经理说:那个某某某,需要把系统的数据自动导出表格,方便统计。说句实话,这个功能确实很方便管理员整理数据,而且在后端的工作中也经常需要使用此...

    相信很多写后端的小伙伴都会遇到需要导出Excel表格是需求,产品经理说:那个某某某,需要把系统的数据自动导出表格,方便统计。说句实话,这个功能确实很方便管理员整理数据,而且在后端的工作中也经常需要使用此功能,下面我们使用 apache的poi进行Excel表格的构建及导出数据。

    首先,需要依赖,maven引入依赖

    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>3.14</version>
    </dependency>

    导入依赖完成后就可以写逻辑了,先写几个需要用到的方法

    创建表头

    // 创建表头
    private void createTitle(HSSFWorkbook workbook, HSSFSheet sheet) {
            HSSFRow row = sheet.createRow(0);
            //设置列宽,setColumnWidth的第二个参数要乘以256,这个参数的单位是1/256个字符宽度
            sheet.setColumnWidth(1, 20 * 256);
            sheet.setColumnWidth(2, 20 * 256);
            sheet.setColumnWidth(3, 20 * 256);
            sheet.setColumnWidth(4, 70 * 256);
            sheet.setColumnWidth(5, 20 * 256);
            sheet.setColumnWidth(6, 20 * 256);
            sheet.setColumnWidth(6, 30 * 256);
    
            //设置为居中加粗
            HSSFCellStyle style = workbook.createCellStyle();
            HSSFFont font = workbook.createFont();
            font.setBold(true);
            font.setFontName("微软雅黑");
            // 1px = 20 short,此处相当于 14px
            font.setFontHeight((short) 280);
            font.setColor(Font.COLOR_RED);
            // 表头 水平居中
            style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
            style.setFont(font);
    
            HSSFCell cell;
    
            // 表头列数 0 开始 属于第一列
            cell = row.createCell(0);
            // 表头名称
            cell.setCellValue("ID");
            // 表头样式
            cell.setCellStyle(style);
    
    
            cell = row.createCell(1);
            cell.setCellValue("userName");
            cell.setCellStyle(style);
    
            cell = row.createCell(2);
            cell.setCellValue("FirstName");
            cell.setCellStyle(style);
    
            cell = row.createCell(3);
            cell.setCellValue("LastName");
            cell.setCellStyle(style);
        }

    需要注意的是 cell 每次设置样式的时候都需要重新 cell.setCellStyle 否则只有第一个有效

    生成 Excel 文件的方法

    /**
     * 生成 Excel 文件
     *
     * @param filename
     * @param workbook
     * @throws Exception
     */
    protected void buildExcelFile(String filename, HSSFWorkbook workbook) throws Exception {
       FileOutputStream fos = new FileOutputStream(filename);
       workbook.write(fos);
       fos.flush();
       fos.close();
    }

    往浏览器下载 Excel

    /**
     * 往客户浏览器下载Excel
     *
     * @param filename
     * @param workbook
     * @param response
     * @throws Exception
     */
    protected void buildExcelDocument(String filename, HSSFWorkbook workbook, HttpServletResponse response) throws Exception {
        response.setContentType("application/vnd.ms-excel");
        response.setHeader("Content-Disposition", "attachment;filename=" +         
                            URLEncoder.encode(filename, "utf-8"));
        OutputStream outputStream = response.getOutputStream();
        workbook.write(outputStream);
        outputStream.flush();
        outputStream.close();
    }

    上面三个需要用到的方法已经封装好了,接下来就在接口中写逻辑,插入数据,生成表格,下载表格就可以了。具体的实现如下的 controller 代码

    @RequestMapping(value = "exportExcel")
    @ResponseBody
    public String downExcel(String fileName, HttpServletResponse response) {
    
        HSSFWorkbook workbook = new HSSFWorkbook();
        HSSFSheet sheet = workbook.createSheet("统计表");
        createTitle(workbook, sheet);
        
        // 设置内容 列样式
        HSSFCellStyle style = workbook.createCellStyle();
        
        // 设置字体
        HSSFFont font = workbook.createFont();
        font.setFontName("微软雅黑");
        // 相当于 12px,1 px = 20 short
        font.setFontHeight((short) 240);
        style.setFont(font);
    
        // 设置 水平、垂直居中
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
    
        int rowNum = 1;
        // 表示创建第一行
        HSSFRow row = sheet.createRow(rowNum);
        // 设置行高
        row.setHeight((short) 600);
        
        // 设置第一列内容
        HSSFCell cell = row.createCell(0);
        cell.setCellValue("123");
        cell.setCellStyle(style);
    
        // 设置第二列内容
        HSSFCell cell = row.createCell(1);
        cell.setCellValue("456");
        cell.setCellStyle(style);
    
        
        try {
          buildExcelFile(fileName, workbook);
          buildExcelDocument(fileName, workbook, response);
        } catch (Exception e) {
          System.out.println(e.getMessage());
        }
    }

    以上主要的功能就已经完成了,访问 exportExcel 接口就会自动下载 创建好的 Excel 表格了。

    需要注意的是,插入数据时,一般是需要使用循环进行多行插入,在循环尾处进行 rowNum++,进行增加行数操作。如有不懂,请留言,楼主看到会回复哦~嘻嘻

    展开全文
  • SpringBoot导出EXCEL表格

    2021-07-15 08:16:37
    导出Excel表格 //这里传入的参数为id,可以根据需要换成自己的参数 public void excelExport(HttpServletResponse response,Long id) throws IOException { List<BaseBudget> list = toAccount(id); //表格的名称 ...

    1.导入依赖

    <!-- easyexcel相关依赖 -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>easyexcel</artifactId>
        <version>1.1.2-beta5</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>3.17</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.17</version>
    </dependency>
    

    2.创建实体类

    • 创建的实体类不能是数据库中的表,会多出一个字段。
    • 继承BaseRowModel类。
    • 字段上面的注解是显示在excel表格中的列名。
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class BaseBudget extends BaseRowModel {
        @ExcelProperty(value = "姓名", index = 0)
        public String name;
        @ExcelProperty(value = "费用", index = 1)
        public Integer cost;
    }
    

    3.导出Excel表格

    //这里传入的参数为id,可以根据需要换成自己的参数
    public void excelExport(HttpServletResponse response,Long id) throws IOException {
            List<BaseBudget> list = toAccount(id);
            //表格的名称
            String fileName = "用户账单";
            //下面几行都是默认配置,不用管
            response.setContentType("application/vnd.ms-excel;charset=utf-8");
            response.setCharacterEncoding("utf-8");
            response.setHeader("Content-disposition", "attachment;filename=" + new String( fileName.getBytes("gb2312"), "ISO8859-1" ) + ".xls");
            ServletOutputStream out = response.getOutputStream();
            ExcelWriter writer = new ExcelWriter(out, ExcelTypeEnum.XLS,true);
           //创建一个sheet , 最后一个参数必须是继承了 BaseRowModel 的类
            Sheet sheet = new Sheet(1,0,BaseBudget.class);
            //设置自适应宽度
            sheet.setAutoWidth(Boolean.TRUE);
            sheet1.setAutoWidth(Boolean.TRUE);
            sheet.setSheetName("用户账单");
            //将list数组写入 sheet 中
            writer.write(list,sheet);
            writer.finish();
            out.flush();
            response.getOutputStream().close();
            out.close();
        }
    
    展开全文
  • Springboot导出Excel表格

    2020-07-17 19:04:14
    @ApiOperation("后台管理-导出开奖信息") @IgnoreAuth @GetMapping("exportPrizeExchangeInfo") public void exportPrizeExchangeInfo(BevActivitySettingIdReq req){ response.setCharacterEncoding("utf-8");...

    前言:

    项目需求:客户点击 “导出” 按钮将下载一个excel表格到本地电脑。
    需求分析:前端传一个id,后台根据id查询出数据列表并导出;

    实现效果:

    在这里插入图片描述

    代码实现过程:

    一.引入依赖:

            <dependency>
                <groupId>cn.afterturn</groupId>
                <artifactId>easypoi-spring-boot-starter</artifactId>
                <version>4.1.3</version>
            </de
    展开全文
  • SpringBoot 导出Excel表格,并实现前端Vue+Axios下载文件不跳转页面
  • } //下载excel文件 public void download(String fileName,HttpServletResponse res,String name) { res.setHeader("content-type", "application/octet-stream"); res.setContentType("application/octet-stream")...
  • SpringBoot导出Excel表格(之一)

    千次阅读 2018-12-21 18:25:51
    * 导出Excel * @author LeviCoder * @create 2018-12-21 17:49 */ public class ExportExcelUtils { private static final Logger logger = LoggerFactory.getLogger(ExportExcelUtils.class); /** *导出...
  • Vue+SpringBoot导出Excel,自定义要导出的表格的列前言一、Vue弹出层?1.数据展示2.导出弹出层3.弹出层界面二、后端API1.控制类2.实现逻辑总结 前言 之前一篇博客介绍了使用POI来完成报表的导出,默认都是导出所有...
  • SpringBoot实现excel表格导出 一、引入依赖 <!--导出excel--> <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>1.1.2-...
  • SpringbootExcel表格导出 表格导出使用的还是POI,POI的介绍请查看 https://blog.csdn.net/qq_36654629/article/details/90172911 使用前需引入poi相关依赖 <dependency> <groupId>org.apache.poi&...
  • Springboot项目excel表格导出功能 1.引入依赖 <poi.version>3.17</poi.version> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,662
精华内容 664
关键字:

springboot导出excel表格

spring 订阅