SpringBoot集成poi实现对Excel文件的读写操作(1)

1.概述

其实没啥好概述的,文章标题挺好理解的,Excel文件嘛大家都见过。

2.快速入门

(1)导依赖

        DDDD,懂得都懂,Maven经典操作。但是这次比较特殊是因为这个Excel分为新旧两个版本,所以我们要导不同的依赖。

        <!--poi依赖-->
        <!--这个是新版本,xlsx结尾的-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.9</version>
        </dependency>
        <!--这个是老版本,xls结尾的-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.9</version>
        </dependency>

(3)实体类

        用来存放读出来的数据,其实不用这个实体类也行,问题不大。而且在本次的例子只用到了id和name属性。

import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="Traveller对象", description="")
public class Traveller implements Serializable {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.ID_WORKER)
    private int id;
    private String travellerName;
    private String element;
    private Integer isDeleted;
    private String gmtCreate;
    private String gmtModified;
}

(3)读写操作代码

import com.guguo.tripservice.entity.Traveller;
import com.guguo.tripservice.utils.result.R;

import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;

@RestController
public class PoiController {
     String path="D:\\idea_saved\\copy_used\\service\\service_trip\\";//创建的文件地址
     //对老版本的excel文件进行写操作
     @GetMapping("/write03")
     public R writeExcel_03() throws Exception{
        //创建一个工作簿
        HSSFWorkbook workbook = new HSSFWorkbook();
        //创建一个工作表
        HSSFSheet sheet = workbook.createSheet("用户情况表03");
        //锁定一个单元格
        Row row_1 = sheet.createRow(0);//先锁定第一行
        Cell cell_11 = row_1.createCell(0);//再锁定一列,就能锁定一个单元格
        cell_11.setCellValue("id");//在单元格里填东西
        row_1.createCell(1).setCellValue("姓名");

        //后面就是重复前面的操作
        Row row_2 = sheet.createRow(1);
        row_2.createCell(0).setCellValue(1);
        row_2.createCell(1).setCellValue("李玉腾");

        //使用文件输出流来写数据
        FileOutputStream fileOutputStream = new FileOutputStream(new File(path + "用户情况表03.xls"));
        workbook.write(fileOutputStream);
        //关闭流
        fileOutputStream.close();
        return R.ok();
     }

    //对新版本的excel文件进行写操作
    @GetMapping("/write07")
    public R writeExcel_07() throws Exception{
        //创建一个工作簿
        XSSFWorkbook workbook = new XSSFWorkbook();
        //创建一个工作表
        Sheet sheet = workbook.createSheet("用户情况表07");
        //锁定一个单元格
        Row row_1 = sheet.createRow(0);//先锁定第一行
        Cell cell_11 = row_1.createCell(0);//再锁定一列,就能锁定一个单元格
        cell_11.setCellValue("id");//在单元格里填东西
        row_1.createCell(1).setCellValue("姓名");

        //后面就是重复前面的操作
        Row row_2 = sheet.createRow(1);
        row_2.createCell(0).setCellValue(1);
        row_2.createCell(1).setCellValue("李玉腾");

        //使用文件输出流来写数据
        FileOutputStream fileOutputStream = new FileOutputStream(new File(path + "用户情况表07.xlsx"));
        workbook.write(fileOutputStream);
        //关闭流
        fileOutputStream.close();
        return R.ok();
    }

    //对老版本的excel文件进行读操作
    @GetMapping("/read03")
    public void readExcel_03() throws Exception{
        //要读取一个文件首先要获取文件对应的流,数据从磁盘流进java程序,所以使用输入流
        FileInputStream fileInputStream = new FileInputStream(new File(path + "用户情况表03.xls"));
        //创建一个工作簿
        Workbook workbook = new HSSFWorkbook(fileInputStream);
        //得到一个工作表
        Sheet sheet = workbook.getSheet("用户情况表03");
        //遍历这个表
        List<Traveller> travellers = new ArrayList<>();//把数据封装到旅行者对象中去
        //两层for循环来封装数据,注意这个得到的行列数都是从第0行开始
        for (int i = 1; i <= sheet.getLastRowNum() ; i++) {//第0行是标题,所以从第1行开始
            Row row = sheet.getRow(i);
            Traveller traveller = new Traveller();
            for (int j = 0; j < row.getLastCellNum() ; j++) {
                if (j == 0) {   //如果是第0列,说明这一列的数据是id属性
                    traveller.setId((int) row.getCell(j).getNumericCellValue());//注意数据类型转换
                }
                if (j == 1) {  //如果是第1列,说明这一列的数据是travelName属性
                    traveller.setTravellerName(row.getCell(j).getStringCellValue());
                }
            }
            travellers.add(traveller);//把第i行封装好的对象添加进来
        }
        //关闭流
        fileInputStream.close();
        System.out.println("旧版本excel读到的数据如下:"+travellers);
    }


    //对老版本的excel文件进行读操作
    @GetMapping("/read07")
    public void readExcel_07() throws Exception{
        //要读取一个文件首先要获取文件对应的流,数据从磁盘流进java程序,所以使用输入流
        FileInputStream fileInputStream = new FileInputStream(new File(path + "用户情况表07.xlsx"));
        //创建一个工作簿
        Workbook workbook = new XSSFWorkbook(fileInputStream);
        //得到一个工作表
        Sheet sheet = workbook.getSheet("用户情况表07");
        //遍历这个表
        ArrayList<Traveller> travellers = new ArrayList<>();//把数据封装到旅行者对象中去
        //两层for循环来封装数据,注意这个得到的行列数都是从第0行开始
        for (int i = 1; i <= sheet.getLastRowNum() ; i++) {//第0行是标题,所以从第1行开始
            Row row = sheet.getRow(i);
            Traveller traveller = new Traveller();
            for (int j = 0; j < row.getLastCellNum() ; j++) {
                if (j == 0) {   //如果是第0列,说明这一列的数据是id属性
                    traveller.setId((int) row.getCell(j).getNumericCellValue());//注意数据类型转换
                }
                if (j == 1) {  //如果是第1列,说明这一列的数据是travelName属性
                    traveller.setTravellerName(row.getCell(j).getStringCellValue());
                }
            }
            travellers.add(traveller);//把第i行封装好的对象添加进来
        }
        //关闭流
        fileInputStream.close();
        System.out.println("新版本excel读到的数据如下:"+travellers);
    }


}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现Excel导入导出,需要用到POI库。下面介绍一下使用SpringBoot集成MyBatis和POI实现Excel导入导出的步骤。 1. 引入依赖 在pom.xml文件中添加以下依赖: ``` <!-- SpringBoot MyBatis 依赖 --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.4</version> </dependency> <!-- POI 依赖 --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.0.1</version> </dependency> ``` 2. 创建实体类 创建一个实体类,用于映射Excel文件中的数据。 ```java public class User { private Integer id; private String name; private String email; private String phone; // 省略 getter 和 setter 方法 } ``` 3. 创建Mapper 创建一个Mapper,用于操作数据库。 ```java @Mapper public interface UserMapper { List<User> findAll(); void insert(User user); void batchInsert(List<User> userList); } ``` 4. 创建Service 创建一个Service,用于导入和导出Excel文件。 ```java @Service public class UserService { @Autowired private UserMapper userMapper; public List<User> findAll() { return userMapper.findAll(); } public void insert(User user) { userMapper.insert(user); } public void batchInsert(MultipartFile file) throws IOException { List<User> userList = readExcel(file); userMapper.batchInsert(userList); } public void exportExcel(HttpServletResponse response) throws IOException { List<User> userList = userMapper.findAll(); writeExcel(response, userList); } private List<User> readExcel(MultipartFile file) throws IOException { List<User> userList = new ArrayList<>(); Workbook workbook = WorkbookFactory.create(file.getInputStream()); Sheet sheet = workbook.getSheetAt(0); for (int i = sheet.getFirstRowNum() + 1; i <= sheet.getLastRowNum(); i++) { Row row = sheet.getRow(i); User user = new User(); user.setName(row.getCell(0).getStringCellValue()); user.setEmail(row.getCell(1).getStringCellValue()); user.setPhone(row.getCell(2).getStringCellValue()); userList.add(user); } return userList; } private void writeExcel(HttpServletResponse response, List<User> userList) throws IOException { Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet("Users"); Row headerRow = sheet.createRow(0); headerRow.createCell(0).setCellValue("Name"); headerRow.createCell(1).setCellValue("Email"); headerRow.createCell(2).setCellValue("Phone"); for (int i = 0; i < userList.size(); i++) { Row row = sheet.createRow(i + 1); User user = userList.get(i); row.createCell(0).setCellValue(user.getName()); row.createCell(1).setCellValue(user.getEmail()); row.createCell(2).setCellValue(user.getPhone()); } response.setHeader("Content-Disposition", "attachment; filename=users.xlsx"); response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); workbook.write(response.getOutputStream()); } } ``` 5. 创建Controller 创建一个Controller,用于接收导入和导出Excel文件的请求。 ```java @RestController public class UserController { @Autowired private UserService userService; @GetMapping("/users") public List<User> findAll() { return userService.findAll(); } @PostMapping("/users") public void insert(@RequestBody User user) { userService.insert(user); } @PostMapping("/users/import") public void batchInsert(@RequestParam("file") MultipartFile file) throws IOException { userService.batchInsert(file); } @GetMapping("/users/export") public void exportExcel(HttpServletResponse response) throws IOException { userService.exportExcel(response); } } ``` 至此,就完成了SpringBoot集成MyBatis和POI实现Excel导入导出的步骤。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值