00:00
好,下面我们来看看这个第二个技术准备。使用Java来解析Excel文件。前面我们大家讲用Java来生成Excel文件,现在要解析Excel文件,那同样大家它做法上正好是个逆过程,正好是个相反的过程,那要解析的话,那这还得使用一些技术,那使用什么技术要还是不管是生成还是还是解析,那么我们说都得操作Excel文件。那如何操作Excel文件,还是用那一套图形化的API,图形化API还是用这套LAPI,为什么你要操操作Excel文件,Excel文件这是有格式的文件,只能用这一套API,那同样的道理,这一套API我们没学过,我们不会,那不会怎么办呢?那还是有差距的,说那解析的时候也是这做起来比较复杂,我们不会再一个它跟业务没有关系,然后导入市场活动需要解析,那导入别的也需要解析啊,所以跟业务没关系,所以也用插件,用什么插件还是用那一套插件,还是用那些插件知道吧,我们说大家最常用的is这种插件,还有什么阿帕奇的POI这种插件,这种插件一般都是双向的。
01:26
双向的什么意思?给他数据,他能生成文件,并且把数据写到文件里边,给文件他能把文件里边数据取出来,知道吗?这都是双向的,而且这些插件不但能操作Excel文件,还能操作word PDF,包括这些常用的这些办公文档,他们都能操作,知道吧?所以他们因为什么,因为这些插件,这些开发商啊,他们都不是,他们当他们都是什么,就一个团队专门做这一方面的软件的开发。所以他们做的不只是一针对一种软件知道,不只是针对一种文件知,所以呢,下边我们什么使用Java解析Excel文件,还是用阿帕奇的POI啊,它是免费的,我们还用它,那用它的话怎么用,基本思想也是一样,我们给昨天这个一样,那么使用我们说阿帕奇的POI,包括使用IES,基本思想都是一样,干什么你要操作文件。
02:24
文件你不擅长,他在用那一套图形化的API啊,你不会干什么,那你就别直接操作文件干什么,那他就是把文件中所有的元素封装成普通的Java类,然后我们通过Java类来达到操作Excel文件就以前我们生成的时候是创建对象,一调工具方法,它自动给我生成文件,现在呢,有文件通过这些类直接什么获取数据,那怎么获取数据,根据文件来创建这些类的对象。创建完了之后,通过这一类的对象一调用方法就能取到里边数据了,知道吗。
03:03
这是我们刚说到这,这是他的思想,你说以前创建文件的时候,直接留一个空类,就你一个类得到一个空对象,然后往里边设置数据,然后呢,以调用工众号生成生成文件了,现在呢,现在我要解析一个文件,根据一个文件,就文件已经存在了,根据文件创建这个类的对象,创建完了之后,那这个文件里边所有数据都在这个对象里边了,然后调这个对象里边的某一个方法1GET一下,这里边的数据全出来了,知道吗?这是他这个思想主张。那它有哪些类,这些类跟我们上次课用的那些类是完全一样的,一个元素对应一个类,一个元素对应类,其实还是这个,还是这个类,当然解析的时候我们是解析数据样式,我们不解析,所以这个基本上用不到,主要是这几个类。通过这几个类就可以解析Excel文件了吗?好,下边我就准备给大家写一个简单的例子来解析一个Excel文件,那我解析的时候,我这我不往数据库里边插入了啊,因为我这个解析我就给来演示一下,我解析的准备这把一个Excel文件里边的所有的行,所有的列,把这里些数据都取出来,取出来干什么?我不我不光数,就是查,我打到控制台,当然你能打到控制台,你让你插入到数据库,你肯定也能插入到数据库里。
04:27
所以我就使用这四个类来解析一个Excel文件了,来是吧,来做这个事了,那后做这个事了,我肯定要写一个测试,测试一个测试程序了,那我说解析Excel文件,Excel这种阿帕奇的P网格这些技术都是纯后台记录,不扯到前台么,发起图之类的,所以我写测试,我写测试,我写这个测试程序的话,我直接写个测试类,不用写页面了,我直接写个测试类一执行啊写个没方法一执行,那么它叫什么?解析某一个已经存在Excel文件,在这边写一个类,那写个类,这个类我就什么叫解析Excel文件,我就叫pass pass叫解析的意思,然后呢叫Excel文件,然后呢test这样就行了,然后呢,大家看这个地方给大家讲示,使用阿帕奇的POI来解析这个serve,好,那我们这个地方写简单写一个测试。
05:27
简单写个测试方法,测试方法这个public sta VO慢知道吗?在这边我要解析文件,怎么解析文件就用那四个类,那首先第一步我要解析一个文件,我不直接操作那个文件干什么,我操作那个h s sf work那个类,我来创建那个类的一个对象,通过那个对象来解析一个文件。那创建那个类的对象,以前我们创建的时候直接new这个对象就行,直接new这个类就行了,直接new叫HSSF,然后呢,Work不可。
06:04
这是以前我们创建的时候,直接六一个是一个空对象,以后往里边写数据,现在呢,这个文件有了,也就是说这个这个work book,这个对象对应的那个文件已经存在了,所以你创建这个对象的时候呢,你就不能直接这么new了,干什么?这个类还有一个重载的构造方法,它里边让你传一个参数,这个参数是个什么?是个input STEM,你猜猜这个input stream是什么含义?输入流为什么叫输入流?对对,文件在磁盘上是不是这样吗?我们的程序在什么内存里边,往程序里边输,是不是得叫输入啊,输流它肯定去叫什么,通过这个流去读一个文件去知道吧,通过这个流去读一个文件,所以我们这个地方第一步是叫做根据,根据什么,根据指定的Excel文件,Excel文件,然后呢,生成,生成生成这么一个对象,叫hssf work的一个对象,那生成这个对象怎么了,将来这个对象就封装了,封装了。
07:26
这个Excel文件呢,叫Excel文件的所有信息都在这个对象里边了,根据这个文件来生成这个对象,那这个文件里边的这个对文件里边所有信息都会分装入对象里边。那根据一个文件生成对象,那我们说从语网来讲,它就得到一个input stream,那这个地方给他传一个input stream,那这个input stream应该怎么给它生成?通过它去读一个文件,去输入一个文件,怎么生成,你有一个文件输入流是不这样的,去输入一个文件,肯定用文件输入流,你要读哪一个文件,是不是把这个文件路径写到这,对文件路径你要解析哪个文件,你比如说它我就解析咱们上传的这个文件,我就把它解析了CTRLC拷贝一下,这是它的路径,然后呢,这个是文件名,文件名我就写在这里边。
08:22
然后呢,这个地方文件名拷贝,然后呢,写到这里边,我就去解析这个文件,去通过理由把这个文件读到内存里边去,然后呢,这个地方来个input SP is直接拿过来就行。啊,然后呢,这个地方定一个变量去接收了,然后呢,Work不对象,这样的话,就通过这个什么根据文件生成了这么一个对象,那么这个对象里边就封装这个文件里边所有信息都封到里边了,知道吗?当然他这个什么要要抛IO层,我就直接往外抛了,我为了代码更紧凑,我就直接往外抛了,这是第一步。
09:00
把这个文件都封装这个对象里边了,那拿到对象啊,剩下就是我们擅长的事儿了,有对象了,直接通过对象里边来获取里边数据了,那有文件我要获取数据,不能直接获取数据,文件下边一个单位是页,所以首先我要获取页,获取页,所以那获根据谁获取页,根据work来获取,叫HSF,叫she对。叫shift对象,你要获取哪一页的数据?要获取一个shiftet的对象,因为什么?因为引来我们创建数据是创建一页,在文件下边创建页,现在我要获取里边这个页,页已经存在了,我要获取里边页了,我就可以获取这个西对象,那么将来这个对象就封装了,就封装了某一页的,一页的所有信息都会封装这个一页对象。那如何获取一页?对get,以前创建页的时候叫create she。
10:06
里边可以给它起个一的名字,现在要获取一页了,叫什么get she,所以这些都是类似的。当然get she它有俩,Get sheet,对,第一个是通过什么名字来获取,把那个year的名字写到这,第二个什么get she at,对,根据页的下标,页也有下标。对,一个Excel文件是不是可以有好多页页也有下标,它能下标也是从零开始,依次往后知道吧,那这俩方法调哪一个都根据名称获取,根据页根据页的下标获取都行,一般来讲根据页的下标,为什么根页的下标?因为名称有可能有中文编码不一样,虽然都叫这个名称,但是有可能获取不到。所以大家我们通常是根据页的下标来获取,那我这个文件里边只有一页,这个地方写几页,对零对这个地方来一个什么,这个是页的下标。
11:03
一个下标,下标,然后下标从零开始,零开始,然后呢依次增加,直到最后知道吧,然后呢,他就拿到HSS啊,F叫sheet,拿到一个sheet特别小,然后呢,这个地方就拿到she拿到页了,能不能直接拿数据啊。不能对,是不是还得盖该获取行啊,页下边是横,所以那获取行,获取行根据谁对,根据页来获取这一页里边某一行,让它根据she来获取HSSF叫肉对象,肉对象将来这个对象就封装了,封装了一行的那吧,所有信息,所有信息,那如何通过页获取行shift以前通过页创建框是不是可勾通过下标来获取,来什么创建框,现在我要获取里边已经存在的框呢?对,Get勾get。
12:08
这个肉里边也是下标,你要获取第一行写个零,获取第二行或写个一,获取第三行写个二,总之是通过下标行的下标行的下标来获取这个行的下标,我们说下标从零开始,从零开始,然后呢,依次增加依次增加啊,依次增加依次增加。那这个地方大概零获取第一行,零获取第二行一获取第二行第三行二,那这个地方我到底要获取多少行呢?过去多少行,你看Excel文件里边有有多少行是不知道吗?Excel文件里边这一页里边有多少行呢?我知道吗。
13:00
不知道不知道,他可能有多行,知不知道呢,多行也也不知道有多少行,那怎么办呢。是不是一个一个获取不好写了,那怎么办呢?对,放循环里循环获取从第一行开始,依次往后循环,所以这个地方来写个循环,然后呢,这个地方来我们来写个循环,那循环这里边有个循环变量,定一个循环变量,这个循环变量是不是就可以让那个什么对行的编号可以作为循环变量啊对那这个行的编号,哎,从从几开始,从一开始的话,那从第二行过去。是不是,那我有的话,我数据好,正好是从第二行,我假如说我把这个表格也想获取出来,打出来怎么办,从几开始。那个表头是不是第一行,第一行我让这个I作为什么循环变量,那叫什么。同级啊,从零开始,对,然后呢I,那么那么小于小于什么,这一页中的总行数是不是这样的总行数,这一页中的总行数每获取一个I加加这里边这个地方写几啊写I这样的话,大概我是不是什么从第一行开始一直一直往后边获取了。
14:19
但这个地方能理解吗?对,可以哈,这但跟上思路哈,你课下你也得这么写,你工作时候也得这么写,知道这是啊这所以这样的话我就要获取到了,对吧,就能够循环完我都能变成这个这个什么,所有的行我都能拿到了,那关键这个总行数是多少呢?这个地方写啥呢?嗯,剩的两。是吧?那就是写着吗?这一页里边到底有多少横,是不是这样的,那关键这一页里边到底有多少横,我怎么能知道呢?谁知道?对,这一页肯定知道为什么,因为这一页封装了这个谁的对象封装了这一页里边所有信息,你说这一页里边总共有多少行,是不是一定封装里边了。
15:08
怎么还是那句话,这一页有多少行,我不知道干什么,找一页对象,这个对象封装这一页的所有信息,它里边一共有多少行,一定在这里边分方,那你就找一找就行了,肯定C拷贝一下,看看它里边总行数来获取总行数调哪个方法对get的方法,看这里边哪一个方法像总行数对这些行像都不是是吧,都不像哪一个对,好像就这一个像,别的我也不看了,那你这别的你也看一看,都不像这个get拉住,那这什么意思。对对,我们说每一行都有一个下标是吗?这个什么?这个是获取最后一行的下标,每一行都有下标,从零开始,依次往后增加,最后一行的下标什么意思啊,对,就是最后一行那个下标就是总行数减一,是不是这样的?对,这个get get last road number,然后呢,这个是最后一行的下标,最后一行的下标。
16:18
也就是说是总行数减一,是不是这个意思啊,因为下边从零开始的呢,知道吧,好,这时候我要这样,那大看我要如果把最后一行也想变利出来,这个地方是不是得加个等号啊,对,得加个等号,最后一行加好,这样的话,大看从第一行开始变历,一直变历到最后一行,每变每变历这个循环里边每变历一次,取一个肉,那取一个肉这个地方写一个变量,接束的HSSF来个肉对象和肉对象,然后呢,写到这里,那当然这个变量拿到外边定义效率更高,这样。然后呢,这个地方我们就可以了,这样每次变出来一个横拿到行上,能不能直接拿数据啊。
17:07
不能,是不是还得获取行里边的列呀,对,列数据在列里边存着呢,所以我们还得获取列,获取列怎么获取对,根据什么肉对象来什么获取列对角HSSF来一个三对象,三对象这个对象将来就封装了,封装一列的叫一列的所有信息,所有信息,那如何根据肉来获取列,对创建列的时候叫create serve。然后给他填下标,或许已经存在的列,Get下也是通过下标,那这个下标也是从零开始,这个地方还是下标从零开始,这什么裂的下标下标,然后从下标从零开始,让依次增加依次增加啊。
18:05
如果是零,就是第一列一,第二列二,第三列依次往后,那他到底有多少列呢?那这就看这横有多少列了,是不是这么,那如果如果一个一个获取比较麻烦了,所以是不是我们也可以什么对,也可以用个循环。在这个肉每变出来一行,再用个循环,便利这一行里边的所有的列,所以这个是循环套循环。外层循环便力行,内层循环便利力,所以在这边再写一个循行。这一个什么?哎,这个地方再写一个循环,然后呢,这个循环再来一个啥,然呢,这个循环定一个循环变量,这个循环呢是表示列的下标,那这个地方就不能用L,这个用啥对,可以用接知道吧,从第几列开始获取。肯定从第一列开始过去,那第一列就是零是吧?那获取到什么时候算完,对最后一列是吧?最后一列从哪找对这个行里边肯定有它的列的信息,知不知道吗?啊第二它里边有个方法,正好凑巧有个方法,这样有这个last塞number叫最后一列编号,对这个地方来一个,它是表示最后一列的编号,这个或者叫下标吧,下标知道吧。
19:32
这个地方这是上面是最后一行的变化,这个是最最后一行的下标,这个是最后一列,这个地方大家经过实践证明啊,这个方法返回的不是最后一列的下标。是啥呢?是最后一列下标加一。换句话来说,就是这一行的总列数。他给上面这个方法不一样。上边这个方法是最后一行的编号,下边这个是最后一行,这个编号可者叫下标加一,就是总列数,他俩做的不一样,你看着我这这不是最后一列的下标吗?不是最后一列下标,最后一列下标加一是总列数,那他为啥做成这样的不知道,这我们测试发现它是最后一列的编号加上一就总列数,它按理说大概咱们如果让咱们写这个插件,这俩方法都这么都都这么相似了,那他这的功能肯定是一样,但是它做的功能偏偏不一样,知但不知道他这插件为啥这样做,知道吧,我想应该有原因的,但是他这样做对我们编程造了造成麻烦了,造成什么麻烦,那我们就不好记了,Get拉肉,那get s到底谁加一谁不加一呢?
20:49
所以你要记的话,你不好记,知道啊,不是不是不是它就是它反正是,那没办法,它就是这么做的,所以我们这个什么你记住它就行了,roll.get last3number是最后一列的编号加一,也就是说最总列数这一行的总列,那这样既然是最后一列的编号加一,这个地方还用带等号吗?
21:13
对,不用了,不用再等了,所以大家记住这个他为啥做成这样了不知道。它这个这这个这个插件它设计的,它就这样,所以你记住它就行了,好这种,然后呢,每变成一列这个地方直接加这这样就行了。好,那接加加它每循环一个是不是获取那个结啊对吧,GALA值,然后呢,这个地方来一个叫HSSF,然后塞尔对象,然后呢,这个地方来赛尔对象,当然把它拿到循环体罐定义效率更高,知道然后呢,这个地方我们就可以了,好了,这样的话大家我们就拿了,每拿每遍利出来一行,就要便利它里边所有的列,那每循完一次就拿到一个列对象了。
22:03
拿到列对象了,是不是就可以获取这个列里边数据了,就可以获取数据了,那获取数据怎么获取?对获取列中的数据,以霞光列里边写数据的时候怎么写的?对S3尔VALUE6现在这个列有了,我要取里边已经存在的数据叫什么?对GET3尔value看到吧。那设置的时候有重载的set value6,获取的时候也有类似的GET6。但是这个地方或许跟设置的时候不一样了,设置的时候是重载的,我传什么参数都不报错,现在呢,对你那这个地方该掉三二百九的时候,你不能随便掉了。你调的时候,你要看你这一列是什么类型的。
23:01
你要如果是字符串类型,你就调下边这个是数值性掉槽,是不转型的掉槽是日期或者是加里调相应的别的你不能随便调,随便调就报错了,随便掉就报错了,不能随便调。它给重载方法不一样,重载方法就你传什么方法,你传什么类型的参数,它调什么方法,它不会报错,但是获取的时候就不一样了。所以说大哥,那我获取里边知道时候到底掉这几个,调到底调哪一个呢。不能随便调,那得看谁啊,看这一列是什么类型的,他如果字符串掉字符串的。他如果竖直的掉竖骨头,它如果不耳的掉不耳朵。所以你在调之前,你得判断一下这一列到底是什么类型的,看这一列对么?我们说每一列都有数据类型,看它是什么,判断它什么类型是什么,调哪一个就行了,不能掉错,掉错就报错了,知道吗?所以那关键是现在问题来了,我怎么知道这一列是什么类型的?
24:06
我怎么知道啊?对,我怎么知道这一列是什么类型的,Of,你判断哪个类类型的,那它不管什么类型的,它都是这个类型的,都是hss serve这个什么HSSF类型的,它不管里边是什么类型的,它都是这种类型的。那我怎么知道这这一列是什么类型的?谁知道啊,对这一个对象封装了这一列的所有的信息。你说这一列,这个Excel这一列的所有的信息变率,这一列所有信息都在这个对象里边,这一列是什么类型的,这个对象知道不知道,对一定知道了,他一定放在这个对象里边,所以大家看这个S。他一定知道这一列是什么类型的。
25:01
这次变出来这一列是什么类,他一定知道,他怎么知道它里边有个方法,哪一个方法到我一写你就知道了,叫get cell type,看到吗?这个干的事儿。它就表示这一列的类型啊,这一列的。好,诶,你大家再看一看这一列的类型,它这个方法反回值是什么?Int,诶列的类型怎么能是int呢?当然是这样,对它这种插件它是做成这样的,他把Excel列里边的所有的数据类型,一个数据类型对应一个整数值。你比如说我举个例子,零代表字符串类型的,一代表数值型的,二代表不尔型的,三代表别的类型的,就是一个数值就代表一个数值,就代表一个类型啊,所以我只需要判断这个数值等于几就行,我就知道什么类型了。所以我在这来判断一下就行了,我在这这来判断一下这个数值等于几是几,我就掉哪一个,那如何判断它,那就看看等于几,那现在问题来了,关键我怎么知道哪一个类型对应哪个数值呢?
26:16
点进去点进去是吧,你点进去有吗。对,这里边是吗?没有是吧,那没有的话,那怎么我还记一串数字吗?我看他的文档,他文档里边一定有,我还记一串数字吗。对,我记下数字啊,零代表字不是一代表数值,二代表不好,我还需要记吗?对,按理说你得记一串数字,按理说你得记一串数字,没办法,因为一个类型对应一个数值吗?你得记一串数字,但是记一串数字这么多类型,记一串数字好记吗?不好记,记数字你不好记是吧?你记今天记住了,零代表什么,一代表什么,二代表什么,你还背下了吗?你这什么半个月之后又用了,又忘了,又忘了,再看再看再背,所以你背不下来嘛,背数字背遍了,数字不好背,那你说干什么?啥好背,他把数字定义成什么常量,常量好背。
27:21
就常量好背知道吧,所以它定义到常量里边了,那么常量怎么好背,然后常量都是剑名之义的,命名的时候它表示什么类型的,我一看这个名字我就知道了,我不用记答谁代表什么,我一看名字我就知道了,至于它那个值是几无所谓了,记常量就行了,那常量定义到哪了?定义到这了吧,叫HSSF30里边它是类这功啊这个什么,它是风光这个列信息的,它里边有成量,大家看到定义一系列常量知道吧。这是这个类里边用的常量,就说其中表示数据类型的常量有哪些,你你猜一猜。哪些常量是数据类型的?从哪个开始?是不是从这个地方开始?对,这是什么类型的?Sa type blank叫空类型,三是表示空类型,这个呢?布尔类型用四来表示的,这个呢?对,错误类型用五来表示。
28:17
再一个是公式类型,用二来表示零是表示数值型的,一是表示什么字符串类型的,知道吗?所以你只需你不用记那个数值,数值是多少跟我们没关系,你只需要记成数名就行了,你比如说大,假如我这个地方如果是数字符串类型的好了,如果它等于字符串类型,那说明什么?这一列这次变成这一列是不是字符串类型的,字符串类型怎么办?直接调get string s列哪一个调它就行。拿到他的值就行了,拿到他的值怎么了?拿到他的值我就可以打到控制台啊,打一下吧,按照字符串的取,按照字符串取打到控制台就行了。No。
29:00
就每次变出来一个类型一个列,看它是不是字符串,如果字符串直接打,那如果不是字符串呢。对,再判断看是不是别的类型,那看是不是别的类型的看法,那看看这个什么,看它是不是等于别的类型,那等于别的类型等于什么类型,你看还有啥类型,它总共Excel文件里边OPI把它分为六大类型是吧?一个是字符串类型,判断完了看看是不是数值型的数值类型,如果是数值型的打出来按数值型的取取的话,取谁get叫NUMBER3280。那如果也不是字符传,也不是数值呢?继续看等么?对,看看是不是别的类型,然后呢,点get s t导不等于谁导不等于个HSFFHSF,然后呢,S它哪一个类型,总共六大类型,然后还有一个什么,还有一个字符转数是不玩的,这是三个最基本的类型,然后呢,这个地方来个S打印出来,按照布尔取叫blue s80,那如果这三个都不是呢?对,再继续判断。
30:13
这是三个类型的,再继续乘等点GET3T等不等于谁HSSF点还有什么类型的公式类型?如果是公式类型,按公式类型的取,然后呢,我们这个地方那个cell.get formula。公式类型的取叫塞尔formula米,那如果这四个类型都不是呢?还有两个类型,哪两个类型?一个是空类型,空类型就是说这个单元格里边啥都没有,啥都没有直接打个打个空,打个这个打个空就行了。还有一个是错误类型,错误类型什么意思?就他本来这个单元格设置的是数值型,你非要给他一个总串,或非要给他布尔布尔数据,这就空类型,这是错错误类型,所以不但不管是空类型还是错误类型,这两个类型我们都不管了,直接打个空就行了。
31:06
所以大家六种数据类型,每次变换这个都判断一下是哪一个,按照哪一个打就行啊。这时候我们说每变出来一个列,一个列都判断一下。好,这是我们说的,这它里边肯定会执行一个,每次变化一个,肯定是有一个知道吧。然后打的时候大每一列打的时候,打完之后再看我,我用这个打是不是每每次打完,每打完一列都换个横啊,我想这样打一行的时候,如果打这一行里边的所有列的时候,打完某一列我不画行打一个空格。不换行,不换行是不是我就不能加它了,不能加它,那打完之后后边加个空格怎么办?对,加一个空格,然后这个地方打的时候也别加,也别画横了,加一个空格就行了,然后这个地方打完之后呢,也别给他加框横,这样然后呢,这个地方还有还有哪个呢?还有这个对这个这个也直接打个空格,然后呢,这个地方呢,是错误或者空位打个空格,这样一行里边只要打完一列,后边加一个空格,不换行,那等到所有列这一行里边所有列都打完了,是不是可以打个换行,打个换号,对,所有列都打完,所有列这一行里边的所有列这一行每一行中所有的所有列都打,那么都打完,都打完,然后呢,打印一个换行,把每一行的数据打在一行里边去。
32:41
让打印一个什么换行打印换行咋打。对,是不是直接这么打就行了,对直接这样啊,哪个哦,这个还没去掉是吧,对这个去掉就行了。这个代码大家能看明白吗?对,可以啊,可以的话,下边我就运行一下子。
33:03
啊,从文件开始到一到行到列。行,那时候便利行,那每一行,那所有的列也就变了,那这个地方大概我一回车,我就不是回这了,我一运行你看看。大家看过,这是咱们写的那个什么Excel文件,里面所有数据。这是所有数据,诶你说老师不对啊,这数值的都加一个什么点零,因为阿帕奇的POI把所有数值型的数据统一按照什么对double来处理的,那你说我不要点零,不要点零,到时候你什么你就给他对给给他改给他去掉就行了,知道吧。当然你能解析这个,你也能解析别的文件,知道吗?这是我们说到这个关于这个解析Excel文件。当然我们这个地方的,你比如说我解析这个吧,解析这个的离例子别的都不用动,然后呢,这个地方来运行一下啊。
34:02
啊,哪个地方这个文件这啊系统找不到这个,这这没有这个文件吗?啊aaa.a套那来AA点的A这地方来个AAA,哎诶这个后边这个也去掉,然后呢,运行一下,你看大家看吧,这些都能打出来看,这是我们说的,这当然现在大概我让你打出来了。我现在假如说我不让你打到控制台,我让你把这些数据解析,解析出来之后呢,插入到数据库里边,你能你能你能添加到数据库里边吗。咋办?咱们。对,这样每变出来一行,可不可以在这创建一个市场活动的实体类对象?对,这个对象一开始是空的,那是实体对象属性从哪取?从这里边,这里边每变出来这一行里边的一列,然后呢,把这一列的数据取出来,别打到空中来了,封装了实体类对象中,每变出来一行一个对象,每变成一个一行一个对象,然后把每一个对象放到一个list里边,多个实体类对象封装好了之后放到list里边,放完之后掉surface一下,把这个list保存到数据库里边。
35:21
这样的话整个就保存好了,知道吧。所以这是我们说了张,但你能打到控制台,让你保存数据库肯定也可以,所以这些道理都是通的,工作就是变换一下写法就行了。好,这个关于这个用Java解析ex文件,我们就说到这,这样从技术上来讲的话,我们这个技术也不存在问题了。所以我们明天把这个导入市场活动做完就行了,好,今天我们课就到这,大家下课了啊,啊上次我们大家讲的这个导入市场活动的一些技术准备,一个是文件上传,再一个是我们上传上去之后呢,使用Java来解析这种Excel文件。
36:07
能够把里边数据取出来,上次其实在我们这两个技术我们都已经跟他讲过了,但是这个解析使用Java解析Excel文件的话,这个地方大家看我们这个让实现了,你看吧,已经实现好了,其中有一个比较麻烦的地方,就是这个对来拿到一个列的对象之后,想获取列的这个,这个列里边内容的时候,这个时候有问题了,怎么有问题呢?我们说列Excel文件里边列都有数据,都有数据类型的。那么我们这种阿帕奇的POI把列里边类型分为六大类型,一个是字符串,一个是数值,一个是布尔,还有公式类型,还有有空类型和错误类型,知道吧?啊所以呢,我们每拿一个列的对象想获取里边数据的时候,那么我们都得判断它是什么类型的,然后呢来调不同的叫GET35VALUE这个方法,然后呢来获取这个数据,这个这些方法你不能调错了。
37:09
如果你是这种类字符串类型,你要调别的盖3286,这个时候就报错了,报一重了,知道吧。这是我们这啊,所以说大家这个地方稍微麻烦一些,稍微麻烦,但是我们说那我们做的话,就是每次获取一列的内容之前呢,首先判断一下它是什么类型的,是什么类型的,我们来调哪一个方法,这样的话我们就可以了啊,但是这个东西有问题,我们这样啊,测试代码你写到这啊,来获取一个列,获取这里边内容在这几个F21判断就行了。当然我们以后开发的话,也很多地方都需要获取列的内容啊,这条代码你每次都得写,每次都得写一遍,那么这套这样重复的代码到处写的话,这是我们最忌讳的时候,知道吧啊,所以说大概像这些什么,像这个时候大跟我们说这些代码我们就什么对不用是吧,使用的时候不用每次都写是吧,不用每次都写,那我们是不是说可以把它封装起来啊,对,封装一个工具方法对吧,然后谁需要谁调就行了。
38:15
所以我们的原则是同样的代码写一遍就行了,谁需要谁调知道吧,好这时候我们这样,那下面呢,我们这个我们就准备把它分到一个函数里边,那分到什么函数里边,那我们准备写一个工具类,专门来什么来获取指定的啊,指定的列对象里边的内容的,并且以字符串的形式往回返就行了,我们就以字符串的形式往外放啊。好,这是我们要这样,那这个方法这样我先写,我先在下边来写一个,先在下边来写一个,然后一会我把它分成一个工具类,好下边先把这个工具方法,我先把这个工具方法,然后呢,封装到封装到我这个类里边去知吧,好下边来写个工具方法,既然是工具方法呢,那是public对专门让别人去调懂,然后呢,下边什么对静态的别二是怎么调方便我们怎么写,通过类名就可以调了,然后呢,带这个,那返回值呢,什么类型的呢。
39:16
对我们这样,我们就以string类型的往那个string,万一它是数值性的或不尔类型的这个地方返回一个double,这个返回一个不尔,让别的返回别的类型的,那那你这个地方是字,如果是定义成spring类型的,那那那这些类型怎么回访,对是啊object也行,但是object杰有有麻烦了,有什么麻烦,用户调的时候得到的,你不管是什么类型都是object杰,那他将来要什么要要什么类型的,是不是他的强制类型转换啊对强制类型转换呢,那这个时候,所以在我们这样呢,我们不准备这么来做,我们这样什么,我们准备这全部都以字符串,字符串的形式往回放,那怎么那说老师这种类型的怎么这种类型,我不管什么类型的话,我到时候全部都以话,全部都给他转成字符串,然后往回放,那你说老师万一他以后用布尔或者用数值情况,到时候他再什么,他再什么把字符串转成。
40:13
竖值或者不软就行了,知道吧,他在他自己需要的,他在转,那他自己转跟强制转,自己转的话,那比强制转的话是吧,比强制每一次都强制转这样啊更方便一些是吧?好这是我知所以呢,我们获取的值导时,每次都是统一一字符块的行行方法,他需要什么格式的,他他需要什么类型的,到时候他自己再装知道吧,但我们这种方式就好像是好好像哪一个方法呢?好像我们以前学过那个什么学S的时候,从前台什么从前台向后台发送请求带参数的时候,然后呢,后台接收到请求之后来获取参数的时候,以前大家学那个什么SP题之前如何获取参数的,是不是通过都是通过request点开get parameter啊,来获取那个get parameter那个方法就是这种思想,你不管从前台传什么数据,我统一给你返回自串,到时候你需要别的,我再么你再你自己再转,就这意思。
41:13
得我们就整个账子好吧,所有的数据都以字符串的形式法好,所以这时候我们说这样,那这样的话,那下边写方法名啊,我们这个方法名我就建明之义了,叫GET3586啊GET3286知道吗?并且以字符串的形式往回反叫for s tr知道吗?好,这是我们知道的,然后呢,这个方大家看这是一个工具工具方法,这个工具方法就是什么,从指定的啊,从指定的这个塞入对象里边来获取这个什么塞对象列列的值是吧?从指定的啊指定的,然后呢,叫HSSF,叫cell对象中啊对象的来获取列的值啊获取列的值这样就行了。
42:05
好,那获取列的值大看,那我们这个地方大看,那就获取哪一列的值,就就是从哪一个对象中来获取,是不是你这个地方得定义个参数啊,定个参数把那个什么列的对象传过来就行,你获取哪一个列的值,把那个列的对象传过来,我就给你获取了,知道吧,所以那我们这个地方来一个,那定一个列的对象叫HSSF叫S等于对象,那么这个啊,好,这时候我们要这样啊,然后呢,在这里边直接写我们代码就行了,写什么把这一段代码投了。啊,八寨大门口了。然后呢,把卡拷过来拷贝,然后呢,放到我们这里边吧,我就获取,就获取这一列的数据。然后来判断,来获取到就行,以字符串的形式光告法知道吧,其实这个地方也符合咱们以前给大家讲过函数的参数的概念,函数的参数什么意思?就是我在写实现函数的过程当中,如果有一些数据无法确定,那么可以把它定义成什么参数。
43:07
我这个地方就是什么要获取某一列的值,获取哪一列的值,那这个列我不确定,不确定什么定义成参数,将来有调用者来传递过来,他想获取哪一列的值,把那列的对象传过来就行。所以这是我们做到这好,下边呢,我们就来写这个方法了,那写这个方法,那我们这个地方来写完,那这个地方再看,那我要获取这一列的时候,那看这一列是什么类型的,那这一列如果是字符串,那就以字符串的形式返回获取,获取到之后,那我这个地方要往回返,我就不打到控制台了,不打到控制台,我把这个地方拷过来,那我就不写这个了啊。那怎么办呢?这个地方我就要获取它就行,获取达放哪,我准备在后上面定一个变量,这个变量就是result,一开始是个空的,然后呢,这个地方大概我们说获取完了之后,然后呢把它复值给个变量,最后把这个变量往后反就行了,知好这时候我们这样,然后呢,大家同样,如果不是字符串,如果是竖值,那把按数值的过去,然后数值过去来一个。
44:10
Result,然后呢,等于按数值获取复制,当然这个地方报错了,为啥报错了。对,因为这个地方的话,数值性的获取,获取是不是double double,它按默认按照double来获取,然后你复制一个字符串,那显然错了,那怎么办呢?对,把这个什么double类型的转成字符串,Double类型转字符串咋强转可不可以?强转不可以强转,什么时候才能强转,对对继承关系,或者就是这种类型才能强转,那他俩大部分类型呢,和这个什么字符串有继承关系吗?没有没有不能转,那把double类型的如何转成字符状。咋种对点突责任这样可不可不可以啊,点投责任他没有点投词,它是个基本类型的数据,它不是它不是封装类,它不是一个那么对象,所以他没有图死兵知道吧,对我们以前封装类里边是不是有一个方法,哪一个对double它里边有个方法,哪一个方法。
45:29
那兔死也行是吧,兔死病也行知道吗?还有还有那一个吗?还有什么对这个什么,诶这一个是就把字符这个是把字符串转成double类型是吗?还有一个还有转成to此还有还有别的吗?还有范文之是字符串类型的吗?你看看把这个方法对就这两个是吧,那就用这个是吧,这个可以是吧?这个可以是吧?那我们还有一种方法就什么最简单一种方法叫什么?
46:00
对,后边给它加一个什么字符串是吧,这个字符串是什么,是空的,啥也没有是吧?这种方法就可以是吗?把一个任何一个数据都可以转成接这个字符串就行啊,我们以前给大家讲加va的时候,给大家说过这个加法运算这个加号这个运算符。我们说任何什么,任何数据都,嗯知么它可以,它本来是只能给什么,只能参与加法运算的数据,只能是数值型的,但是我们说后来我们又给他讲,它也可以参与字符串的运算,字符串的运算什么意思?就是说任何数据和字符串进行加法运算,结果都是什么?对,都是字符串,明白吧,所以这种方式是我们最常用的,知也是最简单的,你可以把任何一个数据跟字符串进行加法运算,其实它就不是加法运算,它是拼接运算,知吗?和字符串一拼接啊,最终都是字符串了,那由于我们是空字符串,我们仅仅把它转过,不改变它的值,然后就把它转成字符串,好,这时候我们做到这这一种呢,下边同样再看这个布尔类型的也是一样,然后呢,把它获取了之后,复制给这个标征rat,等于它知道吧,那同样这个地方也报错了,为什么报错,它也是不尔形的,然后转成字符串也不能,也不能直接转。
47:20
也不能直接复制过去,那要把这么布尔类型的转成字符串打装了,对我们说任何类型的数据和字符串类型的数据进行加法运算,最终得的结果还是字符串,就把你true或者false转成字符串啊,这是我们这样的,好这个就可以了,下边我们说这个也是一样,然后呢,把它获取到,获取到之后呢,把这个rit等于它这个地方得到本来就是字符数,我们就直接给它等它就行了,那同样下边这个地方也一样,下边这个地方我们点它,哎这个地方rat,那直接就等于空了,错误类型或者空类型里边压根就没有数据,那我们这个地方就是一个空网,好最终大家看把它返回,把这个ret返回就行了啊,这个re return,然后呢,把这个ret这个结果返回就行。
48:10
这样的话,大概我们这个工具就非常好了啊,这个工具方法就非常好,这。好,这时候我们这样这个,那封装好之后,在这直接调就行了,那如何调的话,在这个地方来调,我们这个地方,你比如说的话,这个地方来获取值的话,那获取值的话,这个这这些我都不写了,这些都不写了,我获每获取一个值,我要往外打,往外打这些我都不判断了,干什么直接调这个方法直接调出调它的时候干什么,我要获取它的值直接传上就行。它就得到一个值了啊,得到一个值,得到一个字符串,然后这个字符串干什么,每获取到之后往外打,这当然我们说他们每打一列完了之后,这个地方我们就不要了,不用打括框横,然后打完之后这一列后边加个空格就行了,这样的话我们也可以。
49:05
这是我们说的这嗯,所以说大纲以后我获取任何一列的对象呢,值道时候都不用自己判断了,每次都调他就行啊,当然我们说你也可以把这个工具函数把它封装了一个工具类也可以,那怎么封装,我这个地方就封,假如说封装了,然后呢,封装完了之后,然然后这后封装呢,我们找一个把它分成一个工具类里边,那么工具类属于公共的代码comments里边,它属于对优S下边的,那我能说它属于工具类写的us下边这然后在这里边写一个工具类,这个工具类假如我就是专门用来这个封光关于操作Excel文件的这个工具类,那我这个就这叫HSSF叫U,然后呢,这个地方这就行了。然后呢,这个是关于是吧,关于Excel文件的操作的工具类,这个是关于Excel文件,是Excel文件操作的工具类,工具类,然后呢,在这里边写我们工具方法就了,就把我刚才这工具方法贴到这就行了,以后谁用谁直接掉这个类的这个方法就行了,那你比如说呢,我们这个地方,我想掉这个类的这个方法直接U秀可发就行。
50:22
以后在任何地方,只要是需要获取某一个对某一个列对象的值,我就直接表格了,这样的话我们可以了,可取完了之后,下边我们一执行呢,跟昨天那个代码执行的效果完全一样,那我们来执行一下看看。好,再看这些给昨天代码完全一样,所以以后你再什么通过我们的这个什么再获取某一列的值的时候,你再也不用判断了,封装好之后就行,封好之后直接掉就行。好,这是我们上课给大家讲的这些内容,那么啊,通过使用Java来解析Excel文件。
51:03
好,这是这个我们就给他说。
我来说两句