有选择读取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();
}
}