本文微信公众号「AndroidTraveler」首发。html
时值毕业季,不少毕业生初入职场。java
所以,这边也写了一些新手相关的 Android 技术点。git
好比上一篇的 Android 开发你须要了解的那些事 就是列举了一些小点,避免新手 Android 开发者踩坑。github
同时,也是恰逢暑假,所以大学生处于放假阶段。apache
这一篇主要是来自一位大学生的提问。微信
所以这边分享一下我我的的解题思路和方法,但愿可以对他有所启发。框架
欢迎你们交流分享。ide
使用语言:JAVA函数
需求:读取一个Excel表格里面的数据(例如:姓名+分数),对其进行从新排序(按分数高低),而后输出在另外一个Excel表格。this
通常对需求咱们都采起拆分思惟。
将大问题拆成小问题,小问题解决了,整个大问题也就解决了。
这个需求很明确,须要解决三个问题:
咱们这里要求使用 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 库。
下载连接地址:poi.apache.org/download.ht…
写这篇文章时使用到的版本是 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 包不要引入错位置了:
固然,还有几个待完善的点须要说明下:
另外说一下有什么应用场景吧,其实还真有。
若是你有想了解的知识点,欢迎公众号留言私信,也许下一个 pick 的就是你。
源码获取地址:
github.com/nesger/Java…
参考连接:
Java读取Excel数据:基于Apache POI(一)
Java读取和解析Excel数据:基于Apache POI(二)
Java导出数据行写入到Excel表格:基于Apache POI