(拿去CV就能用!)EasyExcel读写Excel详细流程(图解+代码)
·
导入EasyExcel依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.6</version>
</dependency>
读操作
public class Test {
public static void main(String[] args) {
//读取文件
//创建ExcelReaderBuilder实例
ExcelReaderBuilder readerBuilder = EasyExcel.read();
//获取文件对象
readerBuilder.file("D:\\java\\用户数据表.xls");
//指定sheet
readerBuilder.sheet("用户数据表");
//自动关闭输入流
readerBuilder.autoCloseStream(true);
//设置Excel文件格式
readerBuilder.excelType(ExcelTypeEnum.XLS);
//注册监听器进行数据的解析
readerBuilder.registerReadListener(new AnalysisEventListener<Map<Integer,String>>() {
@Override
public void invoke(Map<Integer, String> integerStringMap, AnalysisContext analysisContext) {
Set<Integer> keySet = integerStringMap.keySet();
Iterator<Integer> iterator = keySet.iterator();
while (iterator.hasNext()) {
Integer key = iterator.next();
System.out.print(key + ":" + integerStringMap.get(key)+", ");
}
System.out.println("");
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
//通知文件读取完毕
System.out.println("数据读取完毕");
}
});
//构建读取器
ExcelReader reader = readerBuilder.build();
//读取数据
reader.readAll();
//读取完毕
reader.finish();
}
}
上述代码可以优化简洁点
public class ExcelTest {
public static void main(String[] args) {
List<Map<Integer,String>> list = new LinkedList<>();
EasyExcel.read("D:\\java\\用户数据表.xls")
.sheet()
.registerReadListener(new AnalysisEventListener<Map<Integer,String>>() {
@Override
public void invoke(Map<Integer, String> integerStringMap, AnalysisContext analysisContext) {
list.add(integerStringMap);
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
System.out.println("数据读取完毕");
}
}).doRead();
for (Map<Integer, String> integerStringMap : list) {
Set<Integer> keySet = integerStringMap.keySet();
Iterator<Integer> iterator = keySet.iterator();
while (iterator.hasNext()) {
Integer key = iterator.next();
System.out.print(key + ":" + integerStringMap.get(key)+", ");
}
System.out.println("");
}
}
}
重点:映射成指定对象,需要创建实体类,使用 @ExcelProperty 注解完成实体类成员变量和 Excel 字段的映射。
实体类对象
@TableName("card_info")
@Data
@AllArgsConstructor
@NoArgsConstructor
@HeadStyle(horizontalAlignment = HorizontalAlignment.CENTER,verticalAlignment = VerticalAlignment.CENTER, shrinkToFit = true)//标题样式,垂直水平居中
@HeadFontStyle(fontName = "微软雅黑",fontHeightInPoints = 11,bold = false)//表头字体样式
@HeadRowHeight(value = 35)//表头行高
@ContentFontStyle(fontName = "微软雅黑",fontHeightInPoints = 11)//内容字体样式
@ContentRowHeight(value = 30)//内容行高
@ContentStyle(horizontalAlignment = HorizontalAlignment.CENTER,verticalAlignment = VerticalAlignment.CENTER, wrapped = true)//内容样式,垂直水平居中
public class CardInfo implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
@ExcelIgnore
private Long id;
/**
* 卡片id
*/
@ExcelProperty("cardId")
private String cardId;
/**
* 真实姓名
*/
@ExcelProperty("name")
private String name;
/**
* 年龄
*/
@ExcelProperty("age")
private Integer age;
/**
* 职业
*/
@ExcelProperty("occupation")
private String occupation;
/**
* 电话号码
*/
@ExcelProperty("phone")
private String phone;
/**
* 地址
*/
@ExcelProperty("address")
private String address;
/**
* 邮箱
*/
@ExcelProperty("email")
private String email;
/**
* 公司
*/
@ExcelProperty("company")
private String company;
/**
* 0:未删除1:逻辑删除2:真正删除
*/
@ExcelIgnore
private Integer delFlag;
/**
* 用户id(不是必要)
*/
@ExcelProperty("userId")
private String userId;
/**
* 名片曝光率
*/
/**不显示字段注解*/
@ExcelIgnore
private Long exposureValue;
/**
* 标签集合
*/
@TableField(value="tag_list",typeHandler = FastjsonTypeHandler.class)
@ExcelProperty("tagList")
private String tagList;
/**
* 名片用户的简介
*/
@ExcelProperty("personalProfile")
private String personalProfile;
}
@HeadStyle / @ContentStyle 设置标题 / 内容样式
@HeadFontStyle 定制标题字体格式
@ContentRowHeight 设置行高
@ColumnWith 设置列宽 , 作用于成员属性
@ExcelIgnore 不将该字段转换成Excel
@ExcelProperty("xxx")指定列名的映射
解析 Excel 文件的时候直接指定实体类即可。
public class ExcelTest {
public static void main(String[] args) {
List<ExcelData> list = new LinkedList<>();
EasyExcel.read("D:\\java\\用户数据表.xls")
.head(ExcelData.class)
.sheet()
.registerReadListener(new AnalysisEventListener<ExcelData>() {
@Override
public void invoke(ExcelData excelData, AnalysisContext analysisContext) {
list.add(excelData);
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
System.out.println("数据读取完毕");
}
}).doRead();
for (ExcelData excelData : list) {
System.out.println(excelData);
}
}
}
结果:
写操作
public class ExcelTest {
public static void main(String[] args) {
List<ExcelData> list = parseData();
//list写入Excel文件
EasyExcel.write("D:\\java\\用户数据表_副本.xls")
.head(ExcelData.class)
.excelType(ExcelTypeEnum.XLS)
.sheet("用户数据表")
.doWrite(list);
}
public static List<ExcelData> parseData(){
List<ExcelData> list = new LinkedList<>();
// 写的数据都封装进list中
return list;
}
}
其实这些都是可以直接CV的,在映射封装类上以及输入输出位置上自定义就好
工具类,直接CV吧
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.support.ExcelTypeEnum;
import org.apache.poi.ss.formula.functions.T;
import java.util.LinkedList;
import java.util.List;
/**
* @author wzx
*/
public class ExcelUtil {
/**
* 封装Excel中的数据到指定的实体类中
* @param typeClass 指定的实体类的字节码类别
* @param readPath Excel的文件路径
* @return 指定的实体类对象的集合(每个对象代表每一条数据)
*/
public static List<T> getDataFromExcel(Class<T> typeClass , String readPath){
List<T> list = new LinkedList<>();
EasyExcel.read(readPath)
.head(typeClass)
.sheet()
.registerReadListener(new AnalysisEventListener<T>() {
@Override
public void invoke(T excelData, AnalysisContext analysisContext) {
list.add(excelData);
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
System.out.println("数据读取完毕");
}
}).doRead();
return list;
}
/**
* 将封装好的数据写入Excel中
* @param list 写入的数据集合
* @param writePath 写入的Excel文件的路径
* @param sheet excel表中生成的sheet表名
* @param excelType 插入的excel的类别,有xls、xlsx两种
*/
public static <T> void saveDataToExcel(List<T> list, String writePath, String sheet, ExcelTypeEnum excelType, Class<T> clazz) {
// 写入Excel文件
EasyExcel.write(writePath)
.head(clazz)
.excelType(excelType)
.sheet(sheet)
.doWrite(list);
}
}
更多推荐
已为社区贡献2条内容
所有评论(0)