史上最简单的Excel导入通讯录方法
Posted microhex
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了史上最简单的Excel导入通讯录方法相关的知识,希望对你有一定的参考价值。
开发记录
第一天
说来话长,这是一个悲伤的故事。
事情的起因,是因为魔都我被封在家里,寂寞难耐的心始终不知道该干点啥,然后就撩起了当设计师的妹子,正巧那天晚上妹子也在电脑旁,和我有一句没一句的在聊天。聊了大概差不多半小时吧,她突然来了句,你不是程序员吗?我说是呀,怎么了,是不是很崇拜程序员啊?她说是呀,那你能不能帮我做个事情啊?我老脸一红,来了句,说吧,啥事都小菜一碟。我当时觉得多年的摸鱼工作,只要这一秒我是无比勤奋的,因为我在主动揽需求,这对一个很懒的程序员来说,是不可想象和难以理喻的。
然后她给我了我一张表格(下图),说里面有姓名和电话,能帮我导入到手机通讯录吗?
我想这个简单啊,有个思路瞬间在脑海里面形成了:
- 找一个Excel的解析库,解析Excel表格,获取到 ”业主姓名“列 和 ”联系电话“列,存储起来;
- 将“业主姓名”和”联系电话“写到 vcf 文件中;
- 手机打开直接 ”vcf“ 文件,自动导入到通讯录。
我看了看妹子给的 Excel 的行数
也就500多行,那还是写个程序吧,简单快速直接,然后直接对妹子说,我先写个程序吧,这些数据你就不要弄,明天程序都给你弄完,她满心欢喜的答应了。然后我开始连夜肝代码了:
下载一个 poi-3.12-android.jar 包,解析 Excel代码,设计Bean类,查看”vcf“文件格式:
BEGIN:VCARD
FN:$userName
TEL;type=CELL;type=VOICE;type=pref:$userPhone
CID:12319380073
UID:12319380073
VERSION:3.0
END:VCARD
这个好办,只需要把解析的 业主姓名 和 联系电话 填入到 ”userName“ 和 "userPhone"中,整个代码肝完差不多就花了两个小时,乐呵呵的关上了电脑,心想着明天妹子看到了会不会夸我牛批,夸我天才,夸我大佬,哈哈哈,心满意足的去睡觉了。
第二天
第二天我起得比狗都早,就给妹子发微信,说我程序已经写好了,你把Excel表格发给我吧,我马上给你转。大概过了2小时7分钟12秒,妹子羞答答的来了句这么早,小哥哥你真优秀。顿时我感觉昨晚两个小时干的值得了,我真是牛大了。然后她这样:
啥房号+姓名,我顿时感觉有点不妙,连忙打开她给我的Excel文件:
他需要的是这两例,可是我代码里面就默认取第一例和第二例,吹牛吹大了,咋办,拿过Excel文件之后,乘着妹子还没上班,我对妹子说,给我点时间,我要改一下代码了,这个Excel文件和昨晚说的Excel文件不太一致,有兼容性问题,妹子哦了一句,我立马打了鸡血,赶紧又开始造代码了,经过一上午的功夫,加上自己的聪明和努力,终于写成功了:
为啥觉得自己聪明了,这次我自己写了个自定义的,你想什么拿列作为名称,自己选!然后我还贴心的加了一些间隔符,比如你此时选择 ”房号“ + ”业主姓名“,那么只需要:
- 先选中房号列;
- 选中间隔符 ”+“ ;
- 最后选中业主姓名列
此时我再一次感觉自己非常聪明,如果电话列也存在多项怎么办,比如可能是这样:
那么我是不是也应该将电话号码设置成可以多选项:
综合起来就是这样了:
把这个干完了,就差不多一上午过去了,终于完成了小姐姐的要求,然后给她做好了,发送给她了:
中间差不多隔了5个多小时,出去自己吃饭,拉屎,摸鱼剩下还差不多三小时,撸完了这些需求,顿时感觉自己就是个天才,哈哈哈。
第三天
小姐姐见我干活麻利又勤奋,这几天态度格外的好,对我也是甜言蜜语,搞得我蛮激动的,心想着这不又和妹子近了一步啊。突然下午时分,她突然告诉我,这个软件好像用不了,然后搞得我很紧张,让她赶忙把Excel表格发给我,我看看什么情况:
问题不仅出现在内容上,还出现在Excel的格式上面,我所设计的Excel表格应该是标准的,但这个明显是存在问题的,因为它有表头,表头也是合并单元格之后的,如果用标准格式的方式去解析的话,这个肯定是存在问题的。当然,这个需求显然是超出我的软件解析范围的,因为1000个哈姆雷特就有1000种Excel表格,鬼知道你给我的表格是什么样式的。虽然我知道很多开发者后端有个叫做模版的东西,就是你下载一个Excel模版,然后按照这个模版你往上填就行了。但是我是Mobile Phone的开发人员的,别人都要用电脑操作了,怎么体现我的牛批之处呢?
本来想直接怼妹子说,这个实现不了,要使用这个软件,你的Excel必须按照我的要求去做,规范且统一。但是我天生脸皮薄,特别是针对自己喜欢的女生,我就更不喜欢说实现不了,那怎么办呢?我对妹子说,我的软件好像有些不兼容
,我想想办法去解决一下,这种复杂的Excel结构我要点时间。在自己的热情坚持之下(翻了一些市面上的App的实现方式),我想到了一种解决方案:那就是用户自定义Excel解析的起始行和起始列
,大致的思路看如下草图:
然后就是枯燥的编码过程了,实现思路就是解析Excel表格,然后封装一下,展示在UI之上了:
在用户选中行与列(这里没有表现出来)之后,我们记录下来,然后在接下来的逻辑中,我们遍历Excel的行与列时,直接跳过这些列即可:
// 跳过sheet header
var currentIndex = 0
while (currentIndex ++ < offsetIndex && rowIterator.hasNext())
rowIterator.next()
其它代码基本上不需要改变,这个逻辑写完之后,我感觉能覆盖大多数人的Excel逻辑了,代价只是用户自己手动选择几步,选择你需要开始多的列与行了。
第四天
在完成了以上的需求之后,小姐姐对我的态度真是越来越好了,那时候我觉得如果我们的产品经理是女生,我感觉我们都能写淘宝和微信了(尴尬多的笑了笑)。也许是因为喜欢女孩子的缘故吧,这几天做事感觉都贼认真,哈哈哈。这不,心爱的小姐姐又给我一个Excel表格:
对,你可以看到,这个Excel是多 Sheet
逻辑的。这个缺陷呢,又是自己当初没有想到过的,不过幸好这并不是一个大问题,使用相关的API基本上就能完成:
val size = workbook.numberOfSheets
for (index in 0 until size)
// 获取第Index个sheet
val currentSheet = workbook.getSheetAt(index)
第N天
可以预计,随着小姐姐需求的增多,这个软件的功能将越来越复杂,也会越来越强大,而我的头发也终将越来越少。这个也算是自己一个小工具的开发记录吧。下面也说说自己这次开发的体会了:
- 自己独立开发需要本着一个朴素、学习的方式去做事的,前期不需要过度设计,需要做的就是简简单单实现一个功能即可。
- 一开始不可能会想到所有可能的情况,现实和心中所想总会有出入,这时候需要自己快速的调整,不要害怕问题出现,而且快速去解决问题。
- 找个妹子吧,那会让开发更快,请相信我。
本来是打算开源出去的,只不过最近这个小工具有些公司代码,需要剥离出去,可能需要等一段时间了。如果您生活工作中有需要用得到这个功能的,您可以联系我(备注Excel),我也可以为您提供转换的功能:
以上是关于史上最简单的Excel导入通讯录方法的主要内容,如果未能解决你的问题,请参考以下文章
android 史上最简单易懂的跨进程通讯(Messenger)!
史上最简单的SpringCloud教程 | 第八篇: 消息总线(Spring Cloud Bus)