有选择读取word表格中的数据并写入excel文件中

  • 最近学院要举行科技报告会活动,许多同学积极参与,交了许多报名表到我这里,而我需要将这些信息进行汇总,整理出一个excel表格,看着一个个word文件放在我的工作文件夹中头发发麻,这一个个的整理好麻烦,不但速度慢而且容易出错,我就想用编程自动替我读取数据并写入目标文件。结果还真让我写成了,下面一一讲解步骤:

  • 问题描述:如下图所示,我需要提取姓名、学号、合作者、学院及专业、联系方式、指导老师、参选题目这几栏的信息。
    有选择读取word表格中的数据并写入excel文件中

  • 步骤一:下载POI插件
    POI:下载地址;我所使用的是poi-3.10-FINAL。建好java工程后右键点击,选择配置选项,按照下面图片步骤。
    有选择读取word表格中的数据并写入excel文件中
    有选择读取word表格中的数据并写入excel文件中
    有选择读取word表格中的数据并写入excel文件中

  • 代码解释

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();
		}
}