Java的excel文件操作

在java中对excel进行操作的方式有很多种,今天整理了两种比较简单的

1. 使用springboot集成的easyPoi进行excel操作

添加依赖,版本的话可以自行选择


    cn.afterturn
    easypoi-spring-boot-starter
    4.4.0

使用这种方式比较简洁,必须要创建实体类使用注解与excel表建立映射关系

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {

@Excel(name = "id")
    private String id;
@Excel(name = "姓名")
    private String name;
@Excel(name = "密码")
    private String pwd;
}

然后可以对文件进行读取,可以通过设置ImportParams来进行设置导入读取文件的一些参数

@PostMapping("/upload")
@ResponseBody
public String upload1(MultipartFile file,HttpServletResponse response) throws Exception {
    //设置导入参数,主要是对关键数据的一些定位,如果没有特殊的样式,使用默认参数就可以
    ImportParams importParams = new ImportParams();
    //读取的sheet的数量,读取的数量不能大于总数量,如果不设置,默认为1
    importParams.setSheetNum(1);
    //从哪个sheet开始读取,开始读取的位置和读取数量不能超过总数量,默认为0,从第一个文件开始读取
    importParams.setStartSheetIndex(0);
    List objects = ExcelImportUtil.importExcel(file.getInputStream(), User.class, importParams);
}

文件写出,保存到本地

@PostMapping("/upload1")
@ResponseBody
public String upload1(HttpServletResponse response) throws IOException {
    //准备要导出表中的数据
    List list = new ArrayList<>();
    for (int i = 0; i < 100; i++) {
        list.add(new User(String.valueOf(i),"name"+i,"pwd"+i));
    }
    //设置导出数据的参数,表格的一些常规信息,颜色,宽高,顺序
    ExportParams params = new ExportParams();
    //设置工作簿名称
    params.setSheetName("部门信息");

    //导出,此语句执行过后,会清空list内的数据
    Workbook sheets = ExcelExportUtil.exportExcel(params, User.class, list);
    
    //创建输出流
    File file = new File("D:/test/测试表.xlsx");
    OutputStream out = new FileOutputStream(file);
    //保存到本地
    sheets.write(out);

    return "success";
}

文件写出到响应信息,注意写入到请求头种的信息,文件名如果有中文,如果不使用URLEncoder.encode进行编码,前端接收的时候会编程乱码

@PostMapping("/upload")
@ResponseBody
public void upload2(HttpServletResponse response) throws IOException {
    //准备要导出表中的数据
    List list = new ArrayList<>();
    for (int i = 0; i < 100; i++) {
        list.add(new User(String.valueOf(i),"name"+i,"pwd"+i));
    }
    //设置导出数据的参数,表格的一些常规信息,颜色,宽高,顺序
    ExportParams params = new ExportParams();
    //设置工作簿名称
    params.setSheetName("部门信息");

    //导出
    Workbook sheets = ExcelExportUtil.exportExcel(params, User.class, list);

    File tempFile = File.createTempFile("123123123123", ".xslx");
    //创建输出流
    ServletOutputStream out = response.getOutputStream();

    //设置表名称
    String pathName = "测试下载表";
    //设置响应数据为
    response.setContentType("application/vnd.ms-excel");
    //也可以使用如下配置
//response.setContentType("application/x-download");

    response.setCharacterEncoding("UTF8");
    response.setHeader("Content-disposition","filename="+URLEncoder.encode(pathName,"UTF8")+".xls");

    //保存到本地
    sheets.write(out);
}

2. 使用阿里巴巴的插件easyExcel

添加依赖


    com.alibaba
    easyexcel
    3.2.1

创建实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    @ExcelProperty(value = "id")
    private String id;
    @ExcelProperty(value = "姓名")
    private String name;
    @ExcelProperty(value = "密码")
    private String pwd;
}

创建一个监听器

package com.example.demo.controller;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.example.demo.User;

import java.util.Map;

public class ExcelListen extends AnalysisEventListener {
    // 一行一行读取 excel 内容
    @Override
    public void invoke(User user, AnalysisContext analysisContext) {
        System.out.println("***"+user+"***");
    }

    // 读取表头内容
    @Override
    public void invokeHeadMap(Map headMap, AnalysisContext context) {
        System.out.println("表头:" + headMap);
    }
    // 读取完成之后
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {

    }
}

然后创建读取文件接口

@RequestMapping("/upload")
@ResponseBody
public String upload(MultipartFile file) throws IOException {
    //传入的可以是一个流,也可以是一个文件,也可以是文件的路径等
    EasyExcel.read(file.getInputStream(), User.class,new ExcelListen()).sheet().doRead();
    return "ok";
}

写出文件

@RequestMapping("/upload")
@ResponseBody
public String upload(HttpServletResponse response) throws IOException {
    List arrayList = new ArrayList<>();
    arrayList.add(new User("1","name","hello"));
    EasyExcel.write(response.getOutputStream(), User.class)
            .sheet()
            .doWrite(arrayList);
    return "ok";
}

3. POI中常用的操作方法

读取的常用方法

//创建一个临时文件,用来接收前端传进来的文件
File tempFile = File.createTempFile("aaaa",".xslx");
byte[] bytes = file.getBytes();
OutputStream outputStream = new FileOutputStream(tempFile);
outputStream.write(bytes);
outputStream.flush();
outputStream.close();

//使用此方法可以获得workbook,这三个之间的区别是
//HSSF支持97-2003版本后缀名为.xsl
//XSSF是从2007开始的后缀名为.xslx
//SXSSF是在XSSF的基础上从POI3.8版本开始的一种低内存占用的操作,后缀名为.xslx
Workbook workbook = new XSSFWorkbook(tempFile);
SXSSFWorkbook workbook1 = new SXSSFWorkbook();
HSSFWorkbook workbook2 = new HSSFWorkbook();

//获取sheet,可以通过名称获取,也可以通过序号获取
Sheet sheet = workbook.getSheet("sheet1");
Sheet sheet1 = workbook.getSheetAt(1);

//获取row,通过所在行获取,从零开始
Row row = sheet.getRow(0);

//过去单元格,通过所在列获取,从零开始
Cell cell = row.getCell(0);

//可以对单元格的颜色进行设置
CellStyle cellStyle = workbook.createCellStyle();
cellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
cell.setCellStyle(cellStyle);

//获取单元格内的内容,此处尽量进行类型判断,根据类型获取数据
String stringCellValue = cell.getStringCellValue();

//使用完成以后记得删除临时文件
tempFile.delete();

写入的常用方法

//新建一个表格
Workbook workbook = new SXSSFWorkbook();
//创建一个工作簿并命名
Sheet sheet = workbook.createSheet("飞行物信息");
//创建一个行
Row row = sheet.createRow(0);
//创建一个单元格
Cell cell = row.createCell(0);
//给单元格赋值
cell.setCellValue("类型");
//写出到文件
workbook.write(new FileOutputStream(new File("D:/test/2342342342343243.xslx")));

你可能感兴趣的:(excel)