欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Hutool常用工具

程序员文章站 2024-03-14 08:55:58
...

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

Hutool常用工具


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 合并单元格,跳过当前行

Hutool常用工具

// 写出列表数据
// 跳过当前行
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 设置多张表

Hutool常用工具

// 写出列表数据
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);

Hutool常用工具

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);
相关标签: SpringBoot Hutool