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);
}
}