java讀取word中的表格並存入到mysql資料庫中例項
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
}