在java中对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);
}
添加依赖
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";
}
读取的常用方法
//创建一个临时文件,用来接收前端传进来的文件
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")));