本文微信公众号「androidtraveler」首发。
时值毕业季,很多毕业生初入职场。
因此,这边也写了一些新手相关的 android 技术点。
比如上一篇的 android 开发你需要了解的那些事 就是列举了一些小点,避免新手 android 开发者踩坑。
同时,也是恰逢暑假,因此大学生处于放假阶段。
这一篇主要是来自一位大学生的提问。
因此这边分享一下我个人的解题思路和方法,希望能够对他有所启发。
欢迎大家交流分享。
使用语言:java
需求:读取一个excel表格里面的数据(例如:姓名+分数),对其进行重新排序(按分数高低),然后输出在另一个excel表格。
一般对需求我们都采取拆分思维。
将大问题拆成小问题,小问题解决了,整个大问题也就解决了。
这个需求很明确,需要解决三个问题:
我们这里要求使用 java 语言,而 java 语言一个很重要的点就是面向对象。
因此首先我们要考虑一下,这个题目里面有哪些类需要我们创建。
大概可以想象需要下面这些类:
读取数据类:excelreader
写入数据类:excelwriter
数据排序类:由于 java api 自带,所以不需要重复造轮子
数据模型类:studentscore
启动类:parserstart,带有 main 方法
大概的 uml 图如下:
此时我们可以写出 v0.1 代码:
excelreader.java:
import java.util.list; public class excelreader { public list<studentscore> read(string filename) { //todo return null; } }
excelwriter.java:
import java.util.list; public class excelwriter { public void write(string filename, list<studentscore> list) { //todo } }
studentscore.java:
public class studentscore { private string name; private int score; public studentscore(string name, int score) { super(); this.name = name; this.score = score; } public string getname() { return name; } public void setname(string name) { this.name = name; } public int getscore() { return score; } public void setscore(int score) { this.score = score; } }
parserstart.java:
import java.util.list; public class parserstart { public static void main(string[] args) { // 第一步:读取数据 list<studentscore> datalist = new excelreader().read("input.xls"); // 第二步:排序 //todo // 第三部:写入数据 new excelwriter().write("output.xls", datalist); } }
好了,基本框架搭好了。接下来就一步一步来实现我们的方法。
v0.2 代码:完善 excelreader 的 read 方法
excel 的读取方法有第三方的库可以使用,因此我们不需要自己写。
我们这里使用的是第三方的 apache 提供的 poi 库。
下载链接地址:https://poi.apache.org/download.html
写这篇文章时使用到的版本是 4.1.0
解压然后将 jar 包引入 eclipse 项目即可。
接下来就是实际编写代码了,详情见注释。
我们要读取的文件示例如下:
excelreader.java:
import java.io.file; import java.io.ioexception; import java.util.arraylist; import java.util.list; import org.apache.poi.encrypteddocumentexception; import org.apache.poi.ss.usermodel.row; import org.apache.poi.ss.usermodel.sheet; import org.apache.poi.ss.usermodel.workbook; import org.apache.poi.ss.usermodel.workbookfactory; public class excelreader { public list<studentscore> read(string filename) throws encrypteddocumentexception, ioexception { if (filename == null) return null; file xlsfile = new file(filename); if (!xlsfile.exists()) return null; // 工作表 workbook workbook = workbookfactory.create(xlsfile); // 表个数 int numberofsheets = workbook.getnumberofsheets(); // system.out.println(numberofsheets); if (numberofsheets <= 0) return null; list<studentscore> list = new arraylist<>(); //我们的需求只需要处理一个表,因此不需要遍历 sheet sheet = workbook.getsheetat(0); // 行数 int rownumbers = sheet.getlastrownum() + 1; // system.out.println(rownumbers); studentscore score; // 读数据,第二行开始读取 for (int row = 1; row < rownumbers; row++) { row r = sheet.getrow(row); // system.out.println(r.getphysicalnumberofcells()); //我们只需要前两列 if (r.getphysicalnumberofcells() >= 2) { score = new studentscore(r.getcell(0).tostring(), (int) double.parsedouble(r.getcell(1).tostring())); list.add(score); } } return list; } }
v0.3 代码:对读取后的数据做排序处理
在 v0.2 版本中,我们成功读取了数据,但是我们读取的数据是按照 excel 里面的顺序的,因此我们需要做排序处理。java 函数库有对集合进行排序的方法。不过我们需要对 model 进行额外处理,添加排序规则。因为排序可以是从小到大排,也可以是从大到小排。
studentscore.java:
public class studentscore implements comparable<studentscore>{ private string name; private int score; public studentscore(string name, int score) { super(); this.name = name; this.score = score; } public string getname() { return name; } public void setname(string name) { this.name = name; } public int getscore() { return score; } public void setscore(int score) { this.score = score; } @override public string tostring() { return "studentscore [name=" + name + ", score=" + score + "]"; } @override public int compareto(studentscore o) { return o.score - this.score; } }
parserstart.java:
import java.util.collections; import java.util.list; public class parserstart { public static void main(string[] args) throws exception{ // 第一步:读取数据 list<studentscore> datalist = new excelreader().read("resource/input.xls"); system.out.println(datalist); // 第二步:排序 collections.sort(datalist); system.out.println(datalist); // 第三部:写入数据 // new excelwriter().write("output.xls", datalist); } }
v0.4 代码:将排序后的数据写入另一个 excel 表中
在 v0.3 版本中,我们完成了数据的排序,接下来我们需要将排好序的数据写到 output.xls 中。
excelwriter.java
import java.io.file; import java.io.ioexception; import java.util.list; import org.apache.poi.hssf.usermodel.hssfrow; import org.apache.poi.hssf.usermodel.hssfsheet; import org.apache.poi.hssf.usermodel.hssfworkbook; public class excelwriter { public void write(string filename, list<studentscore> list) { hssfworkbook workbook = new hssfworkbook(); hssfsheet sheet = workbook.createsheet("studentscore"); // 创建excel标题行,第一行 hssfrow headrow = sheet.createrow(0); headrow.createcell(0).setcellvalue("姓名"); headrow.createcell(1).setcellvalue("分数"); // 往excel表中遍历写入数据 for (studentscore studentscore : list) { createcell(studentscore, sheet); } file xlsfile = new file(filename); try { // 或者以流的形式写入文件 workbook.write(new fileoutputstream(xlsfile)); workbook.write(xlsfile); } catch (ioexception e) { // todo } finally { try { workbook.close(); } catch (ioexception e) { // todo } } } // 创建excel的一行数据。 private void createcell(studentscore studentscore, hssfsheet sheet) { hssfrow datarow = sheet.createrow(sheet.getlastrownum() + 1); datarow.createcell(0).setcellvalue(studentscore.getname()); datarow.createcell(1).setcellvalue(studentscore.getscore()); } }
parserstart.java
import java.util.collections; import java.util.list; public class parserstart { public static void main(string[] args) throws exception { // 第一步:读取数据 list<studentscore> datalist = new excelreader().read("resource/input.xls"); system.out.println(datalist); // 第二步:排序 collections.sort(datalist); system.out.println(datalist); // 第三部:写入数据 new excelwriter().write("resource/output.xls", datalist); } }
到此,通过几个版本的迭代,我们的需求就实现了。
note:
在本项目中,input.xls 放在 resource 文件夹下面。所以最终版本传入的路径是 resource/input.xls。另外输出的时候这边发现 eclipse 没有显示出来 output.xls,需要刷新一下。
此外,下载我的项目运行验证时,可能需要修改下 jre。
另外 jar 包不要引入错位置了:
当然,还有几个待完善的点需要说明下:
另外说一下有什么应用场景吧,其实还真有。
移动端有多语言,想象一下产品给你一张带有多语言的 excel 表。
如果你一个一个拷贝到多个语言的资源文件下,这效率难以想象。
而如果你用了这一节的内容,分分钟读取 excel 按照你要的规则组装后输出到控制台。
想想就有点 6 啊。
好了,本期内容到此结束,欢迎留言交流讨论。
如果你有想了解的知识点,欢迎公众号留言私信,也许下一个 pick 的就是你。
源码获取地址:
https://github.com/nesger/javasamples/tree/master/parseexcel
参考链接:
java读取excel数据:基于apache poi(一)
java读取和解析excel数据:基于apache poi(二)
java导出数据行写入到excel表格:基于apache poi
如对本文有疑问, 点击进行留言回复!!
[JVM学习之路]一、初识JVM,了解其结构、模型及生命周期
【JAVA并发编程】LinkedBlockingQueue原理
网友评论