使用Hutool生成Excel工作日报文件

文章目录

    • 前言
    • Hutool工具简介
    • Excel的字体和样式
    • 生成效果
    • 不足与改善

前言

当今互联网时代,数据处理已成为我们工作中的重要一环。无论是在企业管理中,还是在个人日常生活中,数据的管理和分析都至关重要。在数据处理中,导出数据到Excel或CSV文件成为一种非常普遍的需求。例如我们需要将数据导出到Excel文件供运营或者财务人员分析使用,数据导出到CSV文件提供CRM系统导入。本篇技术博客将介绍使用Hutool工具生成Excel和CSV文件的基本流程,并演示如何在一个接口中通过将Excel和CSV文件压缩到Zip压缩包中且不生成本地文件。

Hutool工具简介

Hutool是一个小而全的Java工具类库。它包含了一系列的工具类,如字符串分割、替换、格式化等的字符串处理工具、文件读取、写入、复制、移动等文件操作工具、日期格式化、计算、转换等功能的日期时间处理工具等等可以帮助Java开发者提高开发效率,满足大多数的Java开发中的工具类的需求,减少重复劳动。Hutool官网地址

Hutool提供了如下工具组件:

模块介绍
hutool-aopJDK动态代理封装,提供非IOC下的切面支持
hutool-bloomFilter布隆过滤,提供一些Hash算法的布隆过滤
hutool-cache简单缓存实现
hutool-core核心,包括Bean操作、日期、各种Util等
hutool-cron定时任务模块,提供类Crontab表达式的定时任务
hutool-crypto加密解密模块,提供对称、非对称和摘要算法封装
hutool-dbJDBC封装后的数据操作,基于ActiveRecord思想
hutool-dfa基于DFA模型的多关键字查找
hutool-extra扩展模块,对第三方封装(模板引擎、邮件、Servlet、二维码、Emoji、FTP、分词等)
hutool-http基于HttpUrlConnection的Http客户端封装
hutool-log自动识别日志实现的日志门面
hutool-script脚本执行封装,例如Javascript
hutool-setting功能更强大的Setting配置文件和Properties封装
hutool-system系统参数调用封装(JVM信息等)
hutool-jsonJSON实现
hutool-captcha图片验证码实现
hutool-poi针对POI中Excel和Word的封装
hutool-socket基于Java的NIO和AIO的Socket封装
hutool-jwtJSON Web Token (JWT)封装实现

使用方式如下:

🍊Maven

在项目的pom.xml的dependencies中加入以下内容:

<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version>
</dependency>

🍐Gradle

implementation 'cn.hutool:hutool-all:5.8.16'

因为小编的工作岗位每天都要都要写日报,疫情期间由直接文字提交变为了使用Excel制式文件(加剧内卷???),在写了几个月以后终于借助某个需要导出Excel文件的需求顺势来生成Excel工作日报,本文借助我的工作日报演示生成Excel文件,主要包含了Excel单元格字体设置、合并单元格合、自动换行、设置背景颜色等主要Excel操作。整体的设想为通过代码生成Excel日志制式文件,在输入给ChatGPT本周的工作目标借助ChatGPT的废话文学特点自动填充日报,达到自动写日报的目的。目前实现了生成日报制式文件功能,先记录下来。工作日报Excel制式主要包含今日复盘和明日工作计划文件如下:

  1. 今日复盘如下:
    在这里插入图片描述
  2. 明天规划如下:
    在这里插入图片描述

Excel的字体和样式

分析上面的工作日报文件每天都包含一个今日工作复盘和明日工作规划,同时TODO List 字体大小与其它内容的字体不一样,且有不同的背景颜色, 字体加粗,内容自动换行。

  1. 添加Hutool依赖

    <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.15</version>
    </dependency>
    <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.2</version>
    </dependency>
    

    Hutool-all中包含了Hutool的所有工具类,由于需要生成Excel文件需要依赖poi(ps:许多人诟病Hutool的原因之一?)

  2. Excel文件Cell字体设置

    ​ 主要设置Excel字体名称、字体大小、字体颜色、下划线、是否加粗、是否斜体、是否有删除线等常用的字体设置方法,代码如下:

    	/*** 单元格字体常用设置基础方法** @param writer    ExcelWriter* @param fontName  字体名称(ex:微软雅黑、宋体、仿宋,需要底层操作系统支持)* @param fontSize  字体大小* @param color     字体颜色* @param underline 下划线样式* @param bold      是否加粗* @param strikeout 是否有删除线* @param italic    是否斜体* @return Font*/public static Font createCellBaseFont(ExcelWriter writer, String fontName, short fontSize, short color,byte underline, boolean bold, boolean strikeout, boolean italic) {// 创建单元格Cell字体Font font = writer.createFont();// 设置字体名称(ex:微软雅黑、宋体、仿宋)font.setFontName(fontName);// 设置字体大小font.setFontHeightInPoints(fontSize);// 设置字体颜色font.setColor(color);// 设置字体是否加粗font.setBold(bold);// 设置字体下划线样式font.setUnderline(underline);// 设置是否有删除线font.setStrikeout(strikeout);// 设置是否斜体font.setItalic(italic);return font;}
    
  3. Excel单元格样式设置

    ​ Excel单元格样式设置主要包括单元格水平方向对齐方式、垂直方向对齐方式、单元格内容字体样式、单元格背景颜色、单元格边框等常用设置,代码如下:

    	/*** 设置单元格的基础常用样式** @param writer              Excel* @param font                字体* @param fillForegroundColor 是否填充背景* @param color               背景颜色 fillForegroundColor为true时生效* @param hAlign              水平对齐样式* @param vAlign              垂直对齐样式* @param wrapText            是否自动换行* @return CellStyle*/public static CellStyle createCellBaseStyle(ExcelWriter writer, Font font, boolean fillForegroundColor,short color, HorizontalAlignment hAlign, VerticalAlignment vAlign, boolean wrapText) {// 创建单元格样式CellStyle style = writer.getWorkbook().createCellStyle();// 设置单元格内容的水平对齐方式,如左对齐、居中对齐、右对齐等。style.setAlignment(hAlign);// 设置单元格内容的垂直对齐方式,如上对齐、居中对齐、下对齐等。style.setVerticalAlignment(vAlign);// 设置字体style.setFont(font);// 是否设置背景色if (fillForegroundColor) {// style.setFillForegroundColor(IndexedColors.PALE_BLUE.getIndex());// 设置单元格背景颜色style.setFillForegroundColor(color);// 设置填充模式style.setFillPattern(FillPatternType.SOLID_FOREGROUND);}// 设置边框style.setBorderTop(BorderStyle.THIN);style.setBorderBottom(BorderStyle.THIN);style.setBorderLeft(BorderStyle.THIN);style.setBorderRight(BorderStyle.THIN);style.setWrapText(wrapText);return style;}
    
  4. 合并单元格操作

    样例文件中包含了很多单元格合并操作,其中第一行合并,第一列合并,第二行从第二列合并到第七列并且有填充内容 To Do List 复盘总结 — 03月20日(星期一),第三列需要从第6行到第十三行竖着合并单元格并且填充项目名称等等。在Hutool中提供了merge方法来进行单元格的合并操作,Hutool中的ExcelWiter中的merge方法如下所示:

    	/*** 合并当前行的单元格<br>* 样式为默认标题样式,可使用{@link #getHeadCellStyle()}方法调用后自定义默认样式** @param lastColumn 合并到的最后一个列号* @return this*/public ExcelWriter merge(int lastColumn) {return merge(lastColumn, null);}/*** 合并当前行的单元格,并写入对象到单元格<br>* 如果写到单元格中的内容非null,行号自动+1,否则当前行号不变<br>* 样式为默认标题样式,可使用{@link #getHeadCellStyle()}方法调用后自定义默认样式** @param lastColumn 合并到的最后一个列号* @param content    合并单元格后的内容* @return this*/public ExcelWriter merge(int lastColumn, Object content) {return merge(lastColumn, content, true);}/*** 合并某行的单元格,并写入对象到单元格<br>* 如果写到单元格中的内容非null,行号自动+1,否则当前行号不变<br>* 样式为默认标题样式,可使用{@link #getHeadCellStyle()}方法调用后自定义默认样式** @param lastColumn       合并到的最后一个列号* @param content          合并单元格后的内容* @param isSetHeaderStyle 是否为合并后的单元格设置默认标题样式,只提取边框样式* @return this* @since 4.0.10*/public ExcelWriter merge(int lastColumn, Object content, boolean isSetHeaderStyle) {Assert.isFalse(this.isClosed, "ExcelWriter has been closed!");final int rowIndex = this.currentRow.get();merge(rowIndex, rowIndex, 0, lastColumn, content, isSetHeaderStyle);// 设置内容后跳到下一行if (null != content) {this.currentRow.incrementAndGet();}return this;}/*** 合并某行的单元格,并写入对象到单元格<br>* 如果写到单元格中的内容非null,行号自动+1,否则当前行号不变<br>* 样式为默认标题样式,可使用{@link #getHeadCellStyle()}方法调用后自定义默认样式** @param firstRow         起始行,0开始* @param lastRow          结束行,0开始* @param firstColumn      起始列,0开始* @param lastColumn       结束列,0开始* @param content          合并单元格后的内容* @param isSetHeaderStyle 是否为合并后的单元格设置默认标题样式,只提取边框样式* @return this* @since 4.0.10*/public ExcelWriter merge(int firstRow, int lastRow, int firstColumn, int lastColumn, Object content, boolean isSetHeaderStyle) {Assert.isFalse(this.isClosed, "ExcelWriter has been closed!");CellStyle style = null;if (null != this.styleSet) {style = styleSet.getStyleByValueType(content, isSetHeaderStyle);}return merge(firstRow, lastRow, firstColumn, lastColumn, content, style);}/*** 合并单元格,并写入对象到单元格,使用指定的样式<br>* 指定样式传入null,则不使用任何样式** @param firstRow    起始行,0开始* @param lastRow     结束行,0开始* @param firstColumn 起始列,0开始* @param lastColumn  结束列,0开始* @param content     合并单元格后的内容* @param cellStyle   合并后单元格使用的样式,可以为null* @return this* @since 5.6.5*/public ExcelWriter merge(int firstRow, int lastRow, int firstColumn, int lastColumn, Object content, CellStyle cellStyle) {Assert.isFalse(this.isClosed, "ExcelWriter has been closed!");CellUtil.mergingCells(this.getSheet(), firstRow, lastRow, firstColumn, lastColumn, cellStyle);// 设置内容if (null != content) {final Cell cell = getOrCreateCell(firstColumn, firstRow);CellUtil.setCellValue(cell, content, cellStyle);}return this;}
    

    日报中合并单元格操作代码如下:

    // 创建一个ExcelWriter 用来写Excel文件,如果为xlsx
    ExcelWriter writer = new ExcelWriter(true);
    // 第一个Sheet名称
    writer.renameSheet(0, "test");
    // 合并第0列
    writer.merge(0);
    // 合并第0列(0到30行,不填充内容)
    writer.merge(0, 30, 0, 0, "", null);
    
  5. 跳过N行

    // 跳过两行
    writer.passRows(2);
    
  6. 获取某个单元格填充内容并设置样式

    由于日志中包含了一些固定字段设置,如果每日复盘中的序号、项目归属、任务归属、完成情况、协调资源等,所以写了一个方法,通过获取固定的单元格填充内容并设置单元格样式

    	/*** 今日复盘中的固定表头*/private static final String[] REPLAY_TITLE = { "序号", "项目归属", "任务", "完成情况", "资源协助", "原因分析(未完成工作需写原因)" };/*** 设置复盘总结表头并设置样式** @param writer ExcelWriter* @param fields 表头固定字段名称* @param y 列*/public static void createReplayTitleAndStyle(ExcelWriter writer, String[] fields, int y) {for (int i = 0; i < fields.length; i++) {// 获取单元格 第一个参数为列号,第二个参数为行号Cell cell = writer.getCell(i + 1, y, true);// 设置单元格样式cell.setCellStyle(ExcelCellStyleUtil.createSimpleCellStyle(writer, (short) 12));// 填充单元格内容cell.setCellValue(fields[i]);}}
    
  7. 设置行高

    writer.setRowHeight(0, 10);
    writer.setRowHeight(1, 30);
    
  8. 设置列宽

    writer.setColumnWidth(0, 2);
    writer.setColumnWidth(1, 15);
    
  9. 设置自动列宽

    // 设置自动换行(如果指定了想要保持设定好的列宽和行高,则需要将此设置提前)
    writer.autoSizeColumnAll();
    // 设置列宽行高
    setJobLogRowHeight(writer);
    setJobLogColumnWidth(writer);
    
  10. 设置特殊单元格

    StyleSet styleSet = writer.getStyleSet();
    CellStyle cellStyle = styleSet.getCellStyle();
    // 数字保留小数 例:保留两位小数
    CellStyle cellStyleForNumber = styleSet.getCellStyleForNumber();
    cellStyleForNumber.setDataFormat((short) 2);
    // 时间格式化 例如格式为:YYYY/MM/dd 格式
    CellStyle cellStyleForDate = styleSet.getCellStyleForDate();
    // 代表的时间格式是 yyyy/MM/dd
    cellStyleForDate.setDataFormat((short) 14);
    

生成效果

在对生成Excel日志文件进行分析后分为将每天的日志分为三个大的部分:工作信息、今日复盘和明日计划,其中工作信息中包含了例如:部门、岗位、姓名等属性;今日复盘包含了本周目标信息列表、今日工作列表以及个人总结成长部分;明日计划中包含了明日工作任务。将这些整理为Java的对象,方便使用,由于篇幅有限,将代码放置在了git仓库中。

写一个单元测试,检查一下效果

@Test
void testGenerateJobLogSheet(){// 工作日志JobLog jobLog = new JobLog();// 工作信息JobInfo jobInfo = new JobInfo();jobInfo.setDepartment("创新部");jobInfo.setPost("Java开发工程师");jobInfo.setName("小赵小赵");jobInfo.setProject("XX(8)");jobLog.setJobInfo(jobInfo);// 今日复盘Replay replay = new Replay();List<Goal> goals = new ArrayList<>();for (int i = 1; i < 4; i++) {Goal goal = new Goal("今日目标" + i);goals.add(goal);}replay.setGoals(goals);List<Task> tasks = new ArrayList<>();for (int i = 1; i < 9; i++) {Task task = new Task();task.setTask("今日任务" + i);task.setCompletion(100);tasks.add(task);}replay.setTasks(tasks);Extend extend = new Extend();replay.setExtend(extend);jobLog.setReplay(replay);Plan plan = new Plan(tasks);jobLog.setPlan(plan);ExcelWriter writer = GenerateJobLog.generateSheet(LocalDate.now(), jobLog);DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");String today = LocalDate.now().format(formatter);String excelName = "日报-TDL-" + jobLog.getJobInfo().getDepartment() + "-" + jobLog.getJobInfo().getName() + "-" + today + ".xlsx";File excelFile = new File(excelName);writer.flush(excelFile);writer.close();
}

通过代码生成的日志Excel文件效果如下:
在这里插入图片描述
在这里插入图片描述

不足与改善

存在的不足还有很多,例如没有判断节假日和调休以及每日自动生成日志并提交;后期愿景就是借助ChatGPT的废话文学特色进行给定每周的目标,自动填充每日的任务复盘和明日的工作复盘或者是对目标、每日任务等进行润色,同时还可以将这些工作日报信息进行存储,通过这些日报生成周报、月报以及年度总结等。

本文首发于香菜喵,打开微信随时随地读,文章下方 ↓ ↓ ↓

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/16586.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT们接踵而至,AI会彻底改变我们的工作方式吗?

2023年开年&#xff0c;AI成为了舞台上聚光灯下的主角&#xff0c;AI 浪潮不仅让我们对人工智能的能力有了一次全新的理解&#xff0c;而且所有人的工作和生活都将受到不同程度的影响。 ChatGPT、Notion AI、New Bing、GPT-4、MidJourney v5、office copilot、Adobe Firefly、…

元宇宙“凉了”,下一个淘汰的会是低代码吗?

听说元宇宙凉了&#xff1f;如今ChatGPT有多火爆&#xff0c;上一任科技“网红”元宇宙就显得有多落寞。 2021年更名为Meta的Facebook在元宇宙投入大量投资&#xff0c;却在去年年底宣布裁员超过1.1万人&#xff1b;2月9日&#xff0c;微软解散了4个月前刚刚成立的工业元宇宙团…

chatGPT简单介绍

chatGPT是一款创新的基于人工智能的聊天机器人平台&#xff0c;旨在使人类和机器之间的交流更加自然和互动。该平台使用最先进的GPT&#xff08;预训练的转换器&#xff09;技术来生成类似于人类对用户查询的响应。chatGPT由自然语言处理&#xff08;NLP&#xff09;和人工智能…

上海海事大学自动化专业C语言课程代码参考(第十四周)

不知道大家最近有没有被ChatGPT刷屏啊&#xff0c;作为一个语言模型&#xff0c;可以调教成你的形状…啊不对&#xff0c;调教成你想让它成为的样子&#xff0c;非常好玩。我有尝试着让它帮忙写咱的C语言作业&#xff0c;效果还是很不错的&#xff0c;可以看来看看。 目录 上…

GitHub Copilot骚操作:“清洗”代码,规避侵权

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了人工智能中文站https://ai.weoknow.com 每天给大家更新可用的国内可用chatGPT资源 ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了人工智能中文站https://ai.weoknow.com 每天给大家更新可用的国…

关于推动可追溯代码来源的计划

关于推动可追溯代码来源的计划 缘由 在互联网上&#xff0c;很多技术博客和文章引入代码段来帮助读者理解技术思路或记录对某个大型模块的原理分析和理解。然而&#xff0c;由于版本管理和技术变化&#xff0c;很多历史文章在读者读到精髓时&#xff0c;发现引入的代码块没有来…

springboot+vue实现ChatGPT逐字输出打字效果

文章目录 前言一、效果二、Springboot后端1.封装请求OpenAI接口的客户端2.对话处理3.对话请求接口 二.Vue前端 前言 在调用OpenAI GPT接口时&#xff0c;如果不使用流式&#xff08;stream:true&#xff09;参数&#xff0c;接口会等待所有数据生成完成后一次返回。这个等待时…

分享收集的ChatGPT专题学习资料~

Datawhale分享 作者&#xff1a;Coggle数据科学 ChatGPT是未来的技术趋势&#xff0c;也拥有非常多的干货的分享&#xff0c;如解析ChatGPT的原理&#xff0c;或者ChatGPT使用指南。 本文将分享整理的干货学习资料&#xff0c;和最新的学习活动。领取方式见文末。 专题学习资料…

关于GPT4.0和6款AI工具

下面6个非常实用的AI工具强烈推荐给大家 1.ChatGPT: 上线两个月&#xff0c;用户数量达到1亿&#xff0c;ChatGPT不但能够写文案&#xff0c;剧本&#xff0c;企划等多种任务&#xff0c;还具有编写和调试计算机程序的能力等诸多功能&#xff0c;它具有3.5,4.0两个版本供账户使…

记录一次使用 Ubuntu 编译 Wakaama 踩坑过程

1. 背景 公司项目需要使用 LwM2M 协议&#xff0c;由于是个相对冷门的小众协议&#xff0c;客户端模拟器几乎没有&#xff0c;只有 Eclipse Wakaama 相对来说功能齐全、易用&#xff0c;但是这个软件没有编译好的程序包&#xff0c;只能从 Github 拉取源码手动编译运行。 不知道…

【人工智能】科大讯飞API接口调用(第一集)

前言 这学期有一门人工智能教育课程&#xff0c;恰巧又有这么一个实践&#xff0c;要求进行人工智能接口调用 于是首选了科大讯飞&#xff0c;下面是详细过程记录 科大讯飞接口调用 以下是流程以及实现细节描述 调用流程 第一步 来到科大讯飞开放平台 http://www.xfyun.…

14个适用于Eclipse IDE的有用(免费)插件

在线Eclipse市场上有1,667个可用的插件和解决方案&#xff01; 在您阅读本文时&#xff0c;可能还有更多。 如果您在官方市场之外冒险&#xff0c;您会发现数百种其他开发的插件都可以与Eclipse IDE兼容。 听起来像是经典的第一世界问题。 太多的插件可供选择。 您将永远不需要…

问答系统(QA)调研

引言 智能问答系统广泛用于回答人们以自然语言形式提出的问题&#xff0c;经典应用场景包括&#xff1a;智能语音交互、在线客服、知识获取、情感类聊天等。根据QA任务&#xff0c;可以将QA大致分为5大类&#xff0c;分别为&#xff1a; 文本问答&#xff08;text-based QA&am…

ChatGPT与码农的机会

之前博客中已经写了很多有关AI在博客编写方面的优势与对未来博客的编写方面的思考。这篇文档我继续分享我在开发中的一个案例和相关的感想。 事件还原 我发现ChatGPT也可以帮助我编写OData&#xff0c;于是我也利用GPT帮助我编程。 OData如何将filter与apply字段联合使用&am…

ChatGPT:竟然精通ENVI IDL、ArcGIS等软件!

目录 01 使用途径 02 使用 01 使用途径 我试了很多网站&#xff0c;包括注册登录、插件、镜像网站&#xff0c;微信机器人&#xff0c;QQ机器人&#xff0c;但是目前这些或多或少都由于OpenAI的限制无法正常使用。所以总的来说需要科学上网并且需要国外手机号&#xff0c;这有…

matplotlib——1. 常用功能汇总

文章目录 1.IDE里的1.1 显示模式&#xff08;plt.ion()和plt.ioff()&#xff09;1.2 backend说明 2. jupyter里的&#xff08;主要是和iwidgets组件结合交互式&#xff09;3 通用的3.0 根据颜色名称获取对应rgb值&#xff08;0~255&#xff09;3.1 cmap3.1.1 cmap绘制CMYK四个通…

大模型综述来了!一文带你理清全球AI巨头的大模型进化史

夕小瑶科技说 原创 作者 | 小戏&#xff0c;Python 如果自己是一个大模型的小白&#xff0c;第一眼看到 GPT、PaLm、LLaMA 这些单词的怪异组合会作何感想&#xff1f;假如再往深里入门&#xff0c;又看到 BERT、BART、RoBERTa、ELMo 这些奇奇怪怪的词一个接一个蹦出来&#x…

Maven依赖传递失效问题解决

Maven依赖传递失效问题解决 背景介绍问题描述解决方式 记一次非常规问题解决: maven依赖传递关联(传递)失效 背景介绍 首先maven工程结构大致是这样 (注意maven仓库 是本地仓库-公司中央仓库-远程仓库, 可能对理解遇到的问题原因和为何那样解决有些帮助): <groupId>com…

利用chatGPT搭配plantUML生成UML图

是不是感觉自己画uml图繁琐复杂没思路&#xff0c;画出来的uml图太简单&#xff1f;那就快来试试利用chatGPT搭配plantUML生成UML图&#xff0c;一键生成&#xff0c;自己调试解放双手&#xff0c;开拓思维&#xff0c;快来试试吧&#xff01; 在chatGPT中生成plantUML代码 如果…

谷歌发文批评苹果:实在是 “拖大家后腿”

1992 年 12 月 3 日&#xff0c;世界上第一条 SMS 消息成功发送&#xff0c;如今已经过去 30 周年。在这个关键节点&#xff0c;谷歌再度发文赞美 RCS 短信标准&#xff0c;并批评苹果迟迟不采用该标。 RCS 全称 Rich Communication Suite - 富媒体通信标准&#xff0c;属于高…