mysql 数据表和excel的导入导出(springboot)

mysql 数据表和excel的导入导出(springboot)

1. 先说一下遇到的问题 :
服务上上传报 :Your file appears not to be a valid OLE2 document 错误
解决办法 :
1.先查看服务上是否有excle工作簿 (有的是因为没有)
2. 把文件另存为修改一下文件类型(最后结果试了一下不用修改也可以上传了)在这里插入图片描述

下面来贴出代码

第一步:先导入jar

 <!-- POI -->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>3.16</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml-schemas</artifactId>
        <version>3.16</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-excelant</artifactId>
        <version>3.16</version>
    </dependency>

第二步:前提准备

2.1 数据库字段

   CREATE TABLE `admin` (
      `id` INT(20) NOT NULL AUTO_INCREMENT,
      `userName` VARCHAR(50) DEFAULT NULL,
      `password` VARCHAR(50) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=INNODB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8

2.2 实体类相对应即可
2.3 mapeer

public interface AdminMapper {

    List<Admin> selAll();
    int insertAdmin(Admin admin);
}

mapper映射

 <--插入-->
 <insert id="insertAdmin" parameterType="java.util.List">
		INSERT INTO `admin` (userName,password) VALUE(#{userName},#{password})
 </insert>
   <--查询-->
<select id="selAll" resultType="cn.mmn.manager.pojo.Admin">
    SELECT id, userName, password
    FROM `admin`
</select>

2.4 service此处省略

第三步 :controller 【核心代码】

package cn.mmn.manager.controller.export;

import cn.mmn.manager.pojo.Admin;
import cn.mmn.manager.service.AdminService;

import org.apache.commons.io.FileUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.DecimalFormat;
import java.util.List;

@Controller
public class ExcelController {


@Resource
AdminService adminService ;


/**
 * 访问
 * @return
 */
  @RequestMapping("/a")
    public String show(){
        return "aaa";
    }
/**
 * excel信息 导入到数据库
 * @param file
 * @param request
 * @param model
 * @return
 */
@RequestMapping(value="/importexcel",method= RequestMethod.POST)
public String uploadExcel(@RequestParam("file") MultipartFile file, HttpServletRequest request, Model model) {
    //获取服务器端路径
//  String path = "服务路经此处";
//本地路径
    String path = "D:\\excel";
    //获取到上传文件名称
    String fileName = file.getOriginalFilename();
    //创建目标File
    File targetFile = new File(path + "\\" + fileName);
    //创建存储目录
    File targetPath = new File(path);

    //判断服务器端目录是否存在,如果不存在创建目录
    if (!targetPath.exists()) {
        targetPath.mkdir();
    }
    //把上传的文件存储到服务器端
    try {
        file.transferTo(targetFile);
    } catch (IllegalStateException e) {

        e.printStackTrace();
    } catch (IOException e) {

        e.printStackTrace();
    }
    //读取上传到服务器端的文件,遍历excel
    try {
        Workbook workbook = WorkbookFactory.create(targetFile);
        Sheet sheet = workbook.getSheet("Sheet1");
        //判断行数
        int rownum = sheet.getPhysicalNumberOfRows();
        for (int i = 1; i < rownum; i++) {    // 此处从1 开始,可以把标签头省略
            Row row = sheet.getRow(i);
            //判断单元格数量
            int cellnum = row.getPhysicalNumberOfCells();
            StringBuffer buf = new StringBuffer();
            for (int j = 0; j < cellnum; j++) {
                Cell cell = row.getCell(j);
                if (cell.getCellType() == HSSFCell.CELL_TYPE_STRING) {
                    buf.append(cell.getStringCellValue() + "~");
                } else if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {
                    //创建数字格式化工具类
                    DecimalFormat df = new DecimalFormat("####");
                    //把从cell单元格读取到的数字,进行格式化防止科学计数法形式显示
                    buf.append(df.format(cell.getNumericCellValue()) + "~");
                }
            }
            //单元格循环完成后读取到的是一行内容  1   aa  bb
            String hang = buf.toString();
            String[] rows = hang.split("~");
            Admin admin = new Admin();
            admin.setUserName(rows[1]);
            admin.setPassword(rows[2]);
          //  admin.setId(Integer.valueOf(rows[2]));    // int类型时转换
            System.out.println("上传管理员信息:" + admin);
          adminService.insertAdmin(admin);
        }
    } catch (InvalidFormatException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    return "success";

}

/**
 * 数据库信息 导出到excel
 * @param request
 * @param response
 * @param model
 * @return
 * @throws IOException
 */
@RequestMapping(value = "/downloadexcel")
public ResponseEntity<byte[]> down(HttpServletRequest request, HttpServletResponse response, Model model)
        throws IOException {
    // 从数据库读取数据
    List<Admin> allStu = adminService.selAll();
    // 获取服务路径
   // String path = “服务路径”;
   //本地路径
    String path = "D:\\excel\\upload";
    String filename = "bbb.xls";     // 也可修改为 xls
    // 存储File
    File tfile = new File(path + "\\" + filename);
    // 目录
    File mfile = new File(path);
    if (!tfile.exists()) {
        mfile.mkdir();
    }
    // 生成excel
    XSSFWorkbook workbook = new XSSFWorkbook();
    XSSFSheet sheet = workbook.createSheet("管理员信息表");
    int rownum = 0;
    XSSFRow row1 = sheet.createRow(rownum);
    row1.createCell(0).setCellValue("id");
    row1.createCell(1).setCellValue("姓名");
    row1.createCell(2).setCellValue("密码");
    rownum =1;   //这里再次赋值 是为了把标题头加上
    for (Admin admin : allStu) {
        XSSFRow row = sheet.createRow(rownum);
        row.createCell(0).setCellValue(admin.getId());
        row.createCell(1).setCellValue(admin.getUserName());
        row.createCell(2).setCellValue(admin.getPassword());
        rownum++;
    }
    // 保存workbook
    try {
        workbook.write(new FileOutputStream(tfile));
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    // 创建请求头对象
    HttpHeaders headers = new HttpHeaders();
    // 下载显示的文件名,解决中文名称乱码问题
    String downloadFileName = new String(filename.getBytes("UTF-8"), "iso-8859-1");
    // 通知浏览器以attachment(下载方式)打开
    headers.setContentDispositionFormData("attachment", downloadFileName);
    // application/octet-stream:二进制流数据(最常见的文件下载)
    headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
    ResponseEntity<byte[]> responseEntity = new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(tfile),
            headers, HttpStatus.CREATED);
    return responseEntity;
}

}

四 :页面

aaa.html页面 :

 <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
 
 
    <form action="/importexcel" method="post" enctype="multipart/form-data">
    
        <input type="file" name="file"/>
    
        <input type="submit" value="上传"/>
    </form>
    
    <!--<input type='button' value='导出' class='s_button' οnclick='doExportExcel()'/>&nbsp;-->
    
    <a href="/downloadexcel">导出Excel</a>
    </body>
    </html>

success.html页面

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
</head>
<body>
<div  style="text-align:center">
    上传文件成功!</div>
</body>

完结 !!!
第一次做这个导入导出,中间也参考了很多文档

参考文档 :https://blog.csdn.net/weixin_42548384/article/details/83507612

关注公众号、每天更多内容分享哦

在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring Boot 是一个用于创建基于 Spring 框架的独立、生产级别的应用程序的框架。EasyExcel 是一个基于 Java 的开源框架,可以方便地读写 Excel 文件。使用 EasyExcel 可以轻松地进行 Excel 文件的导入导出,非常适合在 Spring Boot 项目中使用。 下面是在 Spring Boot 项目中使用 EasyExcel 进行 Excel 文件导入导出的基本步骤: 1. 添加 EasyExcel 依赖 在项目的 pom.xml 文件中添加 EasyExcel 依赖: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.10</version> </dependency> ``` 2. 编写 Excel 导出代码 使用 EasyExcel 可以非常方便地进行 Excel 文件的导出。例如,以下代码可以将一个 List 对象导出Excel 文件: ```java // 定义 Excel 表头 List<List<String>> head = new ArrayList<>(); head.add(Arrays.asList("姓名", "年龄")); // 定义 Excel 数据 List<List<Object>> data = new ArrayList<>(); data.add(Arrays.asList("张三", 18)); data.add(Arrays.asList("李四", 20)); data.add(Arrays.asList("王五", 22)); // 导出 Excel 文件 String fileName = "example.xlsx"; String sheetName = "Sheet1"; EasyExcel.write(fileName).sheet(sheetName).head(head).sheet().doWrite(data); ``` 3. 编写 Excel 导入代码 使用 EasyExcel 进行 Excel 文件的导入也非常方便。例如,以下代码可以从 Excel 文件中读取数据并转换为一个 List 对象: ```java // 定义读取 Excel 文件的监听器 public class ExcelListener extends AnalysisEventListener<Object> { private List<Object> data = new ArrayList<>(); @Override public void invoke(Object object, AnalysisContext context) { data.add(object); } @Override public void doAfterAllAnalysed(AnalysisContext context) {} public List<Object> getData() { return data; } } // 读取 Excel 文件 String fileName = "example.xlsx"; ExcelListener listener = new ExcelListener(); EasyExcel.read(fileName, listener).sheet().doRead(); List<Object> data = listener.getData(); ``` 4. 将 Excel 文件导入到数据库 读取 Excel 文件之后,可以将数据存入数据库中。以下代码演示了将读取的 Excel 文件中的数据存入 MySQL 数据库的过程: ```java // 定义实体类 @Data public class Person { private String name; private Integer age; } // 保存数据到数据库 List<Person> persons = new ArrayList<>(); for (Object obj : data) { List<Object> row = (List<Object>) obj; Person person = new Person(); person.setName((String) row.get(0)); person.setAge((Integer) row.get(1)); persons.add(person); } personRepository.saveAll(persons); ``` 以上就是使用 EasyExcel 进行 Excel 文件导入导出的基本步骤。根据实际需求,可以对以上代码进行相应的修改和扩展。 ### 回答2: Spring Boot 是一个开源的Java开发框架,可以帮助开发人员快速构建基于Spring的应用程序。EasyExcel 是一种基于Java的Excel读写工具,它提供了简单便捷的API,可以方便地实现Excel导入导出功能。 在Spring Boot中使用EasyExcel进行导入导出操作非常简单。首先,我们需要在pom.xml文件中添加EasyExcel的依赖项,以便可以使用它的功能。然后,我们可以创建一个Controller类来处理导入导出的请求。 对于导入操作,我们可以使用EasyExcel提供的@ExcelProperty注解来标记实体类的字段与Excel的列的映射关系。然后,我们可以使用EasyExcel的read方法来读取Excel文件,并将数据转换为实体类对象。最后,我们可以对读取到的数据进行相应的业务操作,比如存储到数据库中。 对于导出操作,我们可以使用EasyExcel的@ExcelProperty注解标记实体类的字段,并使用EasyExcel的write方法来将实体类列表写入Excel文件。我们可以通过指定文件路径或输出流的方式进行导出。 除了基本的导入导出功能,EasyExcel还提供了一些高级特性,比如读取大文件、多sheet处理、自定义读写处理器等。这些特性可以帮助我们更好地应对复杂的Excel导入导出需求。 总而言之,Spring Boot结合EasyExcel提供了一种简单快捷的方式来实现Excel导入导出功能。无论是处理简单的Excel文件还是应对复杂的导入导出需求,Spring Boot和EasyExcel都能够提供强大的支持。 ### 回答3: Spring Boot 是一种简化了开发过程的Java框架,而EasyExcel是一种用于操作Excel文件的开源库。通过结合使用Spring Boot和EasyExcel,我们可以方便地实现Excel文件的导入导出功能。下面将详细介绍如何使用Spring Boot和EasyExcel来实现导入导出功能。 首先,我们需要在Spring Boot的项目中引入EasyExcel的依赖。在pom.xml文件中添加以下依赖: ``` <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.6</version> </dependency> ``` 接着,我们可以创建一个Controller类来处理导入导出的请求。在该类中,我们可以定义两个方法,一个用于导入Excel文件,另一个用于导出Excel文件。 对于导入功能,我们可以使用EasyExcel提供的`read()`方法来读取Excel文件,并将读取到的数据转换为一个List对象。以下是一个简单的导入方法的示例代码: ```java @PostMapping("/import") public void importExcel(@RequestParam("file") MultipartFile file) throws IOException { List<DataDTO> dataList = EasyExcel.read(file.getInputStream()).head(DataDTO.class).sheet().doReadSync(); // 处理导入的数据 } ``` 对于导出功能,我们可以使用EasyExcel提供的`write()`方法来创建一个Excel文件,并将数据写入到该文件中。以下是一个简单的导出方法的示例代码: ```java @GetMapping("/export") public void exportExcel(HttpServletResponse response) throws IOException { List<DataDTO> dataList = getDataList(); // 获取导出的数据 response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("data.xlsx", "utf-8")); EasyExcel.write(response.getOutputStream()).sheet("Data").doWrite(dataList); } ``` 在上述代码中,我们首先获取需要导出的数据(getDataList()方法需要根据实际情况实现),然后设置响应头信息,最后使用`write()`方法将数据写入到响应的输出流中。 通过以上步骤,我们在Spring Boot项目中成功实现了使用EasyExcel进行Excel文件的导入导出功能。我们可以根据具体需求对导入的数据进行处理,也可以根据实际情况设置导出文件的格式和名称。同时,EasyExcel还提供了更多的功能和选项,如设置表头、导入数据校验等,可以根据具体需求进行使用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值