Jxl操作Excl文檔進行彙總

       昨天,也就是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;
		}
	}

}

先看一下源文件之一:

 

測試 

 

最後看一下成功的:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章