POI操作Excel实例之将文本内容格式化导入Excel

这里介绍一个最近写的小程序,对从微博爬取的用户数据的.TXT文档,进行逐行导入Excel表格中,下面是输入文档和输出表格:

   微博数据.txt

3891186595	15关注	125粉丝	2402微博		勋章信息	等级信息	Lv.25	当前等级:Lv.25经验值:917距离升级需经验值:603	查看详情a		基本信息	昵称:佳韵李	所在地:其他	性别:女	生日:狮子座	注册时间:	2013-1-07	教育信息	高中:	玉林高中(2012年)	高一1204高二1209	初中:	玉州九中(209年)	091	小学:	东环小学(203年)	4班	标签信息	标签:	欧美音乐	好书	打球	学生一族	吉他	视频音乐	听音乐	低调	
5587867413	243关注	123粉丝	158微博		勋章信息	等级信息	Lv.9	当前等级:Lv.9经验值:1078距离升级需经验值:32	查看详情a	会员信息	成长速度:10点/天	成长值:350	下次升级:25天	会员特权:	立即开通会员独享尊贵生活体验!	查看详情a		基本信息	昵称:爷们道明次	所在地:吉林四平	性别:女	感情状况:	单身	生日:摩羯座	注册时间:	2015-04-15	标签信息	标签:	八卦杂谈	美容服饰	读书分享	美食	科学探索	
6104677993	212关注	57粉丝	45微博		勋章信息	等级信息	Lv.13	当前等级:Lv.13经验值:1694距离升级需经验值:316	查看详情a		基本信息	昵称:Ciliver12	所在地:四川成都	性别:女	生日:197年10月12日	简介:	如果你给我的,和你给别人的是一样的,那我就不要了。	注册时间:	2017-01-15	
2621492711	勋章信息	等级信息	Lv.25	当前等级:Lv.25经验值:76距离升级需经验值:64	查看详情a		37关注	351粉丝	120微博	
2955634332	20关注	480粉丝	258微博		基本信息	昵称:KobeGuapiyue	所在地:湖北潜江	性别:男	生日:195年8月31日	个性域名:	htps://weibo.com/723474386	简介:	每个人都缺乏什么	注册时间:	2012-08-18	标签信息	标签:	科比		勋章信息	等级信息	Lv.32	当前等级:Lv.32经验值:13191距离升级需经验值:789	查看详情a	会员信息	成长速度:10点/天	成长值:654	下次升级:35天	会员特权:	立即开通会员独享尊贵生活体验!	查看详情a	
5234522180	10关注	56粉丝	8微博		勋章信息	等级信息	Lv.9	当前等级:Lv.9经验值:273距离升级需经验值:97	查看详情a		基本信息	昵称:来福丽美儿	所在地:陕西安	性别:女	注册时间:	2014-07-27	
2613763573	291关注	90粉丝	60微博		勋章信息	等级信息	Lv.21	当前等级:Lv.21经验值:5415距离升级需经验值:315	查看详情a		基本信息	昵称:容菎	所在地:山东	性别:男	生日:190年12月1日	简介:	惠中有勒	注册时间:	2012-04-2	标签信息	标签:	台州生活	
5227820733微博大咖		6关注	20720粉丝	21微博		勋章信息	等级信息	Lv.35	当前等级:Lv.35经验值:16296距离升级需经验值:564	查看详情a	会员信息	年	成长速度:15点/天	成长值:8415	下次升级:106天	会员特权:	立即开通会员独享尊贵生活体验!	查看详情a		基本信息	昵称:老革命古玩	所在地:其他	性别:男	性取向:	异性恋	博客:	htp://blog.sina.com.cn/haonanren	个性域名:	htps://weibo.com/bg02	简介:	“打工仔向王思聪卖传家宝看病走红网络”事件主人公	注册时间:	2014-07-2	联系信息	邮箱:	Q:	4715801	标签信息	标签:	搞笑	幽默视频	笑话段子	笑话幽默	搞笑幽默	
3496611657	291关注	35粉丝	1538微博		达人信息	中级达人	积分:7548.0,	↓	兴趣:	旅游,音乐,文学,	申请达人?	勋章信息	等级信息	Lv.32	当前等级:Lv.32经验值:13170距离升级需经验值:810	查看详情a		基本信息	昵称:可乐拌饭XI	所在地:江苏州	性别:女	性取向:	异性恋	生日:195年4月23日	血型:AB	简介:	东方神起,还有什么比你们更珍贵。	注册时间:	2013-06-20	联系信息	邮箱:	Q:	1092047371	教育信息	大学:	盐城师范学院(2013年)	美术学院	标签信息	标签:	学生一族	金牛	减肥	创意设计	东方神起	红楼梦	耽美	情感生活	看书	星座运势	
1782335951	343关注	47粉丝	386微博		勋章信息	等级信息	Lv.13	当前等级:Lv.13经验值:1712距离升级需经验值:298	查看详情a		基本信息	昵称:勤劳niki	所在地:江苏南京	性别:男	注册时间:	2010-07-23	
1817698267	143关注	108粉丝	1020微博		勋章信息	等级信息	Lv.28	当前等级:Lv.28经验值:905距离升级需经验值:65	查看详情a		基本信息	昵称:机会_只留给有准备的人	所在地:河北	性别:女	简介:	自!信!点!好!嘛!被!拒!绝!又!不!会!死!	注册时间:	2010-09-10	
2008666405	149关注	567粉丝	120微博		勋章信息	等级信息	Lv.3	当前等级:Lv.3经验值:1418距离升级需经验值:72	查看详情a		勋章信息	等级信息	Lv.3	当前等级:Lv.3经验值:1418距离升级需经验值:72	查看详情a	
2336383102	480关注	647粉丝	12352微博		勋章信息	等级信息	Lv.37	当前等级:Lv.37经验值:19796距离升级需经验值:214	查看详情a		基本信息	昵称:Ho_1985	所在地:海外法国	性别:男	注册时间:	201-08-24	
5331375333	196关注	94粉丝	472微博		基本信息	昵称:四周型环绕	所在地:浙江	性别:女	生日:195年10月2日	简介:	:??取关你是为了眼球净化	注册时间:	2014-10-14	教育信息	大学:	浙江海洋大学	标签信息	标签:	八卦杂谈		勋章信息	等级信息	Lv.31	当前等级:Lv.31经验值:12934距离升级需经验值:146	查看详情a	会员信息	年	成长速度:15点/天	成长值:7540	下次升级:164天	会员特权:	立即开通会员独享尊贵生活体验!	查看详情a	
2336843871	32关注	409粉丝	18593微博		基本信息	昵称:米蛆不死不改名	所在地:上海闵行区	性别:女	生日:196年2月18日	简介:	每天骂街,不喜欢废物,对傻逼过敏。棒唯。	注册时间:	201-08-31		勋章信息	等级信息	Lv.32	当前等级:Lv.32经验值:13946距离升级需经验值:34	查看详情a	会员信息	成长速度:10点/天	成长值:20	下次升级:160天	会员特权:	立即开通会员独享尊贵生活体验!	查看详情a	
3899473063	350关注	90粉丝	297微博		勋章信息	等级信息	Lv.14	当前等级:Lv.14经验值:405距离升级需经验值:215	查看详情a		基本信息	昵称:奥巴牛哞	所在地:湖北恩施土家族苗族自治州	性别:男	简介:	人妖也是人^_^	注册时间:	2013-1-12	教育信息	高中:	乾县二中(209年)	
2260471457	235关注	630粉丝	286微博		达人信息	高级达人	积分:146.0,	↓	兴趣:	电影,音乐,时尚,	申请达人?	勋章信息	等级信息	Lv.26	当前等级:Lv.26经验值:8923距离升级需经验值:107	查看详情a	
3957953582	210关注	61粉丝	309微博		勋章信息	等级信息	Lv.14	当前等级:Lv.14经验值:5786距离升级需经验值:54	查看详情a		基本信息	昵称:中分看鼻子zw	所在地:安徽合肥	性别:女	生日:天秤座	简介:	面朝大海春暖花开	注册时间:	2013-12-28	教育信息	大学:	湖北师范学院(201年)	美术学院	标签信息	标签:	美容服饰	校园	
5508660937	26关注	35粉丝	284微博		勋章信息	等级信息	Lv.14	当前等级:Lv.14经验值:5756距离升级需经验值:574	查看详情a		基本信息	昵称:写不完论文不改名	所在地:内蒙古鄂尔多斯	性别:女	生日:196年1月14日	简介:	如果世界听不明白,对影子表白	注册时间:	2015-02-04	标签信息	标签:	读书分享	美食	名人明星	视频音乐	
5319493520微博大咖		8关注	8121粉丝	464微博		勋章信息	等级信息	Lv.2	当前等级:Lv.2经验值:6253距离升级需经验值:7	查看详情a	会员信息	成长速度:10点/天	成长值:2714	下次升级:89天	会员特权:	立即开通会员独享尊贵生活体验!	查看详情a		基本信息	昵称:哎呀逗先生	所在地:北京西城区	性别:男	个性域名:	htps://weibo.com/dbrj	简介:	微喜剧《哎呀逗先生》每天更新,欢迎关注!商务合作Q:15178538(同微信)	注册时间:	2014-10-07	工作信息	公司:	虾娱制片厂	标签信息	标签:	原创视频	逗比日记	搞笑幽默	
2133282105	50关注	950粉丝	3872微博		达人信息	黄金达人	积分:2646.2,	↓	兴趣:	音乐,文学,	申请达人?	勋章信息	等级信息	Lv.40	当前等级:Lv.40经验值:213距离升级需经验值:927	查看详情a		基本信息	昵称:凌煙枯蝶	所在地:江苏无锡	性别:女	生日:194年5月29日	个性域名:	htps://weibo.com/2745947	htps://weibo.com/imygb	简介:	同袍√道友√音乐√欢迎勾搭,朱箫日月温赤√不会主动取关,有的话是新浪的锅。要取关的请双向	注册时间:	201-05-13	联系信息	邮箱:[email protected]	Q:	1084912575	MSN:	[email protected]	标签信息	标签:	欧美流行音乐	不定期发神经	霹雳布袋戏	茶	传统文化	闽南语	粤语	汉服	TVB	纯音乐	
1979067641	31关注	537粉丝	390微博		达人信息	白银达人	积分:8371.6,	↓	兴趣:	摄影,旅游,时尚,	申请达人?	勋章信息	等级信息	Lv.31	当前等级:Lv.31经验值:12346距离升级需经验值:734	查看详情a		达人信息	白银达人	积分:8371.6,	↓	兴趣:	摄影,旅游,时尚,	申请达人?	勋章信息	等级信息	Lv.31	当前等级:Lv.31经验值:12346距离升级需经验值:734	查看详情a	
5677165111	75关注	12粉丝	39微博		勋章信息	等级信息	Lv.14	当前等级:Lv.14经验值:6729距离升级需经验值:231	查看详情a		基本信息	昵称:张小蟹GeminiFay	所在地:山东	性别:女	生日:197年5月2日	简介:	你年少正当,我也在尽力不辜负好时光。	注册时间:	2015-08-15		基本信息	昵称:张小蟹GeminiFay	所在地:山东	性别:女	生日:197年5月2日	简介:	你年少正当,我也在尽力不辜负好时光。	注册时间:	2015-08-15	

输出表样式:

模式表.xlsPOI操作Excel实例之将文本内容格式化导入Excel

问题分析:

我们需要解决两个问题:1.将微博数据.txt中的数据按照不同属性抽取出来;

                                       2.将抽取出来的数据按照Excel表中对应列的属性相应导入进去;

对于第一个问题,文档中每行内容大部分是按照固定属性顺序排列的,但仍有部分行不太规范,因此在文件内容读取过程中进行拆分判断处理的做法显然是不明智的,在这里之所以采用java中的正则表达式,与其强大的字符串模式-匹配和字符串模式-替换方面的优秀品质密不可分。在JDK 1.40版本中,java就已经初遇正则表达式,OK,那么接下来谈谈该怎么使用,首先需要引入java.util.regex包,在这里介绍下,在regex包中,包括了两个类,Pattern(模式类)和Matcher(匹配器类)。Pattern类是用来表达和陈述所要搜索模式的对象,Matcher类是真正影响搜索的对象。具体而言,Pattern类用于创建一个正则表达式,也可以说创建一个匹配模式,它的构造方法是私有的,不可以直接创建,但可以通过Pattern.complie(String regex)简单工厂方法创建一个正则表达式。而Matcher类的构造方法也是私有的,不能随意创建,只能通过Pattern.matcher(CharSequence input)方法得到该类的实例. Pattern类只能做一些简单的匹配操作,要想得到更强更便捷的正则匹配操作,那就需要将Pattern与Matcher一起合作.Matcher类提供了对正则表达式的分组支持,以及对正则表达式的多次匹配支持。

如果还是有些抽象,那么就以本程序中的“教育”属性的匹配为例,贴出代码和注解:

public static String SelectEducation(String line) {
		String patternEducation = "教育信息\\t(.*?)\\t标签信息"; // 把规则编译成模式对象,结合下面代码中的 MEducation.group(1);匹配出所在行里,前面有"教育信息"加空格,后面为标签信息的部分
		Pattern PEducation = Pattern.compile(patternEducation);// 把规则编译成模式对象
		Matcher MEducation = PEducation.matcher(line);// 通过模式对象得到匹配器对象
		if (MEducation.find()) {// 通过find方法就是查找有没有满足条件的子串
			return MEducation.group(1);// 提出第一个括号里的内容
		} else {
			return "无";
		}
	}

1.对于上面代码中出现的find函数,find()方法是部分匹配,是查找输入串中与模式匹配的子串,如果该匹配的串有组还可以使用oup()函数。

2.对于正则表达式的语法,这里给出正则表达式手册 :http://tool.oschina.net/uploads/apidocs/jquery/regexp.html 

3.对于group函数,下面贴出代码和注释进行讲解 :

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class GroupFun {

	public static void main(String[] args) {

		String str = "ThereIsAABC";
		Pattern pattern = Pattern.compile("A(B)(C)");
		Matcher matcher = pattern.matcher(str);
		while (matcher.find()) {
			System.out.println("Group(0)" + matcher.group(0));// 得到整个匹配
			System.out.println("Group(1):" + matcher.group(1));// 得到第一个括号内的匹配
			System.out.println("Group(2):" + matcher.group(2));// 得到第二个括号内的匹配,"括号"即为组,也就是子表达式
			System.out.println("Start(0):" + matcher.start(0) + " End 0:" + matcher.end(0));// 总匹配的索引
			System.out.println("Start(1):" + matcher.start(1) + " End 1:" + matcher.end(1));// 第一组匹配的索引
			System.out.println("Start(2):" + matcher.start(2) + " End 2:" + matcher.end(2));// 第二组匹配的索引
			System.out.println(str.substring(matcher.start(0), matcher.end(1)));// 从总匹配开始索引到第1组匹配的结束索引之间子串
		}
	}

}

运行结果:

Group(0):HTY  
Group(1):T  
Group(2):Y 
Start(0):8 End 0:11  
Start(1):9 End 1:10  
Start(2):10 End 2:11  
AB  

至此,将微博数据.txt中的数据按照不同属性抽取出来的问题便得以解决,下面是将每行对应的属性导入到excel中。

 

此时需要对Excel表格进行操作,需要引入POI的 jar包,下载地址为:https://poi.apache.org/download.html#POI-4.0.0

其中POI是是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。对于创建maven工程的项目,可添加依赖:

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>4.0.0</version>
</dependency>

其主要功能为四部分:

1.HSSF - 提供读写Microsoft Excel格式档案的功能。

2.XSSF - 提供读写Microsoft Excel OOXML格式档案的功能。

3.HWPF - 提供读写Microsoft Word格式档案的功能。

4.HSLF - 提供读写Microsoft PowerPoint格式档案的功能。

5.HDGF - 提供读写Microsoft Visio格式档案的功能。

而对于本程序中需要用到的对excel的操作中,POI中常用的四个对象和excel中的四个对象对应关系如下:

HSSFWorkbook Excel 工作簿workbook
HSSFSheet

Excel 工作表 sheet

HSSFRow

Excel 行

HSSFCell

Excel 单元格

 

 

 

 

 

 

 

 

import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import java.io.*;
import cn.zzu.vo.*;

public class Function {
	public static void main(String args[]) {
		User user = new User();
		HSSFWorkbook wb = new HSSFWorkbook();//创建工作簿
		HSSFSheet sheet = wb.createSheet("FirstSheet");//创建工作表
		sheet.setColumnWidth(0, 256 * 13);//设置第一列的单元格宽度	
		HSSFRow row = sheet.createRow(0);//创建行,行号作为参数传给createdRow方法,第一行从0开始计算
        row.createCell(0).setCellValue(user.getId());//设置第一列,第一行单元格的值
        row.createCell(1).setCellValue(user.getName());//设置第二列,第一行单元格的值

 

此时,模式表创建完成,开始导入数据,贴出代码:

try {
			File file = new File("./微博数据.txt");
			BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), "GBK"));
			String line = null;
			int i = 1;
			while ((line = br.readLine()) != null) {

				row = sheet.createRow(i);
				row.createCell(0).setCellValue(SelectTarget.SelectId(line));
				row.createCell(1).setCellValue(SelectTarget.SelectName(line));
				row.createCell(2).setCellValue(SelectTarget.SelectPlace(line));
				row.createCell(3).setCellValue(SelectTarget.SelectSex(line));
				row.createCell(4).setCellValue(SelectTarget.SelectBirthday(line));
				row.createCell(5).setCellValue(SelectTarget.SelectCompany(line));
				row.createCell(6).setCellValue(SelectTarget.SelectEducation(line));
				row.createCell(7).setCellValue(SelectTarget.SelectLabel(line));
				row.createCell(8).setCellValue(SelectTarget.SelectQualification(line));
				row.createCell(9).setCellValue(SelectTarget.SelectFocus(line));
				row.createCell(10).setCellValue(SelectTarget.SelectFans(line));
				row.createCell(11).setCellValue(SelectTarget.SelectNumbers(line));
				row.createCell(12).setCellValue(SelectTarget.SelectLevel(line));
				row.createCell(13).setCellValue(SelectTarget.SelectExperience(line));
				i++;

			}
			br.close();

			FileOutputStream out = new FileOutputStream("./模式表.xls");
			wb.write(out);
			out.close();

			wb.close();
		} catch (Exception e) {
			e.printStackTrace();
		}

至此,程序完成,下面贴出输出结果:

POI操作Excel实例之将文本内容格式化导入Excel