实现根据搜索条件,导出excel表格信息(vue+java)

2 篇文章 0 订阅

vue

<template>
<el-col>
<el-button type="primary" @click="excel()">导出</el-button>
</el-col>
</template>

import querystring from "querystring";
methods: {
	excel(){
      const query = require("querystring")
      let queryExParam = '';
      if(this.exParam){
      	//可自动将json对象转为query串
        queryExParam = '?' +query.stringify(this.exParam);
      }
      let downloadUrl = `${baseUrl}/boss-sms/sms-mt/export${queryExParam}`;
      downloadFile({ url: downloadUrl })
    },
	
	// 公共文件下载
	 downloadFile = ({ url = '' } = {}) => {
	  const aLink = document.createElement('a')
	  aLink.href = url
	  aLink.click()
	  document.body.appendChild(aLink)
	  document.body.removeChild(aLink)
	}
}

java

实体类

package net.qh.boss.sms.dto;


import cn.afterturn.easypoi.excel.annotation.Excel;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;


import java.util.Date;

@Data
public class SmsMtExportDto  {

    private static final long serialVersionUID = 1L;

    @Excel(name = "发送用户", height = 10, width = 20, orderNum = "1")
    private String createBy;

    @Excel(name = "手机号码", height = 10, width = 20, orderNum = "2")
    private String phone;

    @Excel(name = "短信内容", height = 10, width = 20, orderNum = "3")
    private String smsContent;
}

pom

        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-base</artifactId>
            <version>3.2.0</version>
        </dependency>
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-web</artifactId>
            <version>3.2.0</version>
        </dependency>
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-annotation</artifactId>
            <version>3.2.0</version>
        </dependency>

ExcelStyleUtil

package net.qh.boss.sms.utils;

import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
import cn.afterturn.easypoi.excel.entity.params.ExcelForEachParams;
import cn.afterturn.easypoi.excel.export.styler.IExcelExportStyler;
import org.apache.poi.ss.usermodel.*;

/**
 * @author 王鑫磊
 * @date 2019/11/04
 */
public class ExcelStyleUtil implements IExcelExportStyler {
    private static final short STRING_FORMAT = (short) BuiltinFormats.getBuiltinFormat("TEXT");
    private static final short FONT_SIZE_TEN = 10;
    private static final short FONT_SIZE_ELEVEN = 11;
    private static final short FONT_SIZE_TWELVE = 12;
    /**
     * 大标题样式
     */
    private CellStyle headerStyle;
    /**
     * 每列标题样式
     */
    private CellStyle titleStyle;
    /**
     * 数据行样式
     */
    private CellStyle styles;

    public ExcelStyleUtil(Workbook workbook) {
        this.init(workbook);
    }

    /**
     * 初始化样式
     *
     * @param workbook
     */
    private void init(Workbook workbook) {
        this.headerStyle = initHeaderStyle(workbook);
        this.titleStyle = initTitleStyle(workbook);
        this.styles = initStyles(workbook);
    }

    /**
     * 大标题样式
     *
     * @param color
     * @return
     */
    @Override
    public CellStyle getHeaderStyle(short color) {
        return headerStyle;
    }

    /**
     * 每列标题样式
     *
     * @param color
     * @return
     */
    @Override
    public CellStyle getTitleStyle(short color) {
        return titleStyle;
    }

    /**
     * 数据行样式
     *
     * @param parity 可以用来表示奇偶行
     * @param entity 数据内容
     * @return 样式
     */
    @Override
    public CellStyle getStyles(boolean parity, ExcelExportEntity entity) {
        return styles;
    }

    /**
     * 获取样式方法
     *
     * @param dataRow 数据行
     * @param obj     对象
     * @param data    数据
     */
    @Override
    public CellStyle getStyles(Cell cell, int dataRow, ExcelExportEntity entity, Object obj, Object data) {
        return getStyles(true, entity);
    }

    /**
     * 模板使用的样式设置
     */
    @Override
    public CellStyle getTemplateStyles(boolean isSingle, ExcelForEachParams excelForEachParams) {
        return null;
    }

    /**
     * 初始化--大标题样式
     *
     * @param workbook
     * @return
     */
    private CellStyle initHeaderStyle(Workbook workbook) {
        CellStyle style = getBaseCellStyle(workbook);
        style.setFont(getFont(workbook, FONT_SIZE_TWELVE, true));
        return style;
    }

    /**
     * 初始化--每列标题样式
     *
     * @param workbook
     * @return
     */
    private CellStyle initTitleStyle(Workbook workbook) {
        CellStyle style = getBaseCellStyle(workbook);
        style.setFont(getFont(workbook, FONT_SIZE_ELEVEN, false));
        //背景色
        style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
        style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        return style;
    }

    /**
     * 初始化--数据行样式
     *
     * @param workbook
     * @return
     */
    private CellStyle initStyles(Workbook workbook) {
        CellStyle style = getBaseCellStyle(workbook);
        style.setFont(getFont(workbook, FONT_SIZE_TEN, false));
        style.setDataFormat(STRING_FORMAT);
        style.setFillBackgroundColor(IndexedColors.RED.getIndex());
        style.setFillForegroundColor(IndexedColors.RED.getIndex());
        return style;
    }

    /**
     * 基础样式
     *
     * @return
     */
    private CellStyle getBaseCellStyle(Workbook workbook) {
        CellStyle style = workbook.createCellStyle();
        //下边框
        style.setBorderBottom(BorderStyle.THIN);
        //左边框
        style.setBorderLeft(BorderStyle.THIN);
        //上边框
        style.setBorderTop(BorderStyle.THIN);
        //右边框
        style.setBorderRight(BorderStyle.THIN);
        //水平居中
        style.setAlignment(HorizontalAlignment.CENTER);
        //上下居中
        style.setVerticalAlignment(VerticalAlignment.CENTER);
        //设置自动换行
        style.setWrapText(true);
        return style;
    }

    /**
     * 字体样式
     *
     * @param size   字体大小
     * @param isBold 是否加粗
     * @return
     */
    private Font getFont(Workbook workbook, short size, boolean isBold) {
        Font font = workbook.createFont();
        //字体样式
        font.setFontName("宋体");
        //是否加粗
        font.setBold(isBold);
        //字体大小
        font.setFontHeightInPoints(size);
        return font;
    }
}

Controller

@GetMapping("/export")
    @ApiOperation("excel导出")
    public void  export(SmsMtSearchVo  searchVo, HttpServletResponse response) {
        smsMtService.export(searchVo,response);
    }

ServiceImpl

@Override
    public void export(SmsMtSearchVo searchVo, HttpServletResponse response) {

        //文件名
        String sheetName = "短信发送记录_" + DateUtil.format(new Date(), "yyyy-MM-dd");
        try (OutputStream out = response.getOutputStream()){
            response.getOutputStream();
            ExportParams params = new ExportParams(null, sheetName, ExcelType.XSSF);
            params.setTitleHeight((short) 20);

            params.setStyle(ExcelStyleUtil.class);

            //查询结果
            List<SmsMtDto> smsMtDtos = this.selectSmsMtList(searchVo);
            //拷贝查询结果list给导出结果
            List<SmsMtExportDto> numberExportDTOS = smsMtDtos.stream().map(item -> {
                SmsMtExportDto exportDto = CopyUtils.INSTANCE.map(SmsMtExportDto.class, item);

                exportDto.setCreateTime(DateUtil.format(item.getCreateTime(), "yyyy-MM-dd 
                return exportDto;
            }).collect(toList());

            Workbook workbook = ExcelExportUtil.exportExcel(params, SmsMtExportDto.class, numberExportDTOS);

            response.setContentType("application/octet-stream");
            response.setHeader("Content-disposition", "attachment; filename="
                    + new String((sheetName + ".xlsx").getBytes("GBK"), "ISO-8859-1"));
            //输出结果集
            workbook.write(out);
        } catch (Exception e) {
            e.printStackTrace();
        }


    }
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue+Java解析Excel文件的步骤如下: 1. 前端上传Excel文件 在Vue组件中,可以使用`<input type="file">`元素实现文件上传功能。例如: ``` <template> <div> <input type="file" @change="handleFileUpload"> </div> </template> <script> export default { methods: { handleFileUpload(event) { const file = event.target.files[0] // 将文件上传到后端 // ... } } } </script> ``` 2. 后端接收Excel文件 使用Java后台框架,例如Spring Boot,可以在Controller中定义一个接收文件的方法。例如: ``` @PostMapping("/upload") public ResponseEntity<?> uploadFile(@RequestParam("file") MultipartFile file) { // 处理上传的文件 // ... } ``` 3. 使用Apache POI解析Excel文件 使用Java的Apache POI库,可以方便地解析Excel文件。在Controller中,可以使用如下代码解析Excel文件: ``` @PostMapping("/upload") public ResponseEntity<?> uploadFile(@RequestParam("file") MultipartFile file) { try { XSSFWorkbook workbook = new XSSFWorkbook(file.getInputStream()); XSSFSheet sheet = workbook.getSheetAt(0); Iterator<Row> rowIterator = sheet.iterator(); while (rowIterator.hasNext()) { Row row = rowIterator.next(); Iterator<Cell> cellIterator = row.cellIterator(); while (cellIterator.hasNext()) { Cell cell = cellIterator.next(); // 处理Excel单元格 // ... } } } catch (IOException e) { e.printStackTrace(); } return ResponseEntity.ok().build(); } ``` 在上述代码中,使用XSSFWorkbook类和XSSFSheet类分别表示Excel文件和工作表。通过调用iterator()方法,可以获取行和单元格的迭代器。然后,可以对每个单元格进行处理,例如读取单元格的值,进行数据校验等等。 4. 将解析结果返回给前端 在处理完Excel文件后,可以将解析结果返回给前端,例如将数据保存到数据库中,或者将数据以JSON格式返回给前端。在Controller中,可以使用如下代码将解析结果返回给前端: ``` @PostMapping("/upload") public ResponseEntity<?> uploadFile(@RequestParam("file") MultipartFile file) { List<Map<String, Object>> data = new ArrayList<>(); try { XSSFWorkbook workbook = new XSSFWorkbook(file.getInputStream()); XSSFSheet sheet = workbook.getSheetAt(0); Iterator<Row> rowIterator = sheet.iterator(); while (rowIterator.hasNext()) { Row row = rowIterator.next(); Iterator<Cell> cellIterator = row.cellIterator(); Map<String, Object> rowData = new HashMap<>(); while (cellIterator.hasNext()) { Cell cell = cellIterator.next(); String columnName = cell.getStringCellValue(); Cell valueCell = cellIterator.next(); Object value; if (valueCell.getCellType() == CellType.NUMERIC) { value = valueCell.getNumericCellValue(); } else { value = valueCell.getStringCellValue(); } rowData.put(columnName, value); } data.add(rowData); } } catch (IOException e) { e.printStackTrace(); } return ResponseEntity.ok(data); } ``` 在上述代码中,使用List<Map<String, Object>>类型保存解析结果。对于每一行数据,使用Map<String, Object>类型保存列名和列值的对应关系。最后,将解析结果以JSON格式返回给前端。 以上就是Vue+Java解析Excel文件的基本步骤。需要注意的是,解析Excel文件需要考虑到文件格式、数据校验、异常处理等问题,具体实现需要根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值