本文微信公衆號「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