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
输出表样式:
模式表.xls
问题分析:
我们需要解决两个问题: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 |
|
|
HSSFRow |
|
|
HSSFCell |
|
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();
}
至此,程序完成,下面贴出输出结果: