将D://word_export.doc(word2003)文件中表格数据读取出来并存入到数据库中。表格数据如下图所示:
20064001 | 刘景玉 | 1987-01-25 | 男 | 河南商丘 |
20064002 | 李会 | 1986-05-30 | 男 | 湖北武汉 |
20064003 | 卢昊 | 1988-09-21 | 女 | 湖南长沙 |
20064004 | 张艳华 | 1989-06-14 | 男 | 四川成都 |
20064005 | 于玮祺 | 1986-02-27 | 男 | 河南信阳 |
20064006 | 李强 | 1988-11-06 | 男 | 河南信阳 |
20064007 | 李华 | 1985-11-03 | 男 | 山东济南 |
20064008 | 李欣 | 1987-12-06 | 女 | 四川成都 |
20064009 | 刘西亚 | 1988-01-06 | 女 | 湖北武汉 |
20064010 | 张才 | 1989-07-11 | 男 | 辽宁大连 |
20064011 | 吴霞 | 1986-10-07 | 女 | 辽宁大连 |
要实现这一过程,要用到Apache POI(POI提供API给Java程序对MicrosoftOffice格式档案读和写的功能)和JDBC(是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,由一组用Java语言编写的类和接口组成)。
该例用到的是POI的HWPF接口,POI Jar包下载地址:http://poi.apache.org/download.html
HWPF接口:
HWPF接口主要用来处理 MS Word(97-2003)对象,是 POI 中相对不太成熟的部分。但可以做一些基本的对于对 word 文档的读写操作。HWPF提供给我们使用的对象在 org.apache.poi.hwpf.extractor 和 org.apache.poi.hwpf.usermodel 包中,主要部分包括 Word 对象,表格等。主要有以下几种对象:
org.apache.poi.hwpf.extractor.WordExtractor:从 Word 文档中提取出文本的类。
org.apache.poi.hwpf.usermodel.Paragraph:对应于 Word 的一个段落。
org.apache.poi.hwpf.usermodel.Table:对应于 Word 的一个表格。
org.apache.poi.hwpf.usermodel.TableCell:对应于 Word 的表格的一个单元格。
org.apache.poi.hwpf.usermodel.Range:是 HWPF 对象模型的核心类,适用于在 Word 文档中的字符的范围的所有属性扩展这个类。它可以插入文字或者选定一定范围的属性。
而操作 Word 2007 文档则有XWPF接口,其相关对象在?org.apache.poi.xwpf.extractor 和org.apache.poi.xwpf.usermodel包中。
JDBC流程原理:(见:http://baike.sogou.com/v607995.htm?fromTitle=jdbc)
具体实现代码如下:
package word_export;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;
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.hwpf.extractor.WordExtractor;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
public class word_export {
public static void main(String[] args) throws Exception {
Connection conn = null;//创建数据库连接对象
String sql;
// MySQL的JDBC URL编写方式:jdbc:mysql://主机名称:连接端口/数据库的名称?参数=值
// 避免中文乱码要指定useUnicode和characterEncoding
// 执行数据库操作之前要在数据库管理系统上创建一个数据库,名字自己定,
String url = "jdbc:mysql://localhost:3306/student?"
+ "user=root&password=123456&useUnicode=true&characterEncoding=UTF8";
try {
Class.forName("com.mysql.jdbc.Driver");//加載mysql驱动
System.out.println("成功加载MySQL驱动程序");
// 一个Connection代表一个数据库连接
conn = DriverManager.getConnection(url);//通过DriverManager类创建数据库连接对象Connection
//Statement里面带有很多方法,比如executeUpdate可以实现插入,更新和删除等
Statement stmt = conn.createStatement();//创建声明
FileInputStream in = new FileInputStream("D:\\word_export.doc");// 载入文档
POIFSFileSystem pfs = new POIFSFileSystem(in);
HWPFDocument hwpf = new HWPFDocument(pfs);
Range range = hwpf.getRange();// 得到文档的读取范围
TableIterator it = new TableIterator(range);
String[] stu =new String[5];
// 迭代文档中的表格
while (it.hasNext()) {
Table tb = (Table) it.next();
// 迭代行,默认从0开始
for (int i = 0; i < tb.numRows(); i++) {
TableRow tr = tb.getRow(i);
// 迭代列,默认从0开始
for (int j = 0; j < tr.numCells(); j++) {
TableCell td = tr.getCell(j);// 取得单元格
// 取得单元格的内容
String s="";
for (int k = 0; k < td.numParagraphs(); k++) {
Paragraph para = td.getParagraph(k);// 获取第k个段落
s += para.text();
System.out.println(s);
}
s = s.replace("•","");
stu[j]= s ;
// end for
}// end for
sql = "insert into student_information(student_no,student_name,birthday,sex,place) values ('" +stu[0]+ "','" +stu[1]+ "','" +stu[2]+ "','" +stu[3]+ "','" +stu[4]+ "')";//student_information表中有student_id(自增型int)
System.out.println("insert done!");
// sql="truncate table student_information";//删除表中数据
int result = stmt.executeUpdate(sql);
}// end for
sql = "select * from student_information";
ResultSet rs = stmt.executeQuery(sql);// executeQuery会返回结果的集合,否则返回空值
while (rs.next()) {
System.out
.println(rs.getString(2) + "\t" + rs.getString(3) + "\t" + rs.getDate(4) + "\t" + rs.getString(5) + "\t" + rs.getString(6));// 如果返回的是int类型可以用getInt(),getString方法括号中的数字表示<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">单元格下标,从1开始。</span>
}
} // end while
} catch (SQLException e) {
System.out.println("MySQL操作错误");
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
conn.close();
}
}// end method
}