從txt文件逐行讀取數據到excel文件(包含POI的簡單使用和excel文件的數據分列,出現次數統計)

公司需要一個統計一下一個txt文本中  黑體字部分不同數據出現的次數  ,把結果做成excel文件交上去。txt內容就像下面的:


想了一下大概涉及這幾個方面:1.黑體字的提取  2.黑體字的去重 3.出現次數的統計

涌入腦中的方案有三個:

a.直接上java代碼,用IO流處理文本,逐行獲取後截取字符串,在進行重複的邏輯判斷,同時記錄下來出現了多少次------太麻煩

b.截取字符串後,存到數據庫中,使用distinct和count函數處理-----也麻煩

c.直接逐行寫入excel,再進行excel方面的處理-----這個還不錯,因爲a和b最後還是需要記錄到excel中

決定後考慮了下總體的邏輯,如下:

第一部分:txt到xls

/*
 * 需求:把txt文件按照每行內容寫入excel文件
 * 步驟:
 * 	1.讀取txt文件----getTxt方法
 * 	2.創建excel文件,創建sheet----getFactory方法
 * 	3.創建row,循環創建cell,並把內容寫入---writeTxtToExcel方法
 */
第二部分:xls操作

/*
 * 需求:統計不同數據的出現次數
 * 步驟:
 * 	1.分裂出黑體字部分
 * 	2.去除重複
 * 	3.統計出現次數
 */

過程下來還是挺快的,就是有些小坑

第一部分詳細:

獲取txt方法

	//讀取txt文件
	public BufferedReader getTxt(String txtPath){
		try {
			File file = new File(txtPath);
			BufferedReader br = new BufferedReader(new FileReader(file));
			return br;
		} catch (Exception e) {
			System.out.println("解析txt文件有誤");
			e.printStackTrace();
		}
		return null;
	}

創建xls中的factory方法-----引入的是poi-ooxml包,3.15版本。處理excel不止這一種包

	//創建excel文件中的factory
	public Workbook getFactory(String excelPath){
		Workbook book = null;
		try {
			
			book = new HSSFWorkbook();
		} catch (Exception e) {
			System.out.println("創建excel文件失敗");
			e.printStackTrace();
		}
		return book;
	}

內容寫入writeTxtToExcel方法

//創建row,循環創建cell,並把內容寫入
	public void writeTxtToExcel(String txtPath,String excelPath){
		try {
			BufferedReader br = getTxt(txtPath);
			String str = null;
			int index = 0;//標記excel文件寫入時的換行
			Workbook factory = getFactory(excelPath);
			Sheet sheet = factory.createSheet();
			sheet.setColumnWidth(0,50*256);//設置列寬---50個字符寬
			//把讀取到的每行數據寫入sheet
			while((str = br.readLine()) != null){//逐行讀取,判斷的同時賦值
				Cell cell = sheet.createRow(index).createCell(0);//寫入第一列的所有行
				if(StringUtils.isNotEmpty(str)){
					System.out.println(str);
					cell.setCellValue(str);
				}
				index++;
			}
			//把sheet寫入excel文件
			OutputStream os = new FileOutputStream(excelPath);
			factory.write(os);
			
			os.close();
		} catch (Exception e) {
			System.out.println("內容寫入失敗");
			e.printStackTrace();
		}
	}

這個方法中有個問題還沒搞明白:逐行讀取的str值set進cell中之前有個判斷,打印出來的str結果是不包含空行的,但是寫入excel的數據死活都有空行,試了很多遍都不行

當然了,也可以再寫一些方法,比如:給數據插入標題,單元格樣式設置等等。上頭等着要數據,我就沒弄。


測試方法:我是使用的spring提供的測試。用main方法也行,但是方法注意static關鍵字

@Test
public void test02(){
	String txtPath = "d:/lung/openID.txt";//已存在的txt文件路徑
	String excelPath = "d:/lung/openID.xls";//要創建的excel文件路徑
	writeTxtToExcel(txtPath, excelPath);
	System.out.println("寫入完畢");
}
這裏說明一下,我創建的格式是xls格式。如果是xlsx格式,offer打開報錯,使用wps兩種都可以打開,說是offer版本的問題

結果如圖:


至此,從txt寫數據到excel的功能實現了。

----------------------------------------------------------------------------------------------------------------------------------------

第二部分詳細:

去除空行:

我使用的是比較笨的方法:找的excel中的“篩選”--->只選擇 “空白”,如圖:


空白行已經單獨標出來了,選中這些行,刪除行就行了


分裂出黑體部分:

選中A列,找到“數據”中的“分列”---->“分隔符號”--->”其他“,輸入” . “。因爲數據中的黑體部分正好有個”  .  “。然後刪除A列就行了




去除重複:

複製這些數據到隔壁列B列,選中B列後,找到 “去除重複值”,確定即可


統計出現次數:

在C1格輸入 “=countif(a1:a41,b1)”------說明:countif方法,兩個參數:原始數據的開始和結束位置;要找出現次數的數據所在位置。回車

複製C1格後,選中C列,右鍵選中 粘貼中的 “選擇性粘貼”--->“公式”即可

最後手動加個標題就好看些


至此,數據的統計工作也完成了



總結:

1.讀取和寫入文件時,最好路徑名命名清楚,不然容易混淆

2.如果想再往已經有數據的excel中添加數據,只要稍加修改writeTxtToExcel方法即可

3.其他的好像沒什麼了




LG

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