1. 程式人生 > >有選擇讀取word表格中的資料並寫入excel檔案中

有選擇讀取word表格中的資料並寫入excel檔案中

  • 最近學院要舉行科技報告會活動,許多同學積極參與,交了許多報名表到我這裡,而我需要將這些資訊進行彙總,整理出一個excel表格,看著一個個word檔案放在我的工作資料夾中頭髮發麻,這一個個的整理好麻煩,不但速度慢而且容易出錯,我就想用程式設計自動替我讀取資料並寫入目標檔案。結果還真讓我寫成了,下面一一講解步驟:

  • 問題描述:如下圖所示,我需要提取姓名、學號、合作者、學院及專業、聯絡方式、指導老師、參選題目這幾欄的資訊。 在這裡插入圖片描述

  • 步驟一:下載POI外掛 POI:下載地址;我所使用的是poi-3.10-FINAL。建好java工程後右鍵點選,選擇配置選項,按照下面圖片步驟。 在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述

  • 程式碼解釋

package readInformation;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.poi.POIXMLProperties.CoreProperties;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.usermodel.Paragraph;
import org.apache.poi.hwpf.usermodel.Range;
import org.apache.poi.hwpf.usermodel.Table;
import org.apache.poi.hwpf.usermodel.TableCell;
import org.apache.poi.hwpf.usermodel.TableIterator;
import org.apache.poi.hwpf.usermodel.TableRow;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;


/*
 * function:讀取參賽作品登記表中的姓名、學號、聯絡方式、專業、合作者、參選題目、指導老師
 * 
 * 
 * 使用這段程式碼需要兩個前提條件:
 * 	1:載入poi-3.10-FINAL資料夾中的jar擴充套件包
 * 	2:word版本必須在2007以上,格式和樣本一樣
 * 這兩步可以看使用手冊
 */

public class readFile {
	private static FileOutputStream out = null ;
	private static FileInputStream in = null ;
	private static String filePathDir = "C:\\Users\\wangjunzuo\\Desktop\\ll";  //word檔案存放的資料夾 絕對路徑
	public static HSSFWorkbook workbook = null;
	
	/*
	 * 進行檔案的第一行便籤寫入,就是excel檔案的第一行:姓名、學號、聯絡方式等等
	 */
	public static void creatLables(String[] labels,String worksheet) throws IOException {
		out = new FileOutputStream("result.xls"); 
		workbook = new HSSFWorkbook();
		HSSFSheet sheet1 = workbook.createSheet(worksheet); 
		HSSFRow rw = workbook.getSheet(worksheet).createRow(0);
		for(int i=0;i<labels.length;i++) {
			 HSSFCell ce = rw.createCell(i);  
             ce.setCellValue(labels[i]);  
		}
		workbook.write(out);
		
	}
	
	/*
	 * 進行資料讀取病寫入檔案中,採用的思路是將一個word檔案中的內容用一個連結串列儲存,連結串列的長度等於表格的格數
	 * 然後再使用一個連結串列將每個檔案對應的連結串列新增到裡面,可以看成二維陣列形式
	 * 只要知道我們想要word檔案中的那個單元內容,找到該單元對應的下標進行讀取就行
	 */
	
	public static void writeToXls(String worksheet) throws IOException {
		ArrayList<ArrayList<String> > people = new ArrayList() ;
		FileOutputStream out = new FileOutputStream("result.xls");  //結果輸出檔名
		File file = new File(filePathDir);
		File[] files = file.listFiles();  //獲取資料夾下word檔名列表
		
		for(File a:files) {
			System.out.println(a.toString());
			in = new FileInputStream(a);   //依次讀入每一個word檔案
			XWPFDocument doc = new XWPFDocument(in);
			List<XWPFTable> tables = doc.getTables();
			for (XWPFTable table : tables) {
			    List<XWPFTableRow> rows = table.getRows();   // 獲取表格的行
			    ArrayList<String> single = new ArrayList();  //儲存每一表格的所有單元資訊
			    for (XWPFTableRow row : rows) {
			        List<XWPFTableCell> tableCells = row.getTableCells();
			        for (XWPFTableCell cell : tableCells) {
			             String text = cell.getText();
			             single.add(text);
			        }//end for
			    }//end for
			    people.add(single);
			}//end for		
		}
		
		for(int i=0;i<people.size();i++) {
			/*
			 *這段程式碼用於檢測自己想要單元的下標是否和計算機計算的一樣 
			 *
			/*for(int j=0;j<people.get(i).size();j++){
				System.out.println(people.get(i).get(j)+i+ "   "+ j);
			}*/
			HSSFRow rw = workbook.getSheet(worksheet).createRow(i+1);
			/*
			 * 由表格得知我們想要的資料分別為第1、11、5、9、7、17、13下標的內容
			 * 下面程式碼建立一行,在該行上建立7個單元格,分別對應姓名、學號等
			 */
			HSSFCell ce = rw.createCell(0);  
            ce.setCellValue(people.get(i).get(1));
            ce = rw.createCell(1);
            ce.setCellValue(people.get(i).get(11));
            ce = rw.createCell(2);
            ce.setCellValue(people.get(i).get(5));
            ce = rw.createCell(3);
            ce.setCellValue(people.get(i).get(9));
            ce = rw.createCell(4);
            ce.setCellValue(people.get(i).get(7));
            ce = rw.createCell(5);
            ce.setCellValue(people.get(i).get(17));
            ce = rw.createCell(6);
            ce.setCellValue(people.get(i).get(13));
		}
		workbook.write(out); 
	}
	public static void main(String[] args) throws IOException {
		String[] label= {"姓名","學號","聯絡方式","專業","合作者","參賽題目","指導老師"};
		creatLables(label,"資訊彙總");
		writeToXls("資訊彙總");	
		in.close();
		out.close();
		}
}