Java+element实现excel的导入和导出

作者:涛涛英语学不进去 时间:2022-07-31 12:45:53 

本项目是前端vue3,后端springboot开发 需求为:前端导入表格,后端处理表格存储数据,点击按钮可以导出表格。

上传效果:前端点击上传按钮,会跳出选择文件框,选择文件,点击上传。

导出效果:前端点击导出按钮,会跳出下载框,选择位置自动下载。

上传效果图:

Java+element实现excel的导入和导出

下载效果图:

Java+element实现excel的导入和导出

一、上传excel前端代码

<el-upload
             ref="file"
             class="upload-demo"
             :limit="1"
             accept=".xlsx, .xls"
             action="http://localhost:8081/admin/perform/importexcel"
             auto-upload="false"
           >
             <template #trigger>
               <el-button type="primary">选择文件</el-button>
             </template>

<el-button
               class="ml-3"
               style="margin-left: 20px"
               type="success"
               @click="submitUpload"
             >
               上传文件
             </el-button>

仅允许导入xls、xlsx格式文件。
           </el-upload>
import { ref, reactive, computed } from "vue"
import { ElMessage, UploadInstance } from "element-plus"

const file = ref<UploadInstance>()

const submitUpload = () => {
 file.value!.submit()
 ElMessage({
   message: "上传成功",
   type: "success",
 })
 window.location.reload()
}

效果图

Java+element实现excel的导入和导出

二、上传excel后端代码

Controller层

@PostMapping("/importexcel")
   public Result importData(MultipartFile file) throws Exception {
       return performService.importData(file.getInputStream());
   }

Service层

@Override
   public Result importData(InputStream inputStream) throws IOException {
   // Perform根据自己表格的表头创建的实体,要意义对应
       List<Perform> res = new ArrayList<>();
       try {
           ins = (FileInputStream) inputStream;
           //true xls文件,false xlsx文件
           Workbook workbook = null;
           // XSSFWorkbook instance of HSSFWorkbook 所以通用
           workbook = new XSSFWorkbook(ins);
           //获取工作表
           Sheet sheet = workbook.getSheetAt(0);
           //获取表头
           Row rowHead = sheet.getRow(0);
           //判断表头是否正确
           if (rowHead.getPhysicalNumberOfCells() < 1) {
               return Result.error("表头错误");
           }
           //获取数据
           for (int i = 1; i <= sheet.getLastRowNum(); i++) {
               //获取第一行的用户信息
               Row row = sheet.getRow(i);

String tId;
               if (row.getCell(0) == null) {
                   tId = "";
                   row.createCell(0).setCellValue(tId);
               } else {
                   //先设置为字符串再作为数字读出来
                   row.getCell(0).setCellType(CellType.STRING);
                   tId = row.getCell(0).getStringCellValue();
               }

String tName;
               if (row.getCell(1) == null) {
                   tName = "";
                   row.createCell(1).setCellValue(tName);
               } else {
                   tName = row.getCell(1).getStringCellValue();
               }

String tDept;
               if (row.getCell(2) == null) {
                   tDept = "";
                   row.createCell(2).setCellValue(tDept);
               } else {
                   tDept = row.getCell(2).getStringCellValue();
               }
....................
              Perorm perform=new Perform()
              xxxset创建实体

System.out.println(perform);
               res.add(perform);
           }

} catch (IOException e) {
           e.printStackTrace();
       } finally {
           if (ins != null) {
               try {
                   ins.close();
               } catch (IOException e) {
                   e.printStackTrace();
               }
           }
           if (out != null) {
               try {
                   out.close();
               } catch (IOException e) {
                   e.printStackTrace();
               }
           }
       }
       new Thread(() -> {
           //批处理比较快
           batchInsert(res);
       }).start();
       return Result.success(res);

}
     /**
    * 批量插入更快
    *
    * @param performList
    */
   private void batchInsert(List<Perform> performList) {
       SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, false);
       performList.stream().forEach(perform -> {
           performMapper.insert(perform);
       });
       sqlSession.commit();
       sqlSession.clearCache();
   }

三、下载excel前端代码

<el-button
                 type="warning"
                 style="width: 100px"
                 @click="exportInfo()"
               >
           <a href="http://localhost:8081/admin/perform/exportexcel" rel="external nofollow"
                   >导出</a
                 >
               </el-button>
const exportInfo = () => {
 ElMessage({
   message: "请稍等",
   type: "warning",
 })
}

四、下载excel后端代码

Controller层

/**
    * 导出表格
    *
    * @return
    */
   @GetMapping("/exportexcel")
   public void exportExcel(HttpServletResponse response) throws Exception {
       performService.exportExcel(response);
   }

Service层

@Override
   public void exportExcel(HttpServletResponse response) throws IOException {
       System.out.println("导出表格");
       List<Perform> list = performMapper.selectList(new QueryWrapper<>());
       String sheetName = "教师业绩表";
       Map<String, String> titleMap = new LinkedHashMap<>();
       titleMap.put("tId", "教师工号");
       titleMap.put("tName", "教师姓名");
.....根据自己的表头来
       ExportExcel.excelExport(response, list, titleMap, sheetName);
   }

ExportExcel类:

package com.performance.back.common.utils;

import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.performance.back.admin.dao.entity.Perform;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
* @ClassName ExportExcel
* @Descriotion TODO
* @Author nitaotao
* @Date 2022/11/14 11:55
* @Version 1.0
**/
public class ExportExcel {
   private ExportExcel() {
   }

/***
    * 工作簿
    */
   private static HSSFWorkbook workbook;

/***
    * sheet
    */
   private static HSSFSheet sheet;
   /***
    * 标题行开始位置
    */
   private static final int TITLE_START_POSITION = 0;

/***
    * 时间行开始位置
    */
   private static final int DATEHEAD_START_POSITION = 1;

/***
    * 表头行开始位置
    */
   private static final int HEAD_START_POSITION = 0;

/***
    * 文本行开始位置
    */
   private static final int CONTENT_START_POSITION = 1;

/***
    *
    * @param sheetName
    *        sheetName
    */
   private static void initHSSFWorkbook(String sheetName) {
       workbook = new HSSFWorkbook();
       sheet = workbook.createSheet(sheetName);
       sheet.setDefaultColumnWidth(15);
   }

/**
    * 生成标题(第零行创建)
    *
    * @param titleMap  对象属性名称->表头显示名称
    * @param sheetName sheet名称
    */
   private static void createTitleRow(Map<String, String> titleMap, String sheetName) {
       CellRangeAddress titleRange = new CellRangeAddress(0, 0, 0, titleMap.size() - 1);
       sheet.addMergedRegion(titleRange);
       HSSFRow titleRow = sheet.createRow(TITLE_START_POSITION);
       HSSFCell titleCell = titleRow.createCell(0);
       titleCell.setCellValue(sheetName);
   }

/**
    * 创建时间行(第一行创建)
    *
    * @param titleMap 对象属性名称->表头显示名称
    */
   private static void createDateHeadRow(Map<String, String> titleMap) {
       CellRangeAddress dateRange = new CellRangeAddress(1, 1, 0, titleMap.size() - 1);
       sheet.addMergedRegion(dateRange);
       HSSFRow dateRow = sheet.createRow(DATEHEAD_START_POSITION);
       HSSFCell dateCell = dateRow.createCell(0);
       dateCell.setCellValue(new SimpleDateFormat("yyyy年MM月dd日").format(new Date()));
   }

/**
    * 创建表头行(第二行创建)
    *
    * @param titleMap 对象属性名称->表头显示名称
    */
   private static void createHeadRow(Map<String, String> titleMap) {
       // 第1行创建
       HSSFRow headRow = sheet.createRow(HEAD_START_POSITION);
       headRow.setHeight((short) 900);
       int i = 0;
       for (String entry : titleMap.keySet()) {
           // 生成一个样式
           HSSFCellStyle style = workbook.createCellStyle();
           // 设置这些样式
           style.setAlignment(HorizontalAlignment.CENTER);//水平居中
           style.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中

// 设置边框
           style.setBorderBottom(BorderStyle.THIN);
           style.setBorderLeft(BorderStyle.THIN);
           style.setBorderRight(BorderStyle.THIN);
           style.setBorderTop(BorderStyle.THIN);
           // 自动换行
           style.setWrapText(true);

// 生成一个字体
           HSSFFont font = workbook.createFont();
           font.setFontHeightInPoints((short) 10);
           font.setColor(IndexedColors.WHITE.index);
           font.setBold(false);
           font.setFontName("宋体");

// 把字体 应用到当前样式
           style.setFont(font);
           //style设置好后,为cell设置样式

HSSFCell headCell = headRow.createCell(i);
           headCell.setCellValue(titleMap.get(entry));
           if (i > 14) {
               // 背景色
               style.setFillForegroundColor(IndexedColors.BLUE.index);
               style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
               style.setFillBackgroundColor(IndexedColors.BLUE.index);
           } else if (i > 10) {
               style.setFillForegroundColor(IndexedColors.BLACK.index);
               style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
               style.setFillBackgroundColor(IndexedColors.BLACK.index);
           } else if (i > 7) {
               style.setFillForegroundColor(IndexedColors.BLUE.index);
               style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
               style.setFillBackgroundColor(IndexedColors.BLUE.index);
           } else if (i >4) {
               style.setFillForegroundColor(IndexedColors.RED.index);
               style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
               style.setFillBackgroundColor(IndexedColors.RED.index);
           } else {
               style.setFillForegroundColor(IndexedColors.GREEN.index);
               style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
               style.setFillBackgroundColor(IndexedColors.GREEN.index);
           }
           headCell.setCellStyle(style);
           i++;
       }
   }

/**
    * @param dataList 对象数据集合
    * @param titleMap 表头   信息
    */
   private static void createContentRow(List<?> dataList, Map<String, String> titleMap) {
       try {
           int i = 0;
           // 生成一个样式
           HSSFCellStyle style = workbook.createCellStyle();
           // 设置这些样式
           style.setAlignment(HorizontalAlignment.CENTER);//水平居中
           style.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中

// 设置边框
           style.setBorderBottom(BorderStyle.THIN);
           style.setBorderLeft(BorderStyle.THIN);
           style.setBorderRight(BorderStyle.THIN);
           style.setBorderTop(BorderStyle.THIN);
           // 自动换行
           style.setWrapText(true);

// 生成一个字体
           HSSFFont font = workbook.createFont();
           font.setFontHeightInPoints((short) 10);
           font.setColor(IndexedColors.BLACK.index);
           font.setBold(false);
           font.setFontName("宋体");

// 把字体 应用到当前样式
           style.setFont(font);
           //style设置好后,为cell设置样式

for (Object obj : dataList) {
               HSSFRow textRow = sheet.createRow(CONTENT_START_POSITION + i);
               int j = 0;
               for (String entry : titleMap.keySet()) {
                   //属性名驼峰式
                   String method = "get" + entry.substring(0, 1).toUpperCase() + entry.substring(1);
//                    System.out.println("调用" + method + "方法");
                   //反射调用
                   Method m = obj.getClass().getMethod(method, null);
                   Object value = m.invoke(obj, null);
                   HSSFCell textcell = textRow.createCell(j);
                   if (ObjectUtils.isNotEmpty(value)) {
                       textcell.setCellValue(value.toString());
                   } else {
                       textcell.setCellValue("");
                   }
                   textcell.setCellStyle(style);
                   j++;
               }
               i++;
           }
       } catch (Exception e) {
           e.printStackTrace();
       }
   }

/**
    * 自动伸缩列(如非必要,请勿打开此方法,耗内存)
    *
    * @param size 列数
    */
   private static void autoSizeColumn(Integer size) {
       for (int j = 0; j < size; j++) {
           sheet.autoSizeColumn(j);
       }
   }

public static void excelExport( HttpServletResponse response, List<Perform> list, Map<String, String> titleMap, String sheetName) throws IOException {
       //生成表格的不可重复名
       Date date = new Date();

// 初始化workbook
       initHSSFWorkbook(sheetName);
       // 表头行
       createHeadRow(titleMap);
       // 文本行
       createContentRow(list, titleMap);

//输出Excel文件
       OutputStream output=response.getOutputStream();
       response.reset();
       //设置响应头,
       response.setHeader("Content-disposition", "attachment; filename=teacher.xls");
       response.setContentType("application/msexcel");
       workbook.write(output);
       output.close();
   }
}

来源:https://blog.csdn.net/niTaoTaoa/article/details/130100445

标签:Java,element,excel,导入,导出
0
投稿

猜你喜欢

  • Springboot配置security basic path无效解决方案

    2023-07-12 21:42:50
  • C#自定义日志记录

    2021-06-11 23:44:47
  • C# List实现行转列的通用方案

    2022-03-28 02:53:04
  • Java实现俄罗斯方块的源码分享

    2023-02-17 04:20:48
  • 详解MyBatis-Puls中saveBatch批量添加慢的问题

    2021-10-14 02:36:27
  • SpringDataElasticsearch与SpEL表达式实现ES动态索引

    2021-11-27 01:33:03
  • Android Activity通用悬浮可拖拽View封装的思路详解

    2023-08-08 15:31:48
  • 详解Elasticsearch如何实现简单的脚本排序

    2022-03-13 13:17:50
  • C#后端接收form-data,创建实体类教程

    2023-08-23 21:07:57
  • win10和win7下java开发环境配置教程

    2022-05-01 05:34:22
  • Java编程之内置观察者模式实例详解

    2021-07-02 20:43:27
  • MyBatis Plus 入门使用详细教程

    2023-08-23 05:48:33
  • 如何设置Spring Boot测试时的日志级别

    2023-11-10 14:11:20
  • 微信支付H5调用支付详解(java版)

    2023-03-10 14:21:44
  • Android convinientbanner顶部广告轮播控件使用详解

    2021-08-20 13:09:09
  • Android开发之自定义刮刮卡实现代码

    2023-07-30 14:52:57
  • java 用itext设置pdf纸张大小操作

    2022-10-09 15:00:43
  • Android中获取资源 id 及资源 id 的动态获取

    2023-06-30 04:38:06
  • android异步消息机制 源码层面彻底解析(1)

    2023-10-02 07:08:52
  • Android开发仿扫一扫实现拍摄框内的照片功能

    2023-03-17 14:11:12
  • asp之家 软件编程 m.aspxhome.com