00:00
然后呢,大家我们这个地方来,那我写一个测试测试程序,这个测试程序大家生成Excel文件,那生成Excel文件,这个文件我不下载的,我就是生成Excel文件,那这个Excel文件其实是什么?只用到Java的,不用没用到页面,所以我写这个测试程序,我不用写页面,我只需要写一个Java的一个什么测试类就行了,将来一运行这个测试类好,它就给我生成Excel文件了,所以它这个纯后台的记录。这些插件都属于纯后台记录,它不牵扯到外部页面,所以我写这个测试类呢,我只取只需要写的Java的测试类就行了,所以不用写页面了,不用写测试页面,所以下边我们来写了,那测试程序我们都复放到这个什么开始的下边,所以下边我准备在这么在这个测试的这个页面下边,然后写个测试类了,那写个测试类我还是写在这个包下边,这个CRM这个包下边,这个包下边我这个地方给大家演示PI,所以再建个子包这个地方给他演示PI,在这里边来给大家写一个测试类,这个测试类我就说给大家演示使用阿帕奇的P来创建一个测试文件,那我就这个类我就直接建明之义的写了,叫create Excel,叫create Excel,然后呢,它是一个叫来个test,这样就行了,这一个测试类,然后在里边写个测试方法,将来一测直接运行就行了,知道吧,然后呢,我这个测试类,我给大家简单写个注释,这个地方就是使用啊,使用阿帕。
01:29
提到PI来生成啊,生成Excel文件,生成Excel文件好,然后呢,在这里我简单写个测试类就行了,这个测试测试方法就行了,然后测试方法呢,我就简单写了,就写个main方法就行了,将来一运行就可以了,然后呢,这个来一个写个没方法,那就什么public sta VO man,但这个方法是不是很长时间没写过了,对是为啥为啥要写它呢?没有它运对没有它运行不了是吧?那你很长时间没写过,那你那你前面这一阶段写那些程序没有它为啥能运行啊。
02:11
那你前面写那么多的代码是吧,都没写它为啥运行了,对服务器掉的你的代码是吧?服务器为啥调了,你从前台发请求到服务器接收到了就调你的方法了,知道吧?所以我们做外部开发是吧,就是从什么整个流程从从什么从客户端发过来请求,由客户端驱动来调了,客户端发请求就掉了,那我们这个地方就写一个测试,不牵扯到客户端了,这个时候什么必须你自己调了知道吧,这是我们说的这所以那自己调,那你自己得写个没方了,所以我就在这里边准备将来一直行,它就给我生成一个Excel文件了,那生成这个Excel文件,我准备给大家写这个例子,写一个什么,写个最简单的例子,给我生成Excel文件,用来统计一个班级的学生信息,知道吧,把一个学生列表生成一个Excel文件里边就行了,好,下边我就来生成一个文件了,那生成文件怎么生成?他说了,根据他的思想,你别直接生成文件。
03:11
因为直接生成文件你得什么,你得用那套API,但是你不会不会,那我要生成文件怎么办?对调这个对象,用这个类的一个对象生成它的一个对象就行了,将来一调一个工具方法,它会自动给你生成一个Excel空件,知道吧,所以生成它一个对象就行了,那是,所以下边我们第一步我要生成文件,首先我创建这么一个对象,创建它的一个对象,创建它的一个对象,那么将来这个对象,这个对象就会对应生成一个Excel文件,所以它就会对应一个Excel文件,这个对象对位对应是那个Excel件,知道吗?那如何创建的对量很简单,直接六就行了,然后呢,直接六直接六,然后定一个变量,然后呢,去保存的这个变量,那肯定也是它了,然后呢,这个变量名你随便起了,我就叫我可不可了,知道吧,这样的话大我就创建这个对象了,这个对象将来。
04:11
它就对应会生成一个exce文件,我一调一个工具号,它就自动生成一个ex文件,知道那个工具方法现在里边内容没有,所以我现在现在先不调动工具方法,知道吗?啊,我一会儿把里边内容都填完了,我再调,你说老师现在我不填内容可以调可以调,只不过调的时候呢,他也能给你生成文件。生成文件,只不过这个文件是个什么空文件,里边啥也没写,知道吧知道吧,所以那我要这么我生成文件,我肯定要往里边写内容。往里边写内容,下边我就往里边写内容了,现在这个文件就是这个对象是个空对象,生成文件也是个空文件,我想往里边写内容,那我就下边就往里边写了,那如何往文件里边写内容?Acel文件里边写内容咋写啊?那你看你用office咋写啊,Office里边往里边写内容你咋写啊?
05:01
所以大个office里边要往文件里边写内容,是不是你首先创建一页啊,往页里边才能写内容,你不能说往office,往往这个Excel文件里边直接就写内容,它不是你写到哪一页去了,所以首先创建一页文件,下边是一页,首先创建一页,创建一页你也别直接创建,你直接创建你得用API创建了干什么,创建这个对象,创建这个对象,创建这个类的一个对象,将来一定要一公众号,它会自动的在这个文件里边创建一页,知道吗?所以这是我们那创建它的对象怎么创建,那么将来我们创建这个C的对象,我们将来创建这一页,我要放在这个文件里边。那你创建这个谁的对象的时候呢,用这个对象创建将来一调工具号啊,它会把这一页直接放到这个文件里头。你问老师,我有别的work克不克对象,用别的work克对象创创建可不可以也可以,但是你创建那一页,它会放到别的文件里边。
06:01
用哪个文件创建,那么这创建将来这一页它会放到哪个文件里边,所以我要在这个文件里边加一页,那我这个地方就创建使用沃克布这个对象,然后他来创建这么一个对象,使用它来创建它的一个对象。它的一个对象对象,那么创建这个对象的呢,它就会对应将来这个文件,有它生成的那个文件里边的某一页,它将了就对应对应谁对应work有这个文件啊,对应这个文件中的一页,对应它的一页啊,对应它的一页。那如何用它来创建一个shift对象,它里边有个方法,正好有个方法是哪一个方法叫这个创建的方法叫一个什么create shift,看吧,Create shift啊。
07:00
这是我们说这个大家看它有个重载的,你知道吗。调哪一个调哪一个都行,前面这个你要调它不起这个页的名字,你不起不起它给默认,默认一个页名叫谁的一谁的二,后边这个是这一页,你可以给他起个名字,知道吗?第他俩掉哪了都行,我们都知道页有名字,怎么有有名字大看这是他默认的名字,你也可以改下这一页这个地方双击一下,那你可以改个什么什么列表,就说这些你都可以改它,他说你这个创建的时候,你也可以给他指定一个名字。那指定一个名字指定吧,这个你比如说大家我这里边将来要放学生的信息,我就叫学生列表,那么将来我这一页的名字就叫学生列表,然后呢,定一个变量去接触它就行了,所以我们这个地方来什么HSSF,叫shit,然后呢,这个地方来个she,这是我们说的,我们就创建了一页。在这个文件里边创建一页了,这一页的名字叫学生列表,知道吗?好,那这一页有一页了。
08:02
我要往里边写内容,能不能直接往页里边写内容,不能对Excel文件里边要往里边要往Excel文件里边写内容,得写到哪啊?是不是得写到列里边,对列是属于行的,所以知吧,有页了,页下边你这框建行,行下边才有列,有列你才能写内容,所以下边你要往里边写内容,首先创建行,那创建行怎么创建,我将来创建这个行要放到这一页里边,所以我得使用这个对象来创建横对象,哪一个对象就这个对象,你别直接创建横,你创建这个对象对,所以下边我就这了。同样道理,使用谁使用这个,使用shit来创建,创建这个对象HSSF叫肉,使用这个呢,创建它的对象对象,那创建它的对象有什么好处,那将来创建的这个这个肉对象就会对应这一页中的一那么一横。对这。
09:02
这一页中的一行一调工形法自动在这一页里边生成一行,那吧,那如何用它创建,如何用它创建roll对象,正好它里边有一个方法,对,巧了,它里边正好有这个方法叫什么可味的肉,懂这牛老师他怎么这么巧,万一没有这个可味的肉呢?这不可能是吧,他做插件他是干啥的啊,做插件这个是吧,医院里边没有可谓的肉是吧,那那那还做啥呀是吧,他一定这都是设计好的,人家做插件那些人也不是白痴是吗?他们都是做很多年开发了是吗?这都是设计好的,所以说大家看他里边有参数,你看吗?他里边有个参数叫什么in特类型的,In特类型那是参数名叫啥?你看对row number number叫行的下标,行的下标。是个整数值行列,行列下标什么意思大家我们都知道,在一页里边每一行是不是都有什么都有行号啊,其实就是行号,就那个行号。
10:04
这个行号是什么意思,就说你创建这一行,将来放到这一页里边哪一行,你给他指定这行的下标,还有行的下标叫叫行号吧,简单写下叫行号,它这个行号大家就是注意是从零开始的,从零开始。表示你创建这一行放到哪一行里边去,你要想放到第一行里边这个地方,给他写一个零,对,你要放,你要表示放到这一行里,创建这一行,你要放到这一页里边,第二行里边,你知道往学记啊,对一啊,它是从零开始,就从零开始,然后呢依次增加。依次增加,这是行号,从零还是依次增加,那我这个地方,假如我准备创建第一行,假如我创建个学生信息大,我就准备创建学生信息,你比如我创建学生信息大,这是第一行,第一行我假如我先创建第一行做表头,假如叫学号,这是学号,然后呢,这个地方来一个这是第一行,然后呢还有个学生的姓名,然后呢,还有个学生的对,再一个学生的年龄,我要准备创建这是第一行作为表头,那这个地方我就什么传个零,它将来就这一创建这一行就放到第一行里边了,那这个定义个变量来保存它HSSF来一个叫对肉,然后呢,这个地方来一个定一个变量结束了,我就叫肉了,这样这样我们就可以了。
11:32
这是我们说到这儿,大家看现在有行了,有行了能不能直接往里边写内容,不能对行里边还有列是下边,我们看在这一行里边创建列,那这一行里边创建列,同样的道理,直接使这种这个肉对象来创建什么创建叫HSSF,叫sir对象,对象,那么创建的这三对象,那么将来就会对应这一行中的,对应这一行中的对列,对应这一行中的列。
12:04
所以下边我们要准备使用row来创建号,创建列,那使用肉创建列怎么创建?对叫可S,它里边也有个参数column number,这什么意思啊?对列的编号,列也有列的编号,你创建这一列放到第几列里头去知道吧,它这个列的编号也是从零开始,列的编号就列就列号。这个地方A一个叫列的编号,列的编号,它这个编号也是从零开始,零表示放到第一列,然一表示放到第二列,知道吧,依次增加,依次增加,这样就行了。那这个地方假如我创建第一列,那这个地方全个零,然后呢,这个定义变成HSSHSSSF叫S对象,然后呢,这个地方来个S对象。
13:01
放到这里,这就创建一列了是吧,那这一列,而且是放在这一行中的第一列是吧?知吧,这是我们说的这样,这样的话大看我这个地方,我就创建了一个文件,这个文件里边有一有一页,这个页的名字叫学生列表,在这一页里边创建了第一行,第一行里边创建第一列,有列了,是不是就可以往列里边写内容了,写内容那如何写内容正好巧了是吧,这个什么C里边有个有一个方法往里边设置内容的哪一个叫这个叫set set value,看到吗?Set value。我你就可以往这一列里边写内容,大家你会发现它有很多重载的,33Y6你看吧,重载为啥有重载的方法,对大家我们都知道Excel文件每一列是不是都有数据类型的,每一列都有数据类Excel文件,Excel文件很厉害的,Excel文件很复杂的,他Excel文件它跟跟我们数据库很类似的。
14:04
知道吧,每一列都有数据类型,有字符串,有整数,有布尔,还有其他的甚至公式类型等等,这些它都有类型的。其实大概我们说Excel文件从格式上来看的话,大概其实跟我们数据库特别近,特别相似,你看吗。其实在早期软件开发的时候没有数据库,当时都没有数据库干什么?大家把数据什么都存到Excel文件里。就你生成那些数据,从放到Excel文件,然后取的时候从Excel来取,甚至有一些开发语言,早期在开发语言现在都被淘汰了啊,还提供对Excel操作Excel文件的驱动。就跟你操作数据库的驱动一样,知道吧,所以他每一个单元格都有数据类型,所以呢,这个地方你给了他复制什么样的,那你们老师我这个地方到底调哪一个,还有这么多的332Y6,那我到到底调哪一个,那你看这个单元格这一列是什么类型,那这一列到底是什么类型的呢?
15:03
对,这个地方是现在你刚一给他负这个值的时候,负什么类型的,这一列就是什么类型的,知道吗?你比如说大概现在我说随便,那我调一个,那这个地方我假如说往里边写一个,写一个什么,写一个叫学号这两个字,那学号这两个字是不是字符串就行啊,那我就给他传个字符串,这个地方我就就叫学号,这样的话,我这一列就这个字符串就行。啊,你要给他传个布尔,那么这一列它就布尔类型的啊,你要给他传个数值,它有个数值类型的啊,当然我们这个地方呢,我们就是一个什么学号字符串,这样的话,大家看我这一列我就写好了。知道吗?这样的话呢,我这个什么,我这个Excel文件,假如现在我一调工具方法,它应该是就是这么一个这么一个文件了,当然我们说这个地方啊,这些这一页,我们就一页就这样,这里边是个学生列表,假如我现在一调一工具方法,它就给我生成这么一个Excel文件了。
16:04
一个文件有一页,要一页有个第一行,第一行里边有个第一列,第一列的内容叫学号,现在我一调工具号,他就给我生成这个。当然我为了什么统计学生的话,我肯定什么不止这一列,假如我再创建一列,在还是在第一行班创建的叫学生姓名,这个状叫年龄,再创建两列,那如何创建?对,还是用这个肉创建,因为我创建出来的还是放在这一行里边去,那我这个再创建,再创建一列,这一列来个克瑞三。这里边儿填几。对填一放到第二列,然后呢,这个地方定一个变量保存一下,哪一个变量我还用这个变量保存知这是我们说的这然后这一列也给他起个也给他S3286,然后呢,这个地方假如我叫姓名,姓名知道吧。这时我又创建了一列,这一列放到这一行的第二列是吧?
17:01
是这事我们知道,那它一运行就是这个这个性名就生成这么一个字符串,当然我们这个,当然这个地方我当然我们现在没有设置样式,它肯定跟上面这个样式是一样的,知道吧,这事我们知道,那这个地方大家有可能有疑问了,是吧?有什么疑问,因为老师诶这个地方创建一列,把这一列这个对象呢,复制给这个引用了,你下边又创建一列,又创建一个对象复制又复制这个引用了,那这个引用不就是指向这个对象了吗。那指向这个对象怎么了?那这个列不就失去引用了吗?失去引用以前老师给大家讲了一个对象一旦失去引用,是不是要被垃圾回收器回收了,那这一列还有吗?但是被垃圾回收器回收,大家能理解吗?能理解吧,对大家说,那有同学说,哎,这个地方不就回收了吗?这一列不就没了吗?但你这个不用担心啊,只要有这一行创建的所有的列,哪怕你没有定义变量引用它,他在内部也有一个变量引用它。
18:06
他不会失去饮用的。垃圾回收器不会把这个对象回收的。所以呢,你只要有它创建的,它内部有一棵树,谁创建的,它会维护这种关系,将来一定要工具方法,谁创建的还是放到谁上面去,就这个意思,所以大家不用担心这个啊,以前有同学担心这个,不用担心这个,知道吧,好,这时候我们又创建一列,然后这一列就是这个,就是这个,那我现在我再创建一列,这一列假如是个年龄,年龄,那这个地方,那么我再创建一列,如何创建一列。同样我还是这样,我这个东西就拷贝了,还是在这一行里边再创新列,这一列放到什么第三列,第三列就是二,然后呢,这一列的内容我给他写个年龄知道吧,这样的话大看我现在一执行一个工具方法,然后他就给我生成这么一个Excel文件了。当然现在我们只是有一个表头,下面我要往里边写一些数据,横写下学生的信息,那下边写学生的信息,那怎么办呢?是不是我要在这一页里边创建多行了,每一行里边是不是都有三列呀,都有三列,所以下边我就准备这样的,假如你比如我想创建十个学生的信息,我里保存十个学生的信息,那我就是什么,就得使用什么西德来创建什么十行,十个肉对象,HSSF来个肉对象,那么这些对象将来就会对应啊,对应这个C的这一页中的十行。
19:44
十行调着了,在这十行里边保存十个信息就行了,那我要创建十行,按理说你得调什么,你得调这个什么shit肉,然后呢,包括每一行上边,这上面都有三列,你得调十个这些代码,那调十个这些代码我嫌太麻烦了,是不是我可以写到一个循环里边的,写个循环里边,那我写个循环里边来,你看怎么循环一下,这样吧。
20:11
那循环的话,有循环的循环变量,这个循环变量我就准备让它每这个循环变量值,我就准备让他什么作为每一行的那个编号。那这个循环变量将来作循作为行的编号,这个循环变量从几开始是吧?从几开始?对从一开始了,因为第零行是不是已经用过了,对已经创建好了,然后呢,我要创建十行,每次创建一个让I加加,那这个I小于几的时候算完,对小于等于十,然后每创建一个加减了,知知道吗?将来在这个循环体里边每循环一个是不是我都是什么用shift对象创建一个柔对象,那如何创建个肉对象可的肉对这里边一个I横的编号,然后呢,这个地方定一个变量,肉等于它。
21:06
这是每次创建一行,那每一行下边是不是都有三列,都有三列,都有三列这个地方直接把这拷过来,根据这个肉创建三个三入对象就行了,第一个三入对象是不是放在这一行的第一列的吧,第一列,那这个学号,这个地方给他一个学号就行了,这个学号我们给他一个,随便给他一个。那假如这个学号学号我也简单写吧,你比如说来一个100加I吧,假如大家的学号,假如这个命名规则就是当然实际开发的时候,那实际开发呢,按照客户的这种需求。然后呢,大家看这是什么,这是什么第二列,每一行的第二列,那第二列的话,姓名假如我就简单写了,假如我就简单写啊,当然按理说这是什么,每个实际看到每一个学生的姓名,我这个东西就讲的写了,直接name癌就行了,下边第三列都是年龄,年龄我这个东西也简单造一个数据了,那这个年龄这个年龄我们来一个造一个数据,那来个20加I吧,知道吧,好这样的话大看每循环出来一个,我就创建一行,每一行里边都有三列,三列边数据是我们自己造成,学校完这里边创建十行,那就十个学生就行。
22:17
所以现在呢,我们说现在我们这个Excel文件基本上都已经创建好了。有一个文件里边有一行,这一行的名字是他在这行里边首先创建一个什么第一行,在这个文件里,在这一页里边创建出第一行,这一行作为表头下边有十个数据行,知道吧,好,这是我们说到这大家看,那现在这些数据大看都已经封装到这些对象里边,哪一个对象都是由这个对象延伸出来的。所以现在所有的这些数据都在这个对象里边。下边我就准备调用一个工具函数,然后一下给我生成一个Excel文件了,哪一个工具函数就是这个work这个对象,它里边有个工具,有个工具函数,就这workb调用工具函数来生成Excel文件,调用工具函数,然后呢生成啊生成然后呢Excel文件。
23:15
对吧,并且把这些数据都写到那个Excel文件里边,就哪一个文定函数,就这个它里边有个方法,哪一个方法呢?这个地方有一个叫什么,这一个数right看看这个方法,对这个方法,这俩方法大看我们主要用这两个方法,这俩方法都需要你给它传个参数,这俩参数大你猜一猜什么意思。文件对,你要把它生成哪一个文件,是不是把那个文件告诉他就行了,它就给你生成的文件了,这个文件可以不存在,但是它会给你么?直接给你创建可以不存在,它会给你创建是吧?啊,这是一个文件,它下边这个什么意思?输出流对是不是通过输出流也可以输出到一个文件里边,对通过输出流指定那个文件就行,通过这个fire对象指定文件就行,这俩用哪一个都行,知道吗?指定磁盘上某一个文件就行了,那我们一般来讲就用下边这个,下边直接生成,直接通过流,让效率更高一些,你要通过文件,它也得建立流。
24:18
所以你要用下边这个省的它的内部建立流了,所以我们这个地方直接用到了,在这边给要提供一个输出流,它就会顺着这个输出流,然后把里边内容全部什么输出到那个文件里边了。所以你得给他传一个输出流,通过这个输出流让他输输出到某一个文件里边,指定那个文件里边,那现在我问你了,如何根据一个文件生成一个输出流。对输出流的对象,输出流我们有很多输出流,用哪一个输出流。对,我要输出到一个文件里边,用什么输出流?对,文件输出流对,我们以前学过很多输出流,其中有个文件输出流是专门干什么呢?往文件里边输出数据的,往文件那就怎么输出数据,当然了,我们现在数据都在内,都在什么Java代码里边的,你要输出到外边去,肯定用输出流了。
25:17
要输到外边哪,输入到外边文件里边,要用文件输出流,所以直接利这么一个文件输入文件这个输出流就行了,那这个文件输入流里边让你给他传个参数,这个参数什么什么意思啊,对,就是那个文件的路径是吧,对那个文件路径,那这文件路径放到哪,随便放我这个地方,准备放到今天这个,今天这个笔记里边啊,我我放这了边啊这个啊。就就放到咱们这个资料里边吧,放到这里边,我准备创建一个文件,那这个创建一个文件夹,准备在这,准备都放到这里边,这个文件夹假如说我就模拟服务器叫server,嗯,它肯定在服务器上运行了,我就叫server上面的一个DLL吧,就server上面的一个目录,我准备让他给我生成的文件放到这个目录下了,那我这个地方这个路径就写到这里了。
26:06
啊,这个路径,这个路径一定要创建好它这这些目录一定要都是都是事先创建好的,知道吧,一定要创建好,然后下边你要输入这个文件里边,这个文件名叫什么呢?输入这个目录里边这个地方后边给它起个文件名,这个文件名你随便起,假如我就叫student student list是个Excel文件,点Excel文件后置名叫啥?对XLS是吧,XLS这这这个文件名你随便写吧。这是我,但后边后缀名是XLS,这个地方给大家强调一下,前面这些路径必须事先创建好,文件可以不写。文件可以不创建,它会自动创建,但是这个目录必须手动创建好,如果目录不存在,它就报错了,所以这个地方给大家强调一下,这个目录必须手动创建好,手动创建啊,然后呢,文件如果不存在,如果不存在,然后呢,这个插件POI会自动充电自动。
27:12
文件可以不创建,然后呢,这个目录必须创建好,好这样的话我们就可以可以完了之后定一个变量接收这个流,那这个变量我就叫autop spring,然后呢,OS这样就可以了,然后呢,把这个什么把这个输出流传给他就行了,那我说这个用到IO了,IO是不是一定会抛异常的,对,而且是必须补货的,那我这个装修不补货了,我为了代码更紧凑,我就直接往外抛了,知道吗?这个擦不是好这样的话的话,我这个人啊,就调这个工具范了,调完之后它就直接什么根据这个输出流输出到这个文件里,如果文件不存在自动创建,创建完之后把里边的数据全写到里边。这个文件就生成了,生成完了之后用到流了,我们说流都是很宝贵的资源,用完之后是不是释放了,对关闭资源或叫释放资源,关闭资源当然先把这个OS点二,其实大家看这个也是个很宝贵的资源。
28:14
Work不OOK也是很不用完之后及时使用,要不然它很占内存,为什么很占内存,你看这里边东西全在里边呢,你要用完之后,他要不能及时回收的话,那么它也占很大的内存,所以那怎么呢?关闭close关闭,诶这个可close啊,它也有一个close关闭,这样的话咱我们这个测试类就行了,写完之后我一会运行它测试,我为了测试证明这个类什么这个测试方法执行完了,这个随便打印一句话叫create OK啊,只要打完这一句话,我就说明我这些代码都运行完了,运行完之后,那这个按理说如果写的没错的话,这个文件就给我们生成了。好,这时候我们说的这个地方,我们就要可以了,这个测试。
我来说两句