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. 控制台打印输出


返回目录

//推荐创建不可变静态类成员变量
private static final Log log = LogFactory.get();

文件 && 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("loolly@gmail.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 739153436@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 739153436@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 739153436@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 739153436@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 739153436@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 739153436@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 739153436@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);
  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
hutool工具常用类包括类型换工具类(Convert)、字符串工具类(StrUtil / StringUtils)、日期工具类(DateUtil)、数字工具类(NumberUtil)、数组工具类(ArrayUtil)、随机工具类(RandomUtil)、比较器工具类(ComparatorUtil)、多线程工具类(ThreadUtil)、IO流工具类(FileUtil)、集合工具类(CollUtil / CollectionsUtils)、正则工具类(ReUtil)、网络工具类(NetUtil)、JSON工具类(JSONUtil)、系统信息工具类(SystemUtil)等等。这些工具类提供了一系列常用的方法和功能,能够帮助开发者更加方便地进行类型换、字符串处理、日期操作、数字处理、数组操作、随机数生成、多线程管理、IO流操作、集合操作、正则表达式匹配、网络操作、JSON处理、系统信息获取等等。通过使用hutool工具类,开发者可以提高开发效率,减少代码量,提供更加稳定和高效的程序功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Hutool常用工具类](https://blog.csdn.net/abst122/article/details/124091375)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [hutool 工具类](https://download.csdn.net/download/LiHaoYang11/12153632)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [常用工具类 (三) : Hutool 常用工具类整理 (全)](https://blog.csdn.net/m0_37989980/article/details/126401041)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值