哈喽,大家好,我是长路,然后今天的话带来一个自动化 pdf 打水印的一个小项目,呃,就是这个小项目也是我自己临时去想要去做的一个很早之前就想做的,呃,然后我现在先简单说一下,呃,这一个需求说明吧, 就是我之前的话是做陌陌学的一个代理,然后,呃我的话会在我自己的一个转本群里面会发布就是所有的日练, 然后对于所有的日练的来源的话,可能就会通过呃,原本的这个学员群里面的日练,我需要把原本的 pdf 还有 word 文档去首先下载下来啊,可以看一下这边的一个时间效果啊。左边的话可以看到,呃,我把九个科目的日练,其中有有 那个 word 还有 pdf, 呃,就最终的话我是要去呃将他们全部转成 pdf, 并且将他们去修改成相对应,后面可以看到后面就是有日期,然后有对应的科目以及日练习答案, 然后最终的话,呃实际上,呃我对于 pdf 的一个编辑操作实际上是会打上相应的一个,呃广告信息,呃,可以看一下就是说这里面的一个水印效果,一个是页眉,一个是页角,还有一个是剧中的一个水印,还有一个就是右上角的一个二维码。呃, 然后其实最终的大概思路就是我想要实现的一个效果,就是说我可以把目录下面所有搜集到的,呃九门科目的一个日练,然后最终的话去更改为我想要的一个,呃,就是命名以及其中所有的 pdf 打上相应的一个水,这就是我最终的一个想要的一个结果。然后我这边大概说一下中间的一个实现思路。 呃,首先的话就是我们是首先需要知道这一个目录,可以看到这是功能实现,像我这个目录拿到这个目录之后,我们要去检索目录下的一个文件,然后去筛选出来所有的 word 文档以及 ptf 文件。然后第二步的话就是将 就。实际上其实这里面核心的就是两步,一个是呃 word 转 pdf, 另外一个操作就是对 pdf 进行编辑嘛,就打上相应的一个呃一个广告内容。 呃,然后第二步的话,我是我是会将呃这个 word 文档去转为 pdf, 并且将 word 文档去剪切到就是当前目录下的一个 team 的目录。然后最终的话,我是对所有的 pdf 文件去进行一个水印加网络的一个触, 然后最终将处理完成的 pdf 文件统一输出到 pdf 这个目录像,呃,就是说像这个录像,然后最终拿到的就是我们可以直接去呃创传到我自己的一个呃专门群的一个文件里面, 然后这个效果是是这样子。然后我这边的话说一下,呃本期视频的话,主要就是讲一下整个项目的一个呃,就是实现的一个目标需求,以及说中间的一个大致的一个实呃实现思路,还有就是使用到的一个技术站,然后最终再把效果去演示一下。 嗯,然后在做这个项目的时候,我是去调研了一下,就是目前的一个 pdf 处理工具,就是,呃比较主流的是这个 pdf box, 就是一些呃一些常用的一些项目,就包括一些 pdf 的一个 呃就是工程项,就是外部工程,很多都是用的这个,就是底层还是使用的这个 pdf box, 这是阿帕旗下的一个开源的一个项目啊,可以看到这边有一个 guitty 的一个项目,还有一个 guitarb 的一个项目, 然后我里面大概看了一下,就都是基于这个 pdf box, 然后,呃,我的话并没有直接使用这两个项目,我的话还是以 pdf box 为主。 呃。来去对来去做一些相应的一个水印,或者说编辑 pcf 的一个操作,然后其中的话用到了一个字体文件啊,就是阿里巴巴的一个普惠体。 呃,对于 word 处理工具的话,我也同样首先用 k 的,呃,首先的话就是我不知道有哪些技术我会去用那个插的 gbt, 我去搜索一下,就是 word 相关的一个开源工具,你看到有很多就是常见的有 pui, 然后 i, text 啊,这几个的话我都没有用。然后 最后是怎么看到这一个 documents for 四阶的呢?啊?我是去 b 站上去搜了一下,就找一下,就是县城有的一个 word 转 pdf 的一个案例。然后啊,在这个视频里面, 呃,我我是拿到了相应对应的一个就是有成品的一个原码,然后拿到有成品的原码之后,啊,我是直接去,呃,就首先去试用一下嘛,然后再去看一下它里面用到什么技术。呃,这种思路的话就也可以大家也可以说,呃未来自己写项目或者说一些其他的可以去借样, 就就是这是我目前的一个,呃,就是找一些就是开源的一个技术,或者说一些,呃一些想要实现功能一个途径嘛。然后确实找了这个项目之后,我自己也省了很多的时间,然后其中的话,他这个 p 就是 word 转 pdf, 用到这个都可以名词, 同样我是也是用叉的 cbd 去快速的了解一下这个 documents forgee 是什么东西啊? 然后大概的技术站,就技术站的话啊,实在是表语言的话,我是选择了 java 语言,然后 pdf 水印编辑,我们用到了一个 pdf box, 是是阿哈奇旗下的一个开源工具啊。然后 word 转 pdf 是用的 documents forging, 然后这个是时间效果。呃,我们这边可以看一下,可以看到这个 word 文件啊,以及这个 pdf 文件。哎,不能预览啊。可以看到 pdf 文件,它是里面没有,就是广告信息,以及相应的一个推广的一个信息啊, 包括包括这一个 word 文档它都是没有的。那对于这种比较就是格式不一致,我们首先要需要去 把它们区格式搞成一致,那我这边的话是选择了将 word 文档转为 pdf, 然后再对所有的 pdf 进行一个批量的一个,呃,定制的一个水印的一个处理,呃,可以看到最终的水印效果就是这样子。然后我这边的话去演示一下。 嗯,可以看到我我这个项目的话是呃,就也没有写多少,一个是 world utils, 还有一个是内, 然后具体的代码的话,我是也是同样分成这三个部分,我是分别去写了相应的一个处理,做了一个任务处理, 具体的细节我这里不再讲述,然后有感兴趣的同学可以去看一下这篇博客,到时候我会放在微信公众号上。呃,大家可以去看一下。 呃,然后讲一下目录吧, me 的话就是 me 方法的话,实际上就是,呃包含了所有的一个任务步骤, 本着简洁的效果,我这里面也没有用到日志打印,就只是普通的输出,然后相应的一个任务,我也没有去封装相应的一个类,我这边全是统一,因为本身这项目不大,我是全部统一写在了一起啊啊?除非这个 word 转 pdf, 我是呃搞成了一个工具类, 然后可以看一下 resources 目录下的 images, 可以看到这是有一个这个推广的一个信息啊,这个我就,呃,我就不在视频里放出来,然后下面的话是一个 ttf 的一个字体格上, 这个字体格式是我们再去进行编辑 pdf 的时候,我们是需要去自自己去加载一个文件的,也可以不加载,但是我这边的话是去自己加载了一下这个阿里巴巴 土灰体,然后再去进行一个页眉页角以及呃一个水印,四十五度,还要包括一个图片水印。 然后这个是呃整个目录,整个项目功能目录的一个介绍,然后接下来的话看一下其中的一个效果。呃,我们是以这个目录为主啊,如果说你拿到了,拿到这个元代码,我们这个项目是 melon 项目,你用 id 打开之后,我们这边是去 import, 就是把依赖全部导进来之后,我们首先第一步要做的事情就是就是什么呢?就是我们要将这一个就是一个,这是一个,那个就是公,呃,就是那个处理目录吧, 可以看到我们把就是所有的文件放到这个目录下面,嗯,然后去找到这个目录文件, 然后去把这个替换一下,只需要动这一个就可以了。如果说你想要去修改就是你自己的一个二维码,你可以把这个图片给更换掉,然后名字的话一致就可以了。啊。还有中间的这个 就是一个推广的一个那个页眉页角以及中间的水印信息,你也可以去相应的进行一个修改,相应的去进行一个修改。 呃,其实我这边的话主要动的就只是一个,就是处理的一个文件目录,这样的话我们就可以开始测试一下就是这个项目。呃, 是否是能够处理成功呢?我们这边运行可以看一下这边的话会去进行一个处理, 首先的话我们会把就 使这个目录下的这个 word 文档全部去转成 pdf 到当前目录下,然后会将对应的 word 文档去全部,呃,全部剪切到 tamp tmp 目录下面,然后现在就是做的这一个步骤, 这相对比较慢一些。嗯,然后还有最后一个, 好,可以看到最后一个处理完成之后,我们会对剩下来的所有就是九个文件啊,九个文件去进行一个处理,并且一个重命名,然后最终的话我会去全部打印成这样子效果。呃,可以看一下中间的这个 pdf 效果, 相应的一个我想要实现的一个项目全都已经达到了, 好,呃,然后最终的话我就会把这个拿到了,这一个就是,呃定制的这一个那个水印的一个 pdf 去上传到我自己的一个全文件, 然后最终的话会去上到这个目录里面一个去上传。这个的话最终呢就是给我自己的话节省时间应该节省了五六分钟吧,正常的话我是去自己手动去打水印, 可能需要也要六七分钟,但通过程序运行的话可能一分钟不到吧,一分钟,一分钟左右就可以帮我去处理好,主要是 word 转 pdf 这个比较耗时间一点,这个我后面会想办法看看有没有优化的一个空间,然后对于 pdf 打水印或者说广告的一些信息,他处理 还是很快的。呃,然后这个项目的话,主要是解放了自己去打这个 pdf 的一个项目,然后这个这个项目的话就录制到这边大概的一个功能, 谢谢各位观看。然后有需要获取原码的,就是这个项目原码的以及这个文档的,可以看一下,就是评论区或者说这个视频下面的一个简介,然后去获取。今天就讲到这里。
粉丝260获赞3108

哈喽,大家好,我是长路,然后现在的话录制一下就是,呃,就是这一个实现自动化 pdf 打水印的一个小项目,呃,大致的一个功能的一个代码实现, 我们这边的话之前的话已经看过相对应的一个效果,然后这里的话去从这个,呃这个时间时间效果,然后详细功能介绍以及对应的一个详细代码的一个实现进行一个说明。 首先的话实际效果就是说我这边有一个呃文件,就是有多个 word 以及 pdf 的文件, 然后通过这个程序的运行,然后最终会去输出相应的一个就是我想要重进名的一个 pdf, 呃,就是九门科目的一个 pdf, 然后以及会将 tf 进行一个水印的一个处理,然后这个下面是代码的一个运行效果,然后看一下详细功能的一个介绍。呃,第一个部分的话就是,呃我们这边会给定一个目录,然后也就是上面的这个目录, 呃,可以,这里可以举例一下,这里是有九份九个资料,挪动后的话, 好,我们是在这个部分原本的删掉, 就是首先我们会将多个文件放入到一个目录下,然后我们第一步步骤就是 检索目录下的所有的文件,然后筛选出里面的所有的一个 word 文档以及 pdf 的一个文件,我们只是存他的一个那个文件名 完整的一个文件。然后接着呃我们就依次看一下代码吧, 我们这里的话就直接看这个 mate mate 方法。呃,从这个任务一 开始看任务一的话,其实并没有和呃之前的什么 demo, 就是用到的一些第三方框架有关,在这个任务一中,我们是通过直接去便利和拿到所有的一个文件无录, 然后去根据首先去判断他是不是一个文件目录,如果说不是文件目录的话,我们再去根据他的这个后缀文件名 就是呃类型,然后去判定是 word 文档还是 pdf 文档。如果说是 word 的话,我们统一放在这个 wait walk box 这个 list 集合里面,然后对,如果说是 pdf 文档,我们就去放入到 这个 work pdf 这个集合里面,那这样的话我们是把任务一就去完成了。然后第二个呃任务二的话,就是说我们要将 dock 呃 都是文件,就是 word 文件去转为 pdf, 并且将将 word 文 word 文件统一去剪切放入到 team 目录。好,我们看一下这一段代码, 首先的话我们这边会打印一个开始执行 word 转 pdf 任务啊,接着的话我们这边是呃去构造了一个就是临时的一个文件目录,就是这个 team, 这个的话我是这边提前订好的 team, 那这样的话我们最终的一个临时的目录就是 临时的目录,就是这个日练,然后再加上这个 t 本目录。呃,首先第一个操作就是说如果说这个文件目录不存在,那我们去创建这个文件目录吧,然后这个是这个代码,接着的话我们去遍地所有的一个呃多斯文件, 这里的话我们通过刚刚的一个收集的一个集合,然后去进行一个便利,呃,然后每拿到一个一个呃 word 文件,那我们进行一个拼接 啊,实际上这里面的话就拿到了一个原文件目录啊,最终的话这是一个全路径的一个,就是一个绝对路径的一个 word 的一个文件路径啊,接着的话他就得 pass, 也就是我们最终的最终转换输出的一个文件目录位置。 实际上我们首先会把 word 转成 pdf, 呃,同样会会最终会输出在当前的这个目录当中, 也就是说我们这个化工类日练点 d o c x 会转成化工类日练 pdf, 然后最终的话会放在当前的这个目录中,呃,拿到了这个原目录以及目标输出了一个路径之后,我们这边就是使用我们之前案例中的 这个 word users, 这样的话我们就直接把我们的一个 door 呃 word 文件去转回了一个 pdf 文件,那实际实际上那那这样的话我们这个功能就完成了, 然后为了,就是为了将原本的一个网店进行一个保存,我们同时这边再去构造了一下那个目标的一个临时路径,也就是,呃,这样是基于这个 team 目录下的,这个的话应该我们在这里的话定义了,也就是这个 我们会同时存放在日练下面的一个 team 文件夹里,就会把所有的 word 文档去呃,去通过这个木木的话就是剪签嘛,就是移动到指定的 team 目录下,呃,我们可以看一下效果。 呃,我们现在目前讲到的是任务块,然后的话,然后的话同时我们会将处理完成的, 就比如说我,因为我之前的话 pdf 只是收集了就是后缀为点 pdf 的,那对于点 do sex 的这些文件名,我其实还没有收集到这个维德沃克 pdfs 这个集合中,所以的话我们这边会将就是已经已经 word 转 pdf 之后的一个那个文件名称, 然后去放置到这个,呃, we'd work pdfs 这个结合中, 那这个的话就是我们的一个,呃,具体的就是说 word 文件去转成 pdf 文件的一个,以及说将这个 word 文件去同一进行到替补目录的一个过程。然后这边的话可以去尝试点 bug 一下啊。首先的话这是我们的一个文件目录, 然后我们这边去进行一个叠 bug, 我们在任务一啊,任务二这边去打上了一个断点,不是这个我们应该运行的是这个 mate 方法。 ok 啊,这个的话等会再做解释。这些的话就先不要求我们首先的话到任务一,任务一可以看到我们其实当前的目标是有九个稳定的,对于,呃那个 d o c x 是有四个,然后 p d f 的话是有五个, 那我们继续往下过。任务二啊,我们这边去打一个断点,呃,如果说我们的这个断点直接到这边了,那此时就说明那我们的这个 word 转 pdm 都已经完成了,并且 啊这个 word 文件都会去移动到我们的当前我想的 t 本目录下,然后,然后,然后在这个 we to work pdfs 这个集合中实际上是包含有就是刚刚添加的这一个就是转换的一个,那个 转换的一个 ptf 的一个名称都会填充到这个位特沃克 ptfs 里面,那到时候的话就应该就是九个。我们这边去直接就放行, 这边放行的话是正在进行处理,那断电呢?这边的话就可以看到,我们就来看一下有没有问题。 好,第一个已经转化成功了,我们可以看一下这个目录的一个变化,可以看到出现了一个 team 目录,然后 word 文件,他说如果说转化完成之后会去存放到 team 下, 可以看到这个财经这个 word 文档是等会他还是会去看,他会保存到,就是输出到当前目录下,就转成 pdf 放到当前目录下,然后再将这个 word 文件去移动到这个 team 目录中, 好,可以看到当前目录中已经没有 word 文件了,然后那些文件的话就目前的话是全部存放在这个, 嘿,打不开了, 这,这电脑有点问题啊,电脑有点问题。 好,进去了可以看到这就是我们刚刚看到的这个,这是四个文件,我们去存放在这里,然后,呃,我们这个时候可以看到就是, 呃,对于这个 pdf 集合里面实际上是存放了九个这个文件名,那么这个九个应该就是当前这个录像里面的。 然后此时的话我们就开始做一下任务三,任务三的话实际上就是对所有的 pdf 文件进行一个水印加广告的一个处理,然后其实之前的一个 demo 案例, 呃,六个呆萌案例其实是有,呃,讲到了,就是说如果添加一个页眉,或者说添加一个页角,然后还有中间的一个水印,或者说是右上角一个图片,都都是有,都是有用到的,都是有讲解过的。然后我这边的话统一放在任务 啊去做,最终,呃处理完的一个 pdf 统一会输入到 pdf 目录中,呃,其中有一个小细节就是说,呃,可以看到我们一开始拿到了这个文件都是 都是什么,都是不是很规整的什么二点五化工类日练,然后直接医护什么什么的,但是他们里面有一个,呃,就是都会有文件的一个标识,那个名称,比如说化工类日练,他这个就是属于化工医护,人体那里面有个医护, 呃,我们的需求是需要去进行一个统一输出啊,就比如说我们的科目是高数,那最终输出的应该是二零二四点二点十五高数日练习。答案只是每个日期以及到科目时有一个更换的,其他是不换的。那所以对于这个我们如何去处理?呃,可以看到我们这边 去定了一个集合,这个集合的话我这边做了一个小技巧,就是说我们对这个集合进行一个初始化,就是一个括号里面再来一个括号,然后我们可以去做一个初始化的一个代码,呃,看一下这个具体的代码, 如果,呃这边的话实际上就是一个 map, map 里面有个 t t 的话就是我们的科目名称高数,然后 wel 就是我们最终要应该转化为的一个, 那个我建明吧,就比如说,就比如说我这是高数去最终岗位二零二四点二点十五高速的列机答案,我这边去定了一个 dayt stream, 呃,呃,不对,这边点一个 format stream, 可以看到这边是这个的话,我们是获取到今天最新的一个日期,然后再去加上一个百分 s 占位符,再加上一个日点地摊点 pdf, 然后通过这样的形式去填入下面的一个科目。呃,那你应该想到了 之后我会做什么样的处理啊?就是说我会去便利我们,呃需要去工作的 pdfs 集合啊, 便利这个集合。然后呃在我们就是首先的话我们会去拿到一个原文件目录嘛,这个原文件路径的话我们其实可以看一下, 呃这个路径的话实际上就是做了一下拼接嘛,首先就是我们指定的这个目录这个日列,然后其次的话就是这个文件名称拼一下,我们就可以拿到一个,就是, 呃就是一个原文件末路的一个路径。然后接着下面这一段就是我们要由于我们的名称也是需要去进行一个更换的,那所以的话我们这边实际上做了一个小的一个转换,这个转换是什么呢?就是说我,呃我实际上是去便利了一遍 map 集合, map 集合 在便利的过程中我会去拿到这个 map 的一个 key, 然后我接着我是通过判断这个 origin name 里面是否有我们的这个科目,就比如说我这个医学医护、人体解剖学综合复习,如果说中间包含医护,那我们就直接拿到相应的一个名称了。 呃,可以看一下是这个 stick, 可以看到比如说一户,我们这边就直接拿到一个完整的一个名称,然后返回拿到,嗯,这边可以去测试一下,可以看到这边就拿到了用户日练习单,然后去做一个拼接就可以了。 然后至此的话我们实际上就啊至此的话我们就呃对于就是重命名部分我们就已经做完了,这工作就已经做完了,就是呃文件名的一个处理就做完了, 然后核心的就是其中的一个水印加上一个广告的一个处理,这个话我是去放了一个方法 work, 呃,是在这个方法里面去做一个处理,我们这边简单看一下实际上页眉页角,然后中间的居中水印以及右上角的图片,我在前面六个 demo 里面已经讲过了, 这里面就快速的待待看一下。首先的话同样我们去将指定的一个文件目录,就是我们指定的这个 pdf, 这里面的话就不是 input 了,这里面的话是根据这个 orange pdf, 就是原始的这一个目录镜 将这个去导入进来,导入到这个导入得到一个 pd 都很满的实体内,然后接着的话我们去导入相应的一个字体,导入字体之后我们设置一个透明度的一个状态对象,就是我们之前水印的一个百分之二十的一个那个透明度状态对象。 好,接着的话定义一下我们的一个页眉页角以及中间的一个水印的一个内容。然后我们这里的话是用到了 demo 二里面的一个飞页的一个,就是一个 pdf, 那里面的一个飞页的一个处理, 就是会去对美业进行先添加页眉页角,然后水印以及一个图片水印的一个一个文字水印,还有一个图片插入图片的一个效果。这边我们也快速再看一下,其实跟之前耐磨机都是一模一样的,我只是去进行了一个拆开,呃,去把它进行了一个拆开, 其实就是之前的几个 demo 合在一起,呃,可以看到首先是以计算页媒的一个居居中位置,同样跟之前一样是根据这一段文本的一个宽度,然后再根据一个页面的一个宽度,然后去做了一个处理, 呃,然后去进行个绘制内容,这是页眉的一个绘制内容,那对于中间的话,呃,不懂的小伙伴可以看一下之前的一个,呃,应该是 demo 四,不知道 demo 五吧?哦,好像是 demo 三,页眉页角是 demo 三,页眉页角是 demo 三,两个都相同的,然后水印的话是 demo 四, 然后最后一个图片是呆萌五,这这几个都是一模一样的,只不过统一放在每一页的循环当中放在了一起,这样的话我们就构成了一个就是字体里的一个页面页角,然后中间的水印以及右上角的一个推广的二维码, 然后最终的话我们同样去,呃,会去利用这个 p d document 给它去进行一个保存。这这几个我就不再去重复说了,因为代码都是一样的。跟 demo 我就是从这个项目里面去拆,拆成多个 demo, 然后去讲。这段话就不说了,不说了。 呃,大家可以自己自行看一下。然后最后的话,我们通过这个 pd 刀口纹的去进行一个 sale 保存嘛。这 output few 同样, 呃,是我们这个调用 walk 方法传进来的,就是我们提前已经换好的这个,它这个 p d l pass 就是最终的这个,呃,输出的一个文件目录镜, 嗯,然后这里面的话我们实际上是有多个 pdf 的,所以我们这边同样也做一个佛循环,去进行一个 work, 执行水印和广告的一个任务就可以了。然后我们这边的话集体就放心吧。 好,这里这转换是比较快的,这个这个处理是比较快的,然后我们最终看一下 的效果吧, 可以看到水印,然后页眉页角以及右上面的一个推广。好, 然后这个小项目的话具体代码的一个讲解就讲到这里,然后如果说有同样感兴趣的小伙伴,我想自己去尝试实现一下,可以去把我的一个代码去下下来,然后我的 整期视频的一个代码及文档我会放在评论区以及呃视频的一个首页简介, 然后同学有需要的可以去去去获取一下。然后今天的话,呃就是自动化 pdf 打水印小项目的一个具体代码的一个思路及实现,就讲到这里。然后十分感谢大家的一个观看,我们下期再见。

看一个需求,要求对上传图片生成缩略图,或者对图片格式进行转码,添加水印,这个需求该如何实现呢?对于图片的加工,前后端都可以实现。今天给大家分享一个开源的加沃缩略图生成库 the military, the military 是一个加沃的缩略图生成库, 他只是一个假文件,不依赖于外部库,便于咱们的开发和部署。并且呢他支持图片的缩放,区域裁剪,水印还有旋转等。 接下来呢,咱们看一眼代码视力。首先引入相关依赖,这里我用的是最新版本,通过几个方法了解一下它的使用过程。创建缩略图, 将一点 gpg 调整大小后保存到二点 gpg。 创建带有旋转和水印的数列图,将一点 gpg 顺时针旋转九十度,添加水印,保存 到三点 gpg 中。转换图片格式,将一点 gpg 转成 png 格式。最后呢是按比例缩放图片,我本地准备了一张图片,接下来呢,咱们执行一下,看一眼效果,可以看到图片旋转了九十度, 并且呢添加了水印,使用起来还是比较简单的。最后小伙伴们还有什么更好的办法吗?评论区讨论一下。

今天给大家推荐一个可以动态生成 word 文档的方法,比如说我们的业务如果需要根据用户的数据来生成付款通知书的话,比如说这种我们的数据是可以动态生成的, 嗯,还有就是我们的个人简历,我们只要填好数据之后, 无论我们怎么更换模板,比如说更换成其他模板,我们的数据都可以动态的生成到上面, 无论模板怎么换,我们的数据都可以生产到上面,非常的实用,非常的方便。 哈喽,大家好,今天我们继续来讲 java 动态生成 word 文档 使用那个 potal 模板引擎的使用方法。嗯,上一次视频我们讲了引入和简单的使用,这次我们来详细的介绍一下, 嗯,淘汰模板引擎,今天我们来讲他的标签,嗯,就是模板淘汰模板引擎生成,动态生成的数据就是通过标签来实现的,这次我们现在介绍文本标签, 然后下一个视频我会来介绍图片标签,大家可以看图片标签,就是在这个文本标签的基础上加前面加一个 i, 然后后续的表格标签就是加一个井号,这个文本标签就是前面没有,就是两个花括号包起来。 然后呢我们现在看一下这个模板,动态模板已经都能干些什么?比如说在我们的项目中, 如果需要动态生成一张用户的付款单,我们可以这么来实现,就是这些地方 我们都可以换成表格,我们都可以换成标签,然后来动态生成, 这是我们的个人简历,我们可以设计好自己的模板,然后这些地方换成标签,我们就可以动态来更新我们的模板,我们的那个个人简历,然后还有这种 生成一个奖状,这都是标签,我们通过传输这些数据来动态生成一个标签 来简单看一下, 然后我把这个结构更新了一下,就是 mapper 层、 service 层和 controller 层,这样大家看起来可能更明了一些。 那首先我们来到 service, 我们把把业务放在 service 上面, 然后还是跟上一个视频一样,这是我们使用的模板。今天我们用这个来介绍一下文本的所有标签, 然后我们来看第一个标签,第一个就是 简单的一个四个串的一个标签,文本类型没有任何格式,然后呢第二个就是可以设置格式的一个文本标签。 然后第三个就是超链接的完美标签,然后第这个也是超,就是 ol 可以放你的链接,也可以放他要跳转的地方,比如说跳转到最底或者最下。 我们来看一下,看一下这个的结构吧, 我看一下他的结构可以传两个参数,一个是颜色,一个是文本,这是一个简比较简单的一个使用方法, 只改变这个文本的颜色。还有一个就是传文本,然后传样式这个两种。然后我们先给大家演示一下最终的生成效果, 执行成果, 这就是一个最终生成的效果,这个图片标签会在下一期视频讲到,这个是 来一一对照,这个是一个最普通的一个文本标签,在这个地方,然后这个地方是一个 更改过个颜色的一个标签,这个然后第三个个人属于这个是一个可以跳转的 uil, 我们点击看他跳转, 跳到了我的一个个人主页,然后第四个就是我们放到这个地方,点击就回到最顶端, 就相当于放了一个,这个可以自动跳转,不是自动跳转,就是跳到指定的位置,就是锚点。 然后这个样式我们刚才看了,还有第二种,就是传一个这个属性,我们来看一下,可以跳转进来看一下,我这里已经整理出来了。 嗯,我们这个样式可以调整的有,嗯,删除线,粗体鞋体颜色、下滑线,字体字号、背景、高亮色,上标下标,间隔, 然后我们随便找一个试一下,就这个删除线能给粘过去。 然后使用方法就是我们要先用一个这个对象 style 对象,然后我们看一下这个对象呢?来自这个包,这也是我们引入的这个包里面的一个对象 啊,这是先设置的一个颜色,然后呢再 对,不行,但是 book 类型的不需要加双引号。然后我们这个格式设置完了,我们怎么来用? 我们还是看这里,看他的结构,前面是文本,后面是放格式,我给这改一下就可以了,文本放在前面,然后后面 把我们这个对象传进去啊,就这个样子就可以了。然后我们再来生成一下,生成的时候要先把这个文件关掉,要不然他旅游会打不开的。 嗯,没有问题,我们再打开看 看一下 这个,这个格式就已经更新上了。然后我们看 第二种,就是他还提供了一种练练式编程的一一个思路, 把这个关一下,其实这个和第一种生成的效果是一样的, 只不过我们编程的方法不一样,这是一个链式编程,看起来更能更加简洁吧。嗯,然后, 哦,这些跟上面都一样,只不过这个不用拗对象,我们直接用念式来表达。这个地方也是 一定要传一个对象,我们来上传一下, 看一下效果, 我们看这里,这个地方没有显示,我们看一下是怎么回事?打开 模板,我们看一下它的原模板,这个我有个 t a s k 啊,它不显示,一定是标签名错误,看这里标签名写错了, 这回应该没有问题了,我们再次执行一次, 没问题。好,我们再打开看一下。嗯,这回出来了,所以说如果大家碰到不显示数据的情况的话, 首先就看你的标签是不是没有对应上,然后就是数据是不是符合,有没有传过来,因为年月日没有传过来,然后上面都掉了。 嗯,然后本次大概就是这些内容,然后图片标签的话我会尽快的更新,然后谢谢大家。 欢迎大家一键三连,再见。

p o i 搜索二八七 p o i 五点二版本复制粘贴搜索相关照包 五点二版本复制粘贴导入新建类 exct test 问方法试卷 url workbook workbook 等于六一个叉 s s f workbook shit 写的等于 work book 点 credit 写的人员名单 real 呃等于卸载点归的路你 六点 credit set 复制姓名复制粘贴一二性别 name 复制 粘贴一 张三拿二十二,生产第二个工作部 乘法表复循环二等于一,二下 于等于九,爱娇娇负循环接等于一接,小于等于二接娇娇 入生产行 shit 点 greater 二选一,给每行每个复制 爱乘接等于爱乘接乘法表 解解一,文件输出流 url 进行文件的输出。牛关闭抛出异常, 查看文件路径,复制粘贴修改需要生成的文件 运行,查看文件,文件已生成。

新建类 excel test 啊,正在慢发法试卷 ur 文件输入类, you are work book work book 等于六一个叉 s f work book 文件输入类 获取 shit shit 等于 workbook。 点 get the shit, 你 获取 shit 的总函数,空着来输出总函数。 run number 复式化爱等于零,爱小于 run number 爱渣渣 run 等于 卸载。点 get around i 列总是获取 空着来输出打印,你也输 负有循环接等于零接小于 set number 接加加 ctrl 输出打印。获取单元 开台词这些图词句 抛出异常 io 异常复制路径粘贴,查看文件运行, 一些 添加空格运行 修改设获取的工作表页运行 注册,重新获取 shit。 按照名称获取 乘法表运线 修改人员名单运行。

接下来呢,咱们继续来看咱们这个 p u i 入门案例啊,刚才呢,咱们是完成了一个写操作,对吧?也就是说啊,通过我们这个 p u i 呢,可以创建一个新的 excel 文件,并且呢可以像这个文件里面来写入一些文件的内容。 好,那接下来呢,咱们来做一个读操作的案例啊,也就是说我们可以从一个已有的 excel 文件当中啊来读取相应的内容, 比如说呢,我们就来读取我们刚才写入的这个文件,哎,也就是我们 d 盘下边这个 infor 这个 excel 文件, 那么我们可以看到在这个文件里边是不是有这么一个 shit 页啊,然后在这个 shit 页里边呢,是不是有这么一些文字啊?那现在呢,我就希望啊,通过我们这个 pui, 从这个文件里面呢把这些文本内容给它读取出来。好,那具体应该怎么写呢?咱们来看一下,那么我 我们把刚才这个呢就给关闭上了,咱们呢来写一个新的方法,这个呢就叫 red, 是不是就可以,然后呢我们 public steady, 然后呢这个还是没有返回值,就叫 red 吧,这个就是读取,对吧?同样呢这个地方来抛一个异常, 然后呢我们在这儿来加一个注释吧,这个呢就是通过我们这个 p u i 是不是来读取什么呢?读取我们这个 excel 文件啊, excel 文件中的内容。 那首先第一步呢,我们需要先来获取这个 excel 文件,那么我们刚才看到他是不是有这么一个对象啊?叫做叉 ssf, 我可不可,对吧,他代表的是不是就是一个 excel 文件这么一个对象啊? 好,那现在呢,我就需要啊,把这个对象啊创建出来, new 一个叉 s s 我个 book, 然后呢我们来接收一下,然后这样呢改个名就叫 ex 加我吧,但是大家注意啊,我们这个地方,你看我如果没有传参数的话呢,它是不是代表的是在内存里面创建一个新的对象啊? 那现在呢,我是不是要读取一个已有的一个 excel 文件啊,并且封装成这个对象,所以这个时候呢,我就不能再钓这个午餐的这个构造方法了,那么我们应该钓哪个呢?咱们来看一下, 在这里边呢,其实有多个重载的构造方法,那么你看下边这个地方呢,它是不是可以传一个 input stream 哎,也就是一个输入流进来啊,也就是我们通过这个输入流啊,就可以读取一个磁盘上的文件, 然后呢传给他,这样的话呢就可以封装一个新的 excel 文件这么一个对象进来,所以我们这个地方呢,就需要通过一个输入流对象来读取我们磁盘上的这个文件,并且传给我们这个方法。好,那接下来呢,我们就需要来 new 一个 什么呢?叫做 file input stream 吧,这是不是一个输入流对象啊?通过他呢来读取我们已有的一个 excel 文件,那我这个已有的 excel 文件在哪呢?我是不是需要你有一个 file 对象来指定我们这个文件的磁盘地址啊? 咱们是不是就在 d 盘下边叫 inford 叉 slx, 对吧?这是不是就是我们这个文件啊?大家可以看到就是我们 d 盘下边这个文件,所以说呢,这个路径啊,不要写错了,然后呢我们就直接把这个对象放进去就可以了,做一个参数传进去, 好把这行去掉。那你看这其实就是什么呢?这就是读取磁盘上已经存在的这个 excel 文件,然后呢把它封装成我们这个 p u i 当中的这么一个 excel, 这么一个文件对象,好,那么 这样的话就读取到它了,对吧?那么读取到了之后,我现在需要干什么事情啊?咱们是不是需要把它这个文件里边的文本内容给它读出来啊? 好,那么我们可以看到这个文件里面是不是只有这么一个 seat 页,叫引法,对吧?所以说呢,我们下一步应该做什么事情啊?是不是应该就是读取什么呢?读取我们这个 excel 文件中的第一个这个 seat 页呀? 哎, shit 叶,好,那么怎么读取呢?哎,实际上我们就可以调我们这个对象的这个叫做 get sheet, 这是不是有这么两个方法啊?一个是 get sheet at, 其实就是根据下标来获取, 那么比如说我传个零零呢,代表的就是第一个 shit 页,然后下边这个地方呢?你看还有个 get shit, 然后这个地方呢,传一个 name 进去,这其实就是根据这个 shit 页的名字 来获取这个 set 页,实际上呢都是可以的,这都没有问题。比如说呢,我们调上面这个 get set at 零,这个代表的就是第一个 set 页,好,那么我们就获得了这么一个 set 对象, 哎,你看是不是还是这个叉 ss f shit, 对吧?那么就是我们这个 shit 页这个对象,那么读到它之后呢,我是不是就可以读取我们这个 shit 页当中的某一行啊,对不对?然后呢每一行上面是不是又有各种各样的单元格呀? 而我们这些文字呢,是不是就在单元格里边?所以我们下一步应该做什么事情啊?是不是就需要读取某一行,并且呢我们可以看到咱们这些行的话呢,是连续的,对吧?那么我并不知道这里边具体他写了有多少行, 所以说呢,我们并不知道需要读取多少次,对不对?那这个地方我们应该怎么做呀?这个地方呢,我们其实可以获取什么呢? 最后一行,也就是有文字的这些行,他的这个行号,那么怎么获得呢?咱们呢就可以通过这种方式啊,叫做 shit 点 get 什么呢? last 肉 number, 哎,你看这个名字啊,非常直观啊,获取一个最后的行号, 注意这个最后行号啊,并不是我们这个表格文件最后的这个,而是什么呢?是有文字的最后一行这个行号,那么实际上呢,获得的就是这行, 那么这个呢,就是获得我们这个最后一行行号,这是获取我们这个 sheet 页中啊, sheet 页中最后一行的这个行号, 当然这个行号呢,大家要注意啊,他还是从零开始的,实际上跟我们这个地方看到的这个地方,你看我们这个文件这个地方最后一行是不是四啊?第四行是最后一行, 但是呢,我们通过代码的方式获取出来之后呢,他这行的行号是什么呢?是三,对吧?哎,因为他这个行号啊,是从零开始,所以说呢,我们这个地方呢,总是差了一个,这一点呢,大家需要注意一下,这是获得最后一行的行号,然后呢,我是不是就可以从第一行开始,一行一行来便利啊? 所以说呢,我们在这个地方呢,就可以来写一个 for 循环,那么我们在这呢来写一个 for 循环,然后这个 i 等于几呢? 大家来看啊,我们真正这个文字啊,是不是从第二行开始才有啊?对吧?那么如果你读取上面这两个呢,它其实都是空的,对不对?没有意义啊?所以说呢,我们从第二行开始来读就可以了, 而第二行它对应的这个下标应该是几啊?什么应该是一啊?哎,所以说这个地方呢,我们需要自己来转换一下,也就是这个 i 呢,让 它等于一就可以,然后呢, i 小于等于等于多少呢?是不是就等于我们这个行号就可以了,对吧?那么也就是从第一行开始读,一直读到我们这个 las 的肉 number, 这一行 怎么获得每一行呢?那么我们就可以调用我们这个 seat 点儿什么呢? get 肉,哎,你看我是不是要传一个肉 number 进去,而这个地方这个肉 number 呢,是不是就是 i 啊?这个呢,其实就是获得我们某一行, 这是获得某一行,那这样的话呢,我是不是就能获得这么一个 row 对象啊?对吧?这就是一个行对象。 然后呢,我们获得某一行之后呢,我们真正这个文字是在某一行的某个单元格里边,对不对?那比如说我当前获得到了这行,那这一行上面他具体哪一个单元格里面有文字呢?是不是应该 是第二个单元格,还有第三个单元格啊,所以这个地方呢,我是不是就需要来获得我们某一行上面的这两个单元格啊?第二个跟第三个,所以接下来呢,我们再来写一下,这就是获得我们这个单元格,对不对?单元格对象 好,那么获得单元格呢?我们是不是就可以调这个肉的?什么方法?哎,你看它这个就叫 gets, 然后呢我们要获得第二个单元格,那么第二个单元格的下标应该是几? 哎,注意他是不是还是从零开始,所以我们要获得第二个单元格呢,你要传个一进去就可以了。好,这样的话我其实就获得了第二个单元格, 然后呢我们现在呢就不接受了啊,就直接再来调用他的一个方法,就是获得这个单元格,他的文本内容怎么获得呢?叫做 get swing sell value, 实际上就是把我们这个单元格里面这个文字以死俊字符 串的方式给我们返回。好,那么我们在这呢直接来接收一下,你看这是 sale value, 然后呢我们在这呢给它加上一个一,哎,因为呢我们还要再获得第二个,所以我们在这个地方再来获得一个 get sale, 然后呢传个二进去,这样是不是获得的就是第三个单元格,然后呢我们获得这个第三个单元格当中的文本内容。好,然后呢这个地方给他改成二,那接下来呢,我们是不是把这个单元格的内容啊,给他打印一下就可以了,咱们直接在这儿 say, 他们点 out, 然后呢在这来输出一下, 这是不是就是 sale value? 一,然后呢我们中间呢给它隔开一点啊,然后呢再加上这个 sale value 二是不是就可以?哎,你看,我们其实就是通过这个放循环,把咱们这个表格里边的这些文本内容啊,是不是都给它便利出来,并且输出在我们这个控制台。好,那么输出完之后呢, 最后别忘了干什么呢?是不是应该关闭资源呢?关闭资源也就是我们这个 excel 点儿 close, 这样是不是就给关闭上了? 当然我们这个上面是不是还有个输入流啊?这个输入流是不是也需要关闭啊?那所以说我们这个地方呢,就需要给他来接受一下,要不然的话呢,是不是没法关闭了就好,那么我们在这来接受一下, 那么这个呢,就是我们这个输入流对象,呃,也就是我们这个 input stream 嘛,就叫 in 吧。 好,然后呢把这个地方给它传进去,那么在这呢,咱们是不是就需要把这个输入流给关闭上啊?所以在这来印点 codes, 好,那么把这个输入流也关闭一下,那接下来呢,我们是不是就需要来测试一下这个方法?注意这个并不是一个单元测试方法,对吧?那么我们在这是写了个闷方法,所以呢,我们在这个地方呢,直接调用这个 read 方法,这样来测试。 呃,上面这个 red 方法呢,我们暂时呢给他注视起来,咱们呢只调这个 red, 就是我们刚才写的这个读取的这个方法就可以了。好,那么我们直接来运行一下,看看我们这个空着台的输出。 哎,大家看啊,这是不是就已经输出了?你看什么姓名,城市,还有张三,北京、李四、南京,是不是分别对应的就是我们这个地方这个文字啊?对吧?那也就是说他确实是从这个文件里边把我们这个文本内容啊读取出来了,并且呢我们在这个地方是不是输出了一下? 好,这就是我们这个读操作的这个入门案例啊,也就是说我们通过这个 p u i 呢,就可以从一个已有的 excel 文件当中啊来读取文件内容。好,那么关于这个入门案例呢,我们就先说到这。

接下来来看一下咱们今天课程的第二个章节,第二个章节呢,咱们要讲的就是这个阿帕奇 pui, 那么我们通过这个 p o i 主要是能做什么事情呢?哎,咱们通过 p o i 呢,主要呢就是在咱们的扎瓦程序当中来操作 excel 文件,当然具体怎么操作呢,咱们后边都会展开来说。 那接下来呢,咱们先简单来介绍一下,在我们这个章节当中,我们呢会通过下边这两个部分来讲。首先第一部分呢,咱们呢先对阿帕奇 pui 这个小的技术啊做一个简单的介绍。 然后第二部分呢,咱们会通过一个入门案例的方式来具体学习一下这个技术它的使用方法。好,那接下来呢,咱们先来看第一部分啊,咱们先对这个阿帕奇 p o i 来做一个简单的介绍,你看啊,阿帕奇 p o i 呢是一个处理 microsoft soft, 哎, microsoft 是不是就是微软呢?对吧?那么微软的这个 office 办公软件,各种文档格式的这么一个开源项目, 那简单来说就是什么呢?哎,就是我们可以通过 pui 这个技术,在咱们的 java 程序当中来操作微软的这些文档,比如说我们常见的 word 文档啊,还有 powerpoint 呀,还有 excel 文档等等。 那具体怎么操作呢?其实主要就是这么两个方面啊,一个呢就是读,还一个呢就是写, 比如说我现在呢有一个 word 文件,那现在呢,我希望把这个文件里边所有的文字给他读出来,那这个时候呢,我就可以通过 p u i 来完成。 虽然说这个 p o i 呢,它可以操作微软的这些不同格式的文件,但是在绝大部分场景下边,咱们使用 p o i 呢,主要就是来操作 excel 文件的,那么同样呢,咱们 操作 excel 文件呢,主要呢也是读写操作,比如说你看我们这是不是有个 java 程序啊,然后这边呢有一个 excel 文件,那现在呢,我希望从这个 excel 文件里面来读取它这个文件的内容,咱们呢通过 p u i 就可以做到,哎,你看可以读,对吧? 同时呢,我还可以通过我们这个 p o i 啊,像我们这个 excel 文件里面来写入内容,哎,你看这个就是写,所以说呢,我们使用 p o i 来操作咱们这个 excel 文件呢,主要就是这么两个啊,一个是读,一个是写。 那么说到这呢,可能有的同学会有点疑问啊,就是我们为什么要在扎瓦程序当中来操作 excel 文件呢?那么具体有什么应用的场景呢?接下来呢,咱们就一起来看一下,就是我们这个阿帕奇 p u i 它的几个典型的应用场景。 首先第一个呢,就是银行网银系统,可以导出交易明细,大家可以看一下右边这个图,哎,你看啊,这其实就是一个 excel 文件,对吧?那么你看文件里面这些内容,这是什么呢?它其实就是银行网银的一个交易明细数据, 那这里边这个文字内容是从哪来的呢?哎,实际上呢,我们通过 p o i 啊,就可以来操作 excel 文件。更具体一点来说呢,就是我们可以通过阿帕奇 p o i 将我们这个交易明细数据啊,把它写入到我们一个 excel 文件里边,并且提供给用户来下载,那么我们下载下来之后呢,就是这么一个 excel 文件, 这是第一个应用场景,就是银行网银系统导出交易明细数据,然后第二个呢就是各种业务系统呢,也可以导出 excel 报表数据,咱们呢可以来看一下,你看这是不是有个订单统计报表啊?那么这个报表的形式呢,它就是一个 excel 文件,那这里边呢有很多订单相关的一些统计数据,那这个文件怎么来呢?咱们呢其实也可以通过 poi 向我们这个文件里面来写入内容,最终呢提供给用户。 好,那么这是第二个场景啊,然后第三个场景呢,我们可以批量导入业务数据,哎,咱们一起来看一下,你看这是不是有个信息统计表啊?哎,你看这里边统计的是什么呢?是不是有姓名、性别、民族,身份证号,年龄、联系方式等等这些, 那这个看起来呢,应该就是统计某些人的一些信息,对吧?比如说我们这个学校里面要采集学生的信息,那么我们每个班呢,就可以整理这么一个 excel 文件,然后把这些学生的信息呢提 前录入到我们这个 excel 表格文件里面,然后呢我们就可以通过 p u i 来读取这个表格文件,一次性的把我们这些学生的信息啊,把它导入到我们的业务系统里面去。咱们呢这是简单列了这么几个应用的场景,让大家呢有一个直观的感受就可以了。 其实呢我现在呢已经提前准备好了一个 p u i 的一个例子程序,咱们呢可以先来看一下,看看这个 p u i 它的运行效果是什么样子的? 好,那么大家可以来看一下啊,你看现在呢,我在地盘下边呢有这么一个文件啊,叫做 it cast 的点叉 l s x, 这是不是就是我们的一个 excel 文件呢?那么我们打开这个文件可以先来看一下,你看这个文件里边呢,我提前呢是录入了这么一些数据,对吧?那么主要就是这么两列,一个是姓名,一个是 爱好,这么两列,对吧?然后呢姓名有张三李四、王五,爱好这一列呢,是不是有篮球,足球,羽毛球,那现在我们的需求是什么呢?哎,我现在呢就希望啊将我这个 excel 文件里边这个文字把它读取出来, 那么怎么读取呢?哎,咱们是不是使用 p u i 就可以做到,所以说呢,我们接下来呢可以先来看一下,在我这呢提前准备好了这么一个焖方法,大家可以看到,那么这个焖方法它主要是做什么事情呢? 其实就是用来读取我们 d 盘下边这个文件的,哎,刚才我们已经看到了,就是我们打开的这个文件,对吧?那现在呢,我们就需要来读取这个文件里边的内容,并且呢把它输出在我们的控制台, 当然这个地方具体这个代码是怎么写的啊?咱们现在呢先不用管这个呢,其实都是我们这个 p o i 它相关的一些 a p i 后边 呢咱们会具体来讲他的用法,所以现在咱们只是来看一下他的运行效果是什么样子的,那么我们直接来运行一下这个闷方法,哎,大家可以看到啊,你看咱们这个控制台是不是就已经输出了这些文字,而这些文字从哪来的呢?实际上呢就来自于咱们这个 excel 文件, 那么我们这个地方呢,其实就是通过我们这个 p u i 读取到了我们这个文件,然后呢把这个文件里边的内容啊,把它输出在了我们这个控制台,你看这是不是有个输出语句啊? 咱们这个例子程序啊,它其实是一个什么呢?是一个读操作,对不对?也就是说我们是通过 p o i 啊,从这个已有的文件里面把它这个文件内容读出来,对不对?当然了我们使用 p o i 呢,也可以向文件当中来写入内容,那具体这个代码怎么写呢?咱们后边都会讲。好,那么这是咱们先简单聊 了解了一下我们这个阿帕奇 p o i, 对吧?那么使用它呢,就可以在我们的 java 程序当中啊,来操作微软的这些办公软件,比如说 word 呀, powerpoint 呢,还有 excel 文件等等。 当然一般情况下呢,我们是操作 excel 文件,这种场景呢,会更多一些。好,这是对我们这个 py 先做了一个简单的介绍。

再给大家补充一下,刚才讲了,嗯,这个对象的,没有讲 map 的,给大家看一下 map 传旨,我们先建立一个 map 对象, 然后我们给这个 map 传直, 这个也叫内蒙这边写,然后叫 mac 测试, 我们来穿一个长一点的这个标签名,也可以用下划线来连接这个吧, 二三年, 然后我们要把这个 map 传过去, 这个 map 就是标签名,我们在模板标签名这个,然后这个是我们的数据。 好,这个没问题。然后还有一个非常重要的事情,刚才忘说了,我们用完流之后一定要记得关闭啊,这就没问题了。然后我们来看一下这个 word 文档, 嗯,这个地方需要填一下 mac 数据这一下, 然后 man protector 那个, 然后我们来输出,只输出一个 map, 看看他是会是什么样子。好,没问题,我们来执行一下,看看有没有问题。 嗯,没有问题,我们看生成的这个模板啊,没有问题,看我们这是我们的姓名时间, 看一下没有问题。然后我们看生成第三个,生成这个 map, 那这个如果我们只写 map 啊,它会生成这个 map 的所有数据,像我们刚才的这个对象,它就生成的一个根。好,就到这里,谢谢大家。
