easyexcel使用和遇到的问题点

 2023-09-07 阅读 40 评论 0

摘要:引入依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>1.1.2-beat1</version></dependency> 读取excel文件 小于1000行数据 默认读取 读取Sheet1的全部数据 String filePath 

引入依赖

 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>1.1.2-beat1</version></dependency>

读取excel文件

小于1000行数据

默认读取

读取Sheet1的全部数据

String filePath = "D:\\导入模板11条.xlsx";
List<Object> objects = ExcelUtil.readLessThan1000Row(filePath);

指定读取 

获取Sheet1表头以下的信息

String filePath = "D:\\导入模板11条.xlsx";
//第一个1代表sheet1, 第二个1代表从第几行开始读取数据,行号最小值为0
Sheet sheet = new Sheet(1, 1);
List<Object> objects = ExcelUtil.readLessThan1000Row(filePath,sheet);

easyExcel如何使用。获取Sheet2的所有信息

 String filePath = "D:\\导入模板11条.xlsx";Sheet sheet = new Sheet(2, 0);List<Object> objects = ExcelUtil.readLessThan1000Row(filePath,sheet);

 大于1000行数据

默认读取

String filePath = "D:\\导入模板11条.xlsx";
List<Object> objects = ExcelUtil.readMoreThan1000Row(filePath);

指定读取

String filePath = "D:\\导入模板11条.xlsx";
Sheet sheet = new Sheet(1, 2);
List<Object> objects = ExcelUtil.readMoreThan1000Row(filePath,sheet);

导出excle

单个Sheet导出

无模型映射导出

String filePath = "/home/Downloads/测试.xlsx";
List<List<Object>> data = new ArrayList<>();
data.add(Arrays.asList("111","222","333"));
data.add(Arrays.asList("111","222","333"));
data.add(Arrays.asList("111","222","333"));
List<String> head = Arrays.asList("表头1", "表头2", "表头3");
ExcelUtil.writeBySimple(filePath,data,head);

 模型映射导出

1、定义好模型对象

package com.springboot.utils.excel.test;import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.metadata.BaseRowModel;
import lombok.Data;
import lombok.EqualsAndHashCode;@EqualsAndHashCode(callSuper = true)
@Data
public class TableHeaderExcelProperty extends BaseRowModel {/*** value: 表头名称* index: 列的号, 0表示第一列*/@ExcelProperty(value = "姓名", index = 0)private String name;@ExcelProperty(value = "年龄",index = 1)private int age;@ExcelProperty(value = "学校",index = 2)private String school;
}

2、调用方法

String filePath = "/home/Downloads/测试.xlsx";
ArrayList<TableHeaderExcelProperty> data = new ArrayList<>();for(int i = 0; i < 4; i++){TableHeaderExcelProperty tableHeaderExcelProperty = new TableHeaderExcelProperty();tableHeaderExcelProperty.setName("cmj" + i);tableHeaderExcelProperty.setAge(22 + i);tableHeaderExcelProperty.setSchool("清华大学" + i);data.add(tableHeaderExcelProperty);}ExcelUtil.writeWithTemplate(filePath,data);

多个Sheet导出 

表格数据有效性不能使用,1、定义好模型对象

package com.springboot.utils.excel.test;import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.metadata.BaseRowModel;
import lombok.Data;
import lombok.EqualsAndHashCode;@EqualsAndHashCode(callSuper = true)
@Data
public class TableHeaderExcelProperty extends BaseRowModel {/*** value: 表头名称* index: 列的号, 0表示第一列*/@ExcelProperty(value = "姓名", index = 0)private String name;@ExcelProperty(value = "年龄",index = 1)private int age;@ExcelProperty(value = "学校",index = 2)private String school;
}

2、调用方法

 ArrayList<ExcelUtil.MultipleSheelPropety> list1 = new ArrayList<>();for(int j = 1; j < 4; j++){ArrayList<TableHeaderExcelProperty> list = new ArrayList<>();for(int i = 0; i < 4; i++){TableHeaderExcelProperty tableHeaderExcelProperty = new TableHeaderExcelProperty();tableHeaderExcelProperty.setName("cmj" + i);tableHeaderExcelProperty.setAge(22 + i);tableHeaderExcelProperty.setSchool("清华大学" + i);list.add(tableHeaderExcelProperty);}Sheet sheet = new Sheet(j, 0);sheet.setSheetName("sheet" + j);ExcelUtil.MultipleSheelPropety multipleSheelPropety = new ExcelUtil.MultipleSheelPropety();multipleSheelPropety.setData(list);multipleSheelPropety.setSheet(sheet);list1.add(multipleSheelPropety);}ExcelUtil.writeWithMultipleSheel("/home/chenmingjian/Downloads/aaa.xlsx",list1);

 工具类

1、excel工具类

package com.springboot.utils.excel;import com.alibaba.excel.EasyExcelFactory;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.metadata.BaseRowModel;
import com.alibaba.excel.metadata.Sheet;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;@Slf4j
public class ExcelUtil {private static Sheet initSheet;static {initSheet = new Sheet(1, 0);initSheet.setSheetName("sheet");//设置自适应宽度initSheet.setAutoWidth(Boolean.TRUE);}/*** 读取少于1000行数据* @param filePath 文件绝对路径* @return*/public static List<Object> readLessThan1000Row(String filePath){return readLessThan1000RowBySheet(filePath,null);}/*** 读小于1000行数据, 带样式* filePath 文件绝对路径* initSheet :*      sheetNo: sheet页码,默认为1*      headLineMun: 从第几行开始读取数据,默认为0, 表示从第一行开始读取*      clazz: 返回数据List<Object> 中Object的类名*/public static List<Object> readLessThan1000RowBySheet(String filePath, Sheet sheet){if(!StringUtils.hasText(filePath)){return null;}sheet = sheet != null ? sheet : initSheet;InputStream fileStream = null;try {fileStream = new FileInputStream(filePath);return EasyExcelFactory.read(fileStream, sheet);} catch (FileNotFoundException e) {log.info("找不到文件或文件路径错误, 文件:{}", filePath);}finally {try {if(fileStream != null){fileStream.close();}} catch (IOException e) {log.info("excel文件读取失败, 失败原因:{}", e);}}return null;}/*** 读大于1000行数据* @param filePath 文件觉得路径* @return*/public static List<Object> readMoreThan1000Row(String filePath){return readMoreThan1000RowBySheet(filePath,null);}/*** 读大于1000行数据, 带样式* @param filePath 文件觉得路径* @return*/public static List<Object> readMoreThan1000RowBySheet(String filePath, Sheet sheet){if(!StringUtils.hasText(filePath)){return null;}sheet = sheet != null ? sheet : initSheet;InputStream fileStream = null;try {fileStream = new FileInputStream(filePath);ExcelListener excelListener = new ExcelListener();EasyExcelFactory.readBySax(fileStream, sheet, excelListener);return excelListener.getDatas();} catch (FileNotFoundException e) {log.error("找不到文件或文件路径错误, 文件:{}", filePath);}finally {try {if(fileStream != null){fileStream.close();}} catch (IOException e) {log.error("excel文件读取失败, 失败原因:{}", e);}}return null;}/*** 生成excle* @param filePath  绝对路径, 如:/home/chenmingjian/Downloads/aaa.xlsx* @param data 数据源* @param head 表头*/public static void writeBySimple(String filePath, List<List<Object>> data, List<String> head){writeSimpleBySheet(filePath,data,head,null);}/*** 生成excle* @param filePath 绝对路径, 如:/home/chenmingjian/Downloads/aaa.xlsx* @param data 数据源* @param sheet excle页面样式* @param head 表头*/public static void writeSimpleBySheet(String filePath, List<List<Object>> data, List<String> head, Sheet sheet){sheet = (sheet != null) ? sheet : initSheet;if(head != null){List<List<String>> list = new ArrayList<>();head.forEach(h -> list.add(Collections.singletonList(h)));sheet.setHead(list);}OutputStream outputStream = null;ExcelWriter writer = null;try {outputStream = new FileOutputStream(filePath);writer = EasyExcelFactory.getWriter(outputStream);writer.write1(data,sheet);} catch (FileNotFoundException e) {log.error("找不到文件或文件路径错误, 文件:{}", filePath);}finally {try {if(writer != null){writer.finish();}if(outputStream != null){outputStream.close();}} catch (IOException e) {log.error("excel文件导出失败, 失败原因:{}", e);}}}/*** 生成excle* @param filePath 绝对路径, 如:/home/chenmingjian/Downloads/aaa.xlsx* @param data 数据源*/public static void writeWithTemplate(String filePath, List<? extends BaseRowModel> data){writeWithTemplateAndSheet(filePath,data,null);}/*** 生成excle* @param filePath 绝对路径, 如:/home/chenmingjian/Downloads/aaa.xlsx* @param data 数据源* @param sheet excle页面样式*/public static void writeWithTemplateAndSheet(String filePath, List<? extends BaseRowModel> data, Sheet sheet){if(CollectionUtils.isEmpty(data)){return;}sheet = (sheet != null) ? sheet : initSheet;sheet.setClazz(data.get(0).getClass());OutputStream outputStream = null;ExcelWriter writer = null;try {outputStream = new FileOutputStream(filePath);writer = EasyExcelFactory.getWriter(outputStream);writer.write(data,sheet);} catch (FileNotFoundException e) {log.error("找不到文件或文件路径错误, 文件:{}", filePath);}finally {try {if(writer != null){writer.finish();}if(outputStream != null){outputStream.close();}} catch (IOException e) {log.error("excel文件导出失败, 失败原因:{}", e);}}}/*** 生成多Sheet的excle* @param filePath 绝对路径, 如:/home/chenmingjian/Downloads/aaa.xlsx* @param multipleSheelPropetys*/public static void writeWithMultipleSheel(String filePath,List<MultipleSheelPropety> multipleSheelPropetys){if(CollectionUtils.isEmpty(multipleSheelPropetys)){return;}OutputStream outputStream = null;ExcelWriter writer = null;try {outputStream = new FileOutputStream(filePath);writer = EasyExcelFactory.getWriter(outputStream);for (MultipleSheelPropety multipleSheelPropety : multipleSheelPropetys) {Sheet sheet = multipleSheelPropety.getSheet() != null ? multipleSheelPropety.getSheet() : initSheet;if(!CollectionUtils.isEmpty(multipleSheelPropety.getData())){sheet.setClazz(multipleSheelPropety.getData().get(0).getClass());}writer.write(multipleSheelPropety.getData(), sheet);}} catch (FileNotFoundException e) {log.error("找不到文件或文件路径错误, 文件:{}", filePath);}finally {try {if(writer != null){writer.finish();}if(outputStream != null){outputStream.close();}} catch (IOException e) {log.error("excel文件导出失败, 失败原因:{}", e);}}}/*********************匿名内部类开始,可以提取出去******************************/@Datapublic static class MultipleSheelPropety{private List<? extends BaseRowModel> data;private Sheet sheet;}/*** 解析监听器,* 每解析一行会回调invoke()方法。* 整个excel解析结束会执行doAfterAllAnalysed()方法** @author: chenmingjian* @date: 19-4-3 14:11*/@Getter@Setterpublic static class ExcelListener extends AnalysisEventListener {private List<Object> datas = new ArrayList<>();/*** 逐行解析* object : 当前行的数据*/@Overridepublic void invoke(Object object, AnalysisContext context) {//当前行// context.getCurrentRowNum()if (object != null) {datas.add(object);}}/*** 解析完所有数据后会调用该方法*/@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {//解析结束销毁不用的资源}}/************************匿名内部类结束,可以提取出去***************************/}

2、日期格式类

package com.springboot.util;
import org.springframework.util.StringUtils;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;public class DateUtil {public static final String YYYYMMDDHHMMSS = "yyyy-MM-dd HH:mm:ss";public static final String YYYYMMDD = "yyyy-MM-dd";public static final String YYYYMMDDHHMM = "yyyy-MM-dd HH:mm";public static final String YYYYMM = "yyyy-MM";public DateUtil() {}public static String getCurrentDate(String var1) {return (new SimpleDateFormat(var1)).format(new Date());}public static Date parse(String date) {if (StringUtils.isEmpty(date)) {return null;} else {try {return (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).parse(date);} catch (ParseException var2) {return null;}}}public static Date parse(String date, String format) {if (StringUtils.isEmpty(date)) {return null;} else {try {return (new SimpleDateFormat(format)).parse(date);} catch (ParseException var3) {return null;}}}public static Date parseToYMD(String date) {try {return (new SimpleDateFormat("yyyy-MM-dd")).parse(date);} catch (ParseException var2) {return null;}}public static String format(Date date) {return date != null ? (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(date) : "/";}public static String format(Date date, String format) {return (new SimpleDateFormat(format)).format(date);}public static Date addYear(Date date, int year) {Calendar calendar = new GregorianCalendar();calendar.setTime(date);calendar.add(1, year);date = calendar.getTime();return date;}public static Date addMonth(Date date, int month) {Calendar calendar = new GregorianCalendar();calendar.setTime(date);calendar.add(2, month);date = calendar.getTime();return date;}public static Date addDay(Date date, int day) {Calendar calendar = new GregorianCalendar();calendar.setTime(date);calendar.add(5, day);date = calendar.getTime();return date;}public static Date addHour(Date date, int day) {Calendar calendar = new GregorianCalendar();calendar.setTime(date);calendar.add(10, day);date = calendar.getTime();return date;}public static Date addMinute(Date date, int day) {Calendar calendar = new GregorianCalendar();calendar.setTime(date);calendar.add(12, day);date = calendar.getTime();return date;}public static Date addWeek(Date date, int day) {Calendar calendar = new GregorianCalendar();calendar.setTime(date);calendar.add(5, day);date = calendar.getTime();return date;}public static Long getTimestamp() {return System.currentTimeMillis();}public static Map<String, String> getCurrentWeek(boolean addEndDay) {Map<String, String> map = new HashMap(2);SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");Calendar cal = Calendar.getInstance();cal.setFirstDayOfWeek(2);int dayWeek = cal.get(7);if (dayWeek == 1) {dayWeek = 8;}cal.add(5, cal.getFirstDayOfWeek() - dayWeek);Date mondayDate = cal.getTime();String weekBegin = sdf.format(mondayDate);map.put("beginWeek", weekBegin);cal.add(5, 4 + cal.getFirstDayOfWeek());if (addEndDay) {cal.add(5, 1);}Date sundayDate = cal.getTime();String weekEnd = sdf.format(addDay(sundayDate, -1)) + " 23:59:59";map.put("endWeek", weekEnd);return map;}public static Map<String, String> getCurrentMonth(boolean addEndDay) {Map<String, String> map = new HashMap(2);SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");map.put("beginMonth", format(new Date(), "yyyy-MM") + "-01");Calendar calendar = Calendar.getInstance();calendar.setTime(new Date());calendar.set(5, calendar.getActualMaximum(5));if (addEndDay) {calendar.add(5, 1);}map.put("endMonth", sdf.format(calendar.getTime()));return map;}public static Map<String, String> getAppointMonth(Date date, boolean addEndDay) {Map<String, String> map = new HashMap(2);SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");map.put("beginMonth", format(date, "yyyy-MM") + "-01");Calendar calendar = Calendar.getInstance();calendar.setTime(date);calendar.set(5, calendar.getActualMaximum(5));if (addEndDay) {calendar.add(5, 1);}map.put("endMonth", sdf.format(calendar.getTime()));return map;}public static String secondToTime(long second) {long days = second / 86400L;second %= 86400L;long hours = second / 3600L;second %= 3600L;long minutes = second / 60L;second %= 60L;return 0L < days ? days + "天" + hours + "小时" + minutes + "分" + second + "秒" : hours + "小时" + minutes + "分" + second + "秒";}public static int getYear(Date date) {SimpleDateFormat sdf = new SimpleDateFormat("YYYY");return Integer.valueOf(sdf.format(date));}public static Date getYearFirst(int year) {Calendar calendar = Calendar.getInstance();calendar.clear();calendar.set(1, year);Date currYearFirst = calendar.getTime();return currYearFirst;}public static Date getYearLast(int year) {Calendar calendar = Calendar.getInstance();calendar.clear();calendar.set(1, year);calendar.roll(6, -1);Date currYearLast = calendar.getTime();return currYearLast;}
}

测试类 

 

 public void testEasyExcel(@RequestParam Integer type){String filePath = "D:\\导入模板11条.xlsx";List<Object> objects = ExcelUtil.readLessThan1000Row(filePath);for (Object object : objects){String[] split = object.toString().split(",");logger.info("数据列:{},数据列:{},最后一个数据:{}",split[0],split.length,split[split.length-1]);int date = 0;try {String param = split[6];String stringNotBlank = getStringNotBlank(param);date = Integer.parseInt(stringNotBlank);}catch (Exception e){e.printStackTrace();}String date1 = formatExcelDate(date);Date obj = null;try {if (date1.matches("\\d{4}/\\d{1,2}/\\d{1,2}")) {obj= DateUtil.parse(date1, "yyyy/MM/dd");} else if (date1.matches("\\d{4}-\\d{2}-\\d{2}")) {obj=DateUtil.parse(date1, "yyyy-MM-dd");} else if (date1.matches("^\\d{4}\\d{2}\\d{2}")) {obj=DateUtil.parse(date1, "yyyyMMdd");} else if (date1.matches("\\d{4}.\\d{1,2}.\\d{1,2}")) {obj=DateUtil.parse(date1, "yyyy.MM.dd");} else {obj=null;}}catch (Exception e){e.printStackTrace();}logger.info("日期:{}",obj);}}/*** 格式化Excel时间* @param day* @return yyyy-MM-dd*/private String formatExcelDate(int day) {Calendar calendar = new GregorianCalendar(1900,0,-1);Date gregorianDate = calendar.getTime();String formatExcelDate = DateUtil.format(DateUtil.addDay(gregorianDate, day), DateUtil.YYYYMMDD);return formatExcelDate;}/*** string类型去掉前后空字符* @return*/public String getStringNotBlank(String textContent){textContent = textContent.trim();//这里判断是不是全角空格while (textContent.startsWith(" ")) {textContent = textContent.substring(1, textContent.length()).trim();}while (textContent.endsWith(" ")) {textContent = textContent.substring(0, textContent.length() - 1).trim();}return textContent;}

问题:

1、使用 EasyExcel 读取 Excel 数据时,表格中的日期自动转化为了一串数字

原因:

因为 Excel 导入的时间是以1900 年为原点的,而数字 34839 和 36577 则是1995/5/20 和 2000/2/21 与 1900 年之间经过的天数差值。

解决办法:

/*** 格式化Excel时间* @param day* @return yyyy-MM-dd*/private String formatExcelDate(int day) {Calendar calendar = new GregorianCalendar(1900,0,-1);Date gregorianDate = calendar.getTime();String formatExcelDate = DateUtils.format(DateUtils.addDay(gregorianDate, day), DateUtils.YYYYMMDD);return formatExcelDate;}

 2、表格中的日期自动转化为一串数字时前后会带空字符 导致string转number报错

解决办法:

/*** string类型去掉前后空字符* @return*/public String getStringNotBlank(String textContent){textContent = textContent.trim();//这里判断是不是全角空格while (textContent.startsWith(" ")) {textContent = textContent.substring(1, textContent.length()).trim();}while (textContent.endsWith(" ")) {textContent = textContent.substring(0, textContent.length() - 1).trim();}return textContent;}

 

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 86后生记录生活 Inc. 保留所有权利。

底部版权信息