昨天,也就是2019年1月2日下午下課時,那是老鄧上我們最後的一節課,在下課結束的幾分鐘裏,老師統計了一下本學期大家上課遲到早退曠課等情況,用的是極域電子教室豪華版,每次簽到都會在教師機上面生成一個xls,記錄大家的簽到情況,那麼對應的,上10天課,那麼就會生成10個xls文件,每個文件裏面要統計每個同學的到課遲到等情況,老師一定是嫌麻煩了,把這個鍋扔給我了哈哈,說班上哪個同學java學得好,老師帶着笑容望向我,暗示的比較瘋狂啊,這是一個鍛鍊的好機會,當然答應了。
老師的要求,統計所有的表格,然後創建一個新的表格,包含的標題有六個,分別是“學號、姓名、準時到達、遲到、早退、彙總(到達次數)”,好了,不廢話了,直接開始,反正代碼裏面有註釋。
先準備好工具類:
package com.utils;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;
public class ExcleUtils {
public static String splitStr = "-";
/**
* 傳入一個數組,使用“-”變成字符串返回
* @author czs
* @param array 需要轉換的數組
* @return 如果傳過來的是[1,2,3]那麼返回來的是"1-2-3"
*/
public static String arrayToString(String[] array){
StringBuffer result = new StringBuffer();
for (int i = 0; i < array.length; i++) {
result.append(array[i]);
if (i != array.length - 1) {
result.append(splitStr);
}
}
return result.toString();
}
/**
* 指定某個字符串數組中的某個索引加加操作
* @param stringArray
* @param index
* @return
*/
public static String addByIndex(String stringArray, int index){
// 轉換成爲數組字符串
String[] tempStrings = ExcleUtils.stringToArray(stringArray);
// 指定某個加加
int num = Integer.parseInt(tempStrings[index]);
int num1 = ++num;
tempStrings[index] = new Integer(num1).toString();
// 最後再轉換成爲字符串返回
return ExcleUtils.arrayToString(tempStrings);
}
/**
* 傳入一個字符串,使用“-”變成數組返回
* @author czs
* @param string 需要轉換成數組的字符串
* @return 數組
*/
public static String[] stringToArray(String string){
return string.split(splitStr);
}
/**
* 追加excel
* @param file 文件
* @param args 添加的參數數組
* @throws BiffException
* @throws IOException
* @throws RowsExceededException
* @throws WriteException
*/
public static void addExcelRow(File file, String[] args)
throws BiffException, IOException, RowsExceededException, WriteException {
Workbook book = Workbook.getWorkbook(file);
Sheet sheet = book.getSheet(0);
// 獲取行
int length = sheet.getRows();
WritableWorkbook wbook = Workbook.createWorkbook(file, book); // 根據book創建一個操作對象
WritableSheet sh = wbook.getSheet(0);// 得到一個工作對象
// 從最後一行開始加
for (int i = 0; i < args.length; i++) {
Label label = new Label(i, length, args[i]);
sh.addCell(label);
}
wbook.write();
wbook.close();
}
public static void main(String[] args) {
String[] aa = {"1","2","2","2","4"};
new ExcleUtils();
// 數組轉成字符串
System.out.println(ExcleUtils.arrayToString(aa));
new ExcleUtils();
new ExcleUtils();
// 字符串轉換成數組
System.out.println(ExcleUtils.stringToArray(ExcleUtils.arrayToString(aa))[0]);
// 初始化集合
Map<String, String> m1 = new HashMap<String, String>();
// 賦值到集合
m1.put("1", "1-2-3-4-5-6");
// 取出來並更改
String[] temp = stringToArray(m1.get("1"));
temp[0]="10";
m1.put("1", arrayToString(temp));
// 存回去
for (String string : m1.keySet()) {
System.out.println("key:" + string + "\tvalue:" + m1.get(string));
}
}
}
程序的入口類在此:
package com.begin;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import javax.swing.filechooser.FileSystemView;
import com.utils.ExcleUtils;
import jxl.Sheet;
import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
/**
* @author czs
*
* 思路:
* 循環讀取某文件夾裏面的所有xls文件
* 每次循環中記錄學號對應的六種情況到map集合中,集合key就爲學號,value爲一個未用“-”格式化的String數組,如key:201602040203,value:0-2-0-0-2
* 創建一個xls文件
* 循環彙總的map們,將學號對應的值取出來寫入到單元格
*
* @version 創建時間:2019年1月2日 下午5:58:32
*/
public class Begin {
// 初始化學號、姓名、準時到達、遲到、早退、彙總六個數據集合,由於key是學號,學號是屬於數字類,已經超過int、long等,所以採用String類型
static Map<String, String> count = new HashMap<String, String>();
public static void main(String[] args) {
// 循環讀取文件並記錄到map,參數爲文件們的路徑,可以是絕對路徑也可以是程序的相對路徑
Scanner scanner = new Scanner(System.in);
System.out.println("輸入文件們的路徑按下回車開始!如:G:\\exclePro\\excle\\resource");
String filesPath = scanner.next();
scanner.close();
readerXls(filesPath);
// 手動輸入路徑
// readerXls("excle/resource/");
// 是時候創建了
if (createResult()) {
System.out.println("表格已經導出到了桌面,名爲excle.xls");
}else {
System.out.println("導出失敗,請按照上面的提示檢查!");
}
}
/**
* 循環讀取文件並記錄到map
* excle表格中的標題從0開始數起
* 學號 姓名 性別 班級 院系 計算機名稱 IP 地址 簽到時間 註釋
* 0 1 2 3 4 5 6 7 7 8
* 學號、姓名、準時到達、遲到、早退、彙總
* key 0 1 2 3 4
* 表格中的註釋有準時到達和遲到兩種可能
* @param filesPath 文件們的路徑,可以是絕對路徑也可以是程序的相對路徑
*
*/
public static void readerXls(String filesPath) {
try {
File files = new File(filesPath);
for (File file : files.listFiles()) {
if (!file.getName().contains(".xls")) {
continue;
}
Workbook book = Workbook.getWorkbook(file);
// 獲得第一個工作表對象
Sheet sheet = book.getSheet(0);
// 得到第一列第三行的單元格Cell cell1 = sheet.getCell(0, 3);
// 獲取單元格
for (int i = 0; i < sheet.getRows(); i++) {// 獲取行
if (0 == sheet.getCell(0, i).getContents().trim().length()) {
// 直接跳過空行
continue;
} else if (sheet.getCell(0, i).getContents().equals("學號")) {
continue;
}
// 先獲取學號
String xh = sheet.getCell(0, i).getContents();// 表格中的學號
String xm = sheet.getCell(1, i).getContents();// 表格中的姓名
String zs = sheet.getCell(8, i).getContents();// 表格中的註釋
// 記錄學號,但是在此之前先要判斷map中是否已經存在過了,不存在初始化最後一個數組爲1,否則加1
if (!count.containsKey(xh)) {
// 第一次,記錄到map集合,初始化key爲學號,第一個爲姓名,最後一個彙總爲1
count.put(xh, xm + "-0-0-0-0");
}
// 開始記錄準時到達、遲到、早退等情況
if (-1 != zs.indexOf("準時到達")) {
count.put(xh, ExcleUtils.addByIndex(count.get(xh), 1));
}
if (-1 != zs.indexOf("遲到")) {
count.put(xh, ExcleUtils.addByIndex(count.get(xh), 2));
}
if (-1 != zs.indexOf("早退")) {
count.put(xh, ExcleUtils.addByIndex(count.get(xh), 3));
}
// 不管怎樣都要彙總
count.put(xh, ExcleUtils.addByIndex(count.get(xh), 4));
}
book.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 是時候導出結果了
*/
public static boolean createResult() {
// 創建一個excle文件
try {
// 創建Excle結果文件
File resultFile = new File(FileSystemView.getFileSystemView() .getHomeDirectory().getAbsolutePath()+"/result.xls");
WritableWorkbook book = Workbook.createWorkbook(resultFile );
// 生成名爲“第一頁”的工作表,參數0表示這是第一頁
WritableSheet sheet = book.createSheet("第一頁", 0);
// 在Label對象的構造子中指名單元格位置是第一列第一行(0,0)
// 以及單元格內容爲test
Label[] titleLabels = { new Label(0, 0, "學號"), new Label(1, 0, "姓名"), new Label(2, 0, "準時到達"),
new Label(3, 0, "遲到"), new Label(4, 0, "早退"), new Label(5, 0, "彙總") };
// 將定義好的單元格添加到工作表中
for (Label title : titleLabels) {
sheet.addCell(title);
}
// 從最後一行開始加 列 行
for (String xh : count.keySet()) {
int lenthRowIndex = sheet.getRows();
String[] aStrings = ExcleUtils.stringToArray(xh + "-" + count.get(xh));
Label[] newRow = { new Label(0, lenthRowIndex, aStrings[0]), new Label(1, lenthRowIndex, aStrings[1]),
new Label(2, lenthRowIndex, aStrings[2]), new Label(3, lenthRowIndex, aStrings[3]),
new Label(4, lenthRowIndex, aStrings[4]), new Label(5, lenthRowIndex, aStrings[5]) };
// 將定義好的單元格添加到工作表中
for (Label title : newRow) {
sheet.addCell(title);
}
}
// 寫入數據並關閉文件
book.write();
book.close();
return true;
} catch (Exception e) {
System.out.println(e.getMessage());
if (e.getMessage().contains("另一個程序正在使用此文件,進程無法訪問")) {
System.out.println("解決方案:關閉打開了本類生成的excle表程序");
}
return false;
}
}
}
先看一下源文件之一:
測試
最後看一下成功的: