Hutool常用工具
Hutool常用工具
目录:
日期时间类工具
字符串,long,Calendar转换为Date
时间单位(ms、s)转换
字符串转换为日期
日期转换为字符串
从日期对象中提取出 year month
获取日期对象的开始和结束时间(每天或者每月)
获取指定date&&偏移量的目标date
时间日期差
测试工具
性能测试工具(毫秒计时器工具)
FileAppender 文件追加操作
断言工具
控制台打印输出
文件 && IO流
流的获取,流的关闭
File转换为流
文件操作(CRUD,类型判断)
文件流的二次封装(FileReader,FileWriter)
其他工具
反射工具
UUID && Snowflake 工具
正则工具
字符串参数校验工具
BeanUtil不同bean之间进行赋值&&Bean转化为Map
JSON工具
Excel工具
List、Map、Bean 导出Excel
客户端下载Excel模板
客户上传Excel数据,并且存储数据到数据库
客户下载从数据库生成的Excel表
样式和其他设置
读取Excel表操作
日期时间类工具
1. 字符串,long,Calendar转换为Date
String a = "2017-05-06";
Date value = Convert.toDate(a);
//当前时间
Date date = DateUtil.date();
//当前时间
Date date2 = DateUtil.date(Calendar.getInstance());
//当前时间
Date date3 = DateUtil.date(System.currentTimeMillis());
//当前时间字符串,格式:yyyy-MM-dd HH:mm:ss
String now = DateUtil.now();
//当前日期字符串,格式:yyyy-MM-dd
String today= DateUtil.today();
2. 时间单位(ms、s)转换
long a = 4535345;
//结果为:75
long minutes = Convert.convertTime(a, TimeUnit.MILLISECONDS, TimeUnit.MINUTES);
3. 字符串转换为日期
// 支持的字符串格式
yyyy-MM-dd HH:mm:ss
yyyy-MM-dd
HH:mm:ss
yyyy-MM-dd HH:mm
yyyy-MM-dd HH:mm:ss.SSS
// 转换方式
String dateStr = "2017-03-01";
Date date = DateUtil.parse(dateStr);
4. 日期转换为字符串
String dateStr = "2017-03-01";
Date date = DateUtil.parse(dateStr);
//结果 2017/03/01
String format = DateUtil.format(date, "yyyy/MM/dd");
//常用格式的格式化,结果:2017-03-01
String formatDate = DateUtil.formatDate(date);
//结果:2017-03-01 00:00:00
String formatDateTime = DateUtil.formatDateTime(date);
//结果:00:00:00
String formatTime = DateUtil.formatTime(date);
**5. 从日期对象中提取出 year month **
Date date = DateUtil.date();
//获得年的部分
DateUtil.year(date);
//获得月份,从0开始计数
DateUtil.month(date);
//获得月份枚举
DateUtil.monthEnum(date);
//.....
6. 获取日期对象的开始和结束时间(每天或者每月)
String dateStr = "2017-03-01 22:33:23";
Date date = DateUtil.parse(dateStr);
//一天的开始,结果:2017-03-01 00:00:00
Date beginOfDay = DateUtil.beginOfDay(date);
//一天的结束,结果:2017-03-01 23:59:59
Date endOfDay = DateUtil.endOfDay(date);
7. 获取指定date&&偏移量的目标date
String dateStr = "2017-03-01 22:33:23";
Date date = DateUtil.parse(dateStr);
//结果:2017-03-03 22:33:23
Date newDate = DateUtil.offset(date, DateField.DAY_OF_MONTH, 2);
//常用偏移,结果:2017-03-04 22:33:23
DateTime newDate2 = DateUtil.offsetDay(date, 3);
//常用偏移,结果:2017-03-01 19:33:23
DateTime newDate3 = DateUtil.offsetHour(date, -3);
8. 时间日期差
String dateStr1 = "2017-03-01 22:33:23";
Date date1 = DateUtil.parse(dateStr1);
String dateStr2 = "2017-04-01 23:33:23";
Date date2 = DateUtil.parse(dateStr2);
//相差一个月,31天
long betweenDay = DateUtil.between(date1, date2, DateUnit.DAY);
// 获取时间差的字符串
//Level.MINUTE表示精确到分
String formatBetween = DateUtil.formatBetween(between, Level.MINUTE);
//输出:31天1小时
Console.log(formatBetween);
测试工具
1. 性能测试工具(毫秒计时器工具)
TimeInterval timer = DateUtil.timer();
//---------------------------------
//-------这是执行过程
//---------------------------------
timer.interval();//花费毫秒数
timer.intervalRestart();//返回花费时间,并重置开始时间
2. FileAppender 文件追加操作
也就是说,这是一个支持缓存的文件内容追加器。此类主要用于类似于日志写出这类需求所用。
FileAppender appender = new FileAppender(file, 16, true);
appender.append("123");
appender.append("abc");
appender.append("xyz");
appender.flush();
appender.toString();
3. 断言工具
String a = null;
cn.hutool.lang.Assert.isNull(a);
// 补充
isTrue 是否True
isNull 是否是null值,不为null抛出异常
notNull 是否非null值
notEmpty 是否非空
notBlank 是否非空白符
notContain 是否为子串
notEmpty 是否非空
noNullElements 数组中是否包含null元素
isInstanceOf 是否类实例
isAssignable 是子类和父类关系
state 会抛出IllegalStateException异常
4. 控制台打印输出
Console.log("This is Console log for {}.", "test");
//控制台输出:This is Console log for test.
文件 && IO流
1. 流的获取,流的关闭
// 字节流
BufferedInputStream in = FileUtil.getInputStream(B_JDK_8_MD);
BufferedOutputStream out = FileUtil.getOutputStream(B_JDK_8_COPY_MD);
long copySize = IoUtil.copy(in, out, IoUtil.DEFAULT_BUFFER_SIZE);
// 字符流
BufferedReader reader = IoUtil.getReader(new FileInputStream(B_JDK_8_MD), "utf-8");
OutputStreamWriter writer = IoUtil.getWriter(new FileOutputStream(B_JDK_8_MD), "utf-8");
IoUtil.copy(reader, writer);
String s;
while ((s = reader.readLine()) != null) {
System.out.println(s);
}
IoUtil.close(writer);
IoUtil.close(reader);
2. File转换为流
File file = new File(B_JDK_8_MD);
BufferedReader reader = IoUtil.getReader(IoUtil.toStream(file), "utf-8");
String s;
while ((s = reader.readLine()) != null) {
System.out.println(s);
}
3. 文件操作(CRUD,类型判断)
ls 列出目录和文件
touch 创建文件,如果父目录不存在也自动创建
mkdir 创建目录,会递归创建每层目录
del 删除文件或目录(递归删除,不判断是否为空),这个方法相当于Linux的delete命令
copy 拷贝文件或目录
// 部分类型无法判断,例如JSON文件
File file = FileUtil.file("d:/test.jpg");
String type = FileTypeUtil.getType(file);
//输出 jpg则说明确实为jpg文件
Console.log(type);
4. 文件流的二次封装(FileReader,FileWriter)
1.1 FileReader
//默认UTF-8编码,可以在构造中传入第二个参数做为编码
FileReader fileReader = new FileReader("test.properties");
String result = fileReader.readString();
// 补充
FileReader提供了以下方法来快速读取文件内容:
readBytes
readString
readLines
同时,此类还提供了以下方法用于转换为流或者BufferedReader:
getReader
getInputStream
1.2 FileWriter
FileWriter writer = new FileWriter("test.properties");
writer.write("test");
// 补充
同样,此类提供了:
getOutputStream
getWriter
getPrintWriter
其他工具
1. 反射工具
// 获取方法集合
Method[] methods = ReflectUtil.getMethods(ExamInfoDict.class);
// 获取方法
Method method = ReflectUtil.getMethod(ExamInfoDict.class, "getId");
// 获取实例
ReflectUtil.newInstance(ExamInfoDict.class);
// 执行方法
TestClass testClass = new TestClass();
ReflectUtil.invoke(testClass, "setA", 10);
2. UUID && Snowflake 工具
1.1 UUID
//生成的UUID是带-的字符串,类似于:a5c8a5e8-df2b-4706-bea4-08d0939410e3
String uuid = IdUtil.randomUUID();
//生成的是不带-的字符串,类似于:b17f24ff026d40949c85a24f4f375d42
String simpleUUID = IdUtil.simpleUUID();
1.2 Snowflake雪花算法生成唯一ID
//参数1为终端ID
//参数2为数据中心ID
Snowflake snowflake = IdUtil.getSnowflake(1, 1);
long id = snowflake.nextId();
3. 正则工具
1.1 ReUtil.findAll
String content = "ZZZaaabbbccc中文1234";
List<String> resultFindAll = ReUtil.findAll("\\w{2}", content, 0, new ArrayList<String>());
// 结果:["ZZ", "Za", "aa", "bb", "bc", "cc", "12", "34"]
1.2 ReUtil.isMatch
String content = "ZZZaaabbbccc中文1234";
boolean isMatch = ReUtil.isMatch("\\w+[\u4E00-\u9FFF]+\\d+", content);
Assert.assertTrue(isMatch);
1.3 ReUtil.replaceAll
String content = "ZZZaaabbbccc中文1234";
//此处把1234替换为 ->1234<-
String replaceAll = ReUtil.replaceAll(content, "(\\d+)", "->$1<-");
Assert.assertEquals("ZZZaaabbbccc中文->1234<-", replaceAll);
4. 字符串参数校验工具
1.1 非空校验
// 这个对于长度为 1 的集合类型的验证结果是false
// 对于空值字符串 "" 验证结果是true
// 所以我们可以用这个对字符串进行验证
boolean empty = Validator.isEmpty(objects);
1.2 常用正则校验
boolean isEmail = Validator.isEmail("aaa@qq.com")
1.3 异常校验
Validator.validateChinese("我是一段zhongwen", "内容中包含非中文");
5. BeanUtil不同bean之间进行赋值&&Bean转化为Map
1.1 Bean转化为Bean
SubPerson p1 = new SubPerson();
p1.setSlow(true);
p1.setName("测试");
p1.setSubName("sub测试");
Map<String, Object> map = MapUtil.newHashMap();
BeanUtil.copyProperties(p1, map);
1.2 Bean转化为Map
注意这里不会对null值作额外的处理,如果不想要将null值存入map,需要自行过滤
SubPerson person = new SubPerson();
person.setAge(14);
person.setOpenid("11213232");
person.setName("测试A11");
person.setSubName("sub名字");
Map<String, Object> map = BeanUtil.beanToMap(person);
6. JSON工具
// JSON -> Bean
String json = "{\n" +
" \"age\": \"0\",\n" +
" \"name\": \"String\"\n" +
"}";
Person person1 = JSONUtil.toBean(json, Person.class);
System.out.println(person1);
// Bean -> JSON
JSON person = JSONUtil.parse(new Person(1, "Zhangsan"));
// 打印 json 字符串
System.out.println(person.toJSONString(2));
Excel工具
1. List、Map、Bean 导出Excel
1.1 提前说明一**意点
- List导出需要列名需要额外添加一个列名集合
- Bean导出的列名顺序不是根据你的对Bean属性赋值顺序导出的,如果需要按照你赋值顺序导出需要你对列名进行别名
// TODO 叶之越 2020/7/26 9:16 列表生成 xlsx
// 3行数据
List<String> listRow1 = Arrays.asList("a1", "b1", "c1");
List<String> listRow2 = Arrays.asList("a2", "b2", "c2");
List<String> listRow3 = Arrays.asList("a3", "b3", "c3");
// 3行数据封装到一个对象中
List<List<String>> listRows = Arrays.asList(listRow1, listRow2, listRow3);
// TODO 叶之越 2020/7/26 9:16 哈希表生成 xlsx
// 第一行数据
Map<String, Object> mapRow1 = new LinkedHashMap<>();
mapRow1.put("姓名", "张三");
mapRow1.put("性别", "女");
mapRow1.put("年龄", 23);
mapRow1.put("学历", "大专");
// 第二行数据
Map<String, Object> mapRow2 = new LinkedHashMap<>();
mapRow2.put("姓名", "李四");
mapRow2.put("性别", "男");
mapRow2.put("年龄", 20);
// 3行数据封装到一个集合中
ArrayList<Map<String, Object>> mapRows = CollUtil.newArrayList(mapRow1, mapRow2);
// TODO 叶之越 2020/7/26 9:27 写出Bean数据
// 注意,默认写出bean不会指定顺序,但是指定别名的话就可以指定顺序
// 第一行
TestBean beanRow1 = new TestBean();
beanRow1.setName("张三");
beanRow1.setAge(22);
beanRow1.setPass(true);
beanRow1.setScore(66.30);
beanRow1.setExamDate(DateUtil.date());
// 第二行
TestBean beanRow2 = new TestBean();
beanRow2.setName("李四");
beanRow2.setAge(28);
beanRow2.setPass(false);
beanRow2.setScore(38.50);
beanRow2.setExamDate(DateUtil.date());
// 封装到一个集合
List<TestBean> beanRows = CollUtil.newArrayList(beanRow1, beanRow2);
// 写出文件
ExcelWriter writer = ExcelUtil.getWriter("b:\\test.xlsx");
// 写出列表数据
writer.write(listRows, true);
// 写出哈希表数据
writer.passCurrentRow();
writer.write(mapRows, true);
// 写出Bean数据
writer.passCurrentRow();
writer.write(beanRows, true);
// TODO 叶之越 2020/7/26 9:30 指定Bean对象的别名,使得这个Excel有顺序
//自定义标题别名
writer.addHeaderAlias("name", "姓名");
writer.addHeaderAlias("age", "年龄");
writer.addHeaderAlias("score", "分数");
writer.addHeaderAlias("isPass", "是否通过");
writer.addHeaderAlias("examDate", "考试时间");
// bean设置别名后输出
writer.passCurrentRow();
writer.write(beanRows,true);
// 跳过当前行
writer.passCurrentRow();
// 添加标题行
writer.merge(listRow1.size() - 1, "测试标题1");
// 刷新内存到硬盘
writer.close();
1.2 Bean对象补充
class TestBean {
private String name;
private int age;
private double score;
private boolean isPass;
private Date examDate;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
public boolean isPass() {
return isPass;
}
public void setPass(boolean isPass) {
this.isPass = isPass;
}
public Date getExamDate() {
return examDate;
}
public void setExamDate(Date examDate) {
this.examDate = examDate;
}
}
2. 客户端下载Excel模板
1.1 Controller
/**
* @param response: 需要对返回IO流
* @description 返回我们 Excel 的模板
* @author 叶之越
* @email aaa@qq.com
* @date 2020/7/7 15:15
*/
@ApiOperation("获取学生的数据模板")
@PostMapping("/getExcelTemplate")
public void getExcelTemplate(HttpServletResponse response) {
talentStudentService.getExcelTemplate(response);
}
}
1.2 Service
/**
* @param response: 返回输入流
* @description 下载我们 Excel 的模板
* @author 叶之越
* @email aaa@qq.com
* @date 2020/7/7 15:17
*/
@Override
public void getExcelTemplate(HttpServletResponse response) {
try {
// 1 从我们的resource资源目录下面读取对象
final ExcelReader reader = ExcelUtil.getReader(this.getClass().getResourceAsStream("/exceltemplate/stu.xlsx"));
// 读取Excel为集合对象
List<List<Object>> lists = reader.read();
ExcelWriter writer = ExcelUtil.getWriter(true);
writer.write(lists);
response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode("stu.xlsx", "UTF-8"));
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
// 2 写出对象
ServletOutputStream out = response.getOutputStream();
// 通过Response的IO写出我们的表格对象到客户端
writer.flush(out, true);
writer.close();
IoUtil.close(out);
} catch (IOException e) {
log.error("EducationServiceImpl [export] 输出到响应流失败", e);
throw new BusinessException("导出Excel异常");
}
}
3. 客户上传Excel数据,并且存储数据到数据库
1.1 Controller
/**
* @param file 需要同步学生信息用户的Excel文件
* @description 导入查询学生信息
* @author 叶之越
* @email aaa@qq.com
* @date 2020/7/7 13:50
*/
@ApiOperation("通过Excel表导入数据")
@PostMapping("/importStudent")
public ResultBean<Boolean> importStudent(@RequestParam MultipartFile file) {
try {
return ResultBean.restResult(talentStudentService.getStudentInfos(file.getInputStream()), ErrorCodeInfo.OK);
} catch (IOException e) {
log.error("EducationController [getEducation] 获取输入流失败", e);
throw new BusinessException("获取输入流失败");
}
}
1.2 Service
/**
* @param inputStream: 输入的 Excel 流
* @description 导入我们的Excel数据到数据库
* @author 叶之越
* @email aaa@qq.com
* @date 2020/7/7 13:46
*/
@Override
public Boolean getStudentInfos(InputStream inputStream) {
try {
final ExcelReader reader = ExcelUtil.getReader(inputStream);
List<List<Object>> stuList = reader.read(1);
// 需要的结果集合
List<TalentStudent> talentStudents = new ArrayList<>();
// 准备进行数据疯转的对象
TalentStudent talentStudent;
// 对一些结果信息进行过滤
for (List<Object> objects : stuList) {
talentStudent = new TalentStudent();
if (objects.get(0) != null) {
talentStudent.setName(objects.get(0).toString());
}
if (objects.get(1) != null) {
talentStudent.setGender(objects.get(1).toString());
}
if (objects.get(2) != null) {
talentStudent.setIdCard(objects.get(2).toString());
}
if (objects.get(3) != null) {
talentStudent.setMobile(objects.get(3).toString());
}
if (objects.get(4) != null) {
talentStudent.setEducation(objects.get(4).toString());
}
talentStudents.add(talentStudent);
}
// 进行结参数验证
talentStudents = TalentStudentValidator.insertByExcelValidate(talentStudents).stream().filter(item -> !Objects.equals(item, null)).collect(Collectors.toList());
if (!talentStudents.isEmpty()) {
// 首先将表格中所有的id值提取出来
List<String> idCardCollect = talentStudents.stream().map(TalentStudent::getIdCard).collect(Collectors.toList());
// 查询已经存在的身份证号
List<TalentStudent> idCardAlreadyHave = list(Wrappers.<TalentStudent>lambdaQuery().in(TalentStudent::getIdCard, idCardCollect));
// 将存在的身份证号过滤出去
List<TalentStudent> result = talentStudents.stream().filter(tStudent -> {
for (TalentStudent student : idCardAlreadyHave) {
if (student.getIdCard().equals(tStudent.getIdCard())) {
return false;
}
}
return true;
}).collect(Collectors.toList());
// 保存结果
saveBatch(result);
}
} catch (Exception e) {
log.error("EducationServiceImpl [getEducation] Excel读取失败", e);
throw new BusinessException("Excel读取失败");
}
return true;
}
1.3 Validator
/**
* @param talentStudents: Excel 传递过来的对象模型
* @description Excel 条件过滤,姓名、身份证不能为空。其他性别不合法默认设置为 男
* @author 叶之越
* @email aaa@qq.com
* @date 2020/7/7 10:20
*/
public static List<TalentStudent> insertByExcelValidate(List<TalentStudent> talentStudents) {
for (int i = 0; i < talentStudents.size(); i++) {
TalentStudent talentStudent = talentStudents.get(i);
// *身份证验证
// 如果不符合条件,那么直接去除这一条记录
if (StringUtils.isEmpty(talentStudent.getIdCard())||!talentStudent.getIdCard().matches("\\d{15}(\\d\\d[0-9xX])?")) {
talentStudents.set(i, null);
// 如果将字段设置为了null,那么直接跳到下一次的循环
continue;
}
// 如果姓名为空,那么直接设置为空
if (StringUtils.isEmpty(talentStudent.getName())||talentStudent.getName().equals("")) {
talentStudents.set(i, null);
continue;
}
// *手机号码
// 如果电话号码不符合要求,直接赋值为空字符串
if (StringUtils.isEmpty(talentStudent.getMobile())||!talentStudent.getMobile().matches("1\\d{10}")) {
talentStudent.setMobile("");
}
// 如果教育为空,那么直接设置为空串
if (StringUtils.isEmpty(talentStudent.getEducation())) {
talentStudent.setEducation("");
}
// 性别如果不符合规则,那么直接默认设置为未知
if (StringUtils.isEmpty(talentStudent.getMobile())||(!talentStudent.getGender().equals("男")&&!talentStudent.getGender().equals("女"))) {
talentStudent.setGender("未知");
}
}
return talentStudents;
}
4. 客户下载从数据库生成的Excel表
1.1 Controller
/**
* @param pageNum 当前页
* @param pageSize 页面信息条数
* @param response 返回流信息对象
* @description 导出学生Excel
* @author 叶之越
* @email aaa@qq.com
* @date 2020/7/7 13:50
*/
@ApiOperation("导出分页学生信息")
@PostMapping("/export")
public void export(Integer pageNum, Integer pageSize,HttpServletResponse response) {
talentStudentService.export(pageNum, pageSize, response);
}
1.2 Service
/**
* @param pageNum 当前页
* @param pageSize 页面信息条数
* @param talentStudent 我们导出的学生数据类型
* @param response 返回流信息对象
* @description 导出学生Excel
* @author 叶之越
* @email aaa@qq.com
* @date 2020/7/7 13:54
*/
@Override
public void export(Integer pageNum, Integer pageSize, TalentStudent talentStudent, HttpServletResponse response) {
// 从数据库查出数据对象封装成map
final List<Map<String, Object>> educationList = page(new Page<>(pageNum, pageSize), Wrappers.lambdaQuery(talentStudent)).getRecords()
.stream()
// 封装成 Map 并且放入 List
.map(item -> {
final Map<String, Object> map = new LinkedHashMap<>();
// 错误,这里需要根据表中字段名称进行命名
map.put("name", item.getName());
map.put("gender", item.getGender());
map.put("idCard", item.getIdCard());
map.put("mobile", item.getMobile());
map.put("education", item.getEducation());
map.put("remarks", item.getRemarks());
return map;
})
.collect(Collectors.toList());
// 准备将数据集合封装成Excel对象
ExcelWriter writer = ExcelUtil.getWriter(true);
// 通过工具类创建writer并且进行别名
writer.addHeaderAlias("name", "姓名");
writer.addHeaderAlias("gender", "性别( 0 表示男 , 1 表示 女)");
writer.addHeaderAlias("idCard", "身份证");
writer.addHeaderAlias("mobile", "电话");
writer.addHeaderAlias("education", "个人介绍");
writer.addHeaderAlias("remarks", "备注");
// 准备将对象写入我们的 List
writer.write(educationList, true);
try {
// 获取我们的输出流
final OutputStream output = response.getOutputStream();
response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode("stu.xlsx", "UTF-8"));
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
writer.flush(output, true);
writer.close();
// 这里可以自行关闭资源或者写一个关闭资源的工具类
IoUtil.close(output);
} catch (IOException e) {
log.error("EducationServiceImpl [export] 输出到响应流失败", e);
throw new BusinessException("导出Excel异常");
}
}
5. 样式和其他设置
1.1 合并单元格,跳过当前行
// 写出列表数据
// 跳过当前行
writer.passCurrentRow();
// 添加标题行
writer.merge(listRow1.size() - 1, "测试标题1");
writer.write(listRows, true);
// 写出哈希表数据
writer.passCurrentRow();
writer.merge(mapRow1.size() - 1, "测试标题1");
writer.write(mapRows, true);
// 写出Bean数据
writer.passCurrentRow();
writer.merge(4, "测试标题1");
writer.write(beanRows, true);
1.2 设置多张表
// 写出列表数据
writer.setSheet("表1");
writer.write(listRows, true);
// 写出哈希表数据
writer.setSheet("表2");
writer.write(mapRows, true);
// 写出Bean数据
writer.setSheet("表3");
writer.write(beanRows, true);
1.3 属性设置
// TODO 叶之越 2020/7/26 10:09 设置单元格样式
StyleSet style = writer.getStyleSet();
// 表的背景颜色
style.setBackgroundColor(IndexedColors.YELLOW, true);
// 字体
Font font = writer.createFont();
font.setBold(true);
font.setColor(Font.COLOR_RED);
font.setItalic(true);
style.setFont(font, true);
// 单元格样式设置
CellStyle cellStyle = writer.getCellStyle();
cellStyle.setAlignment(HorizontalAlignment.RIGHT);
1.4 补充:设置自动调整单元格宽度
/**
* 设置所有列为自动宽度,不考虑合并单元格<br>
* 此方法必须在指定列数据完全写出后调用才有效。<br>
* 列数计算是通过第一行计算的
*
* @return this
* @since 4.0.12
*/
public ExcelWriter autoSizeColumnAll() {
final int columnCount = this.getColumnCount();
for (int i = 0; i < columnCount; i++) {
autoSizeColumn(i);
}
return this;
}
6. 读取Excel表操作
ExcelReader reader = ExcelUtil.getReader("d:/aaa.xlsx");
List<List<Object>> readAll = reader.read();
ExcelReader reader = ExcelUtil.getReader("d:/aaa.xlsx");
List<Map<String,Object>> readAll = reader.readAll();
ExcelReader reader = ExcelUtil.getReader("d:/aaa.xlsx");
List<Person> all = reader.readAll(Person.class);