由於作業需要,要求我們將word文檔中的數據直接導入到mysql中,在網上找了很常時間,終於將其解決。
由於比較初級,所以處理的word文檔是那種比較規范的那種,條例比較清晰,設計的思路也比較簡單,就是根據段落的內容判斷每一段是標題還是內容,然后讀完一條記錄后直接像數據庫中添加,知道最后都添加完成。代碼如下:
本項目的結構如截圖所示:
其中Bean.java里邊是一個實體類,我將每一個新聞熱詞的標題,內容,分類都封裝在一個類中,Dao.java是實現向數據庫中插入數據的函數,DBUtil.java是鏈接數據庫,WordToSql.java里邊是具體的實現代碼,test.java是一個測試類。
注:本人用的maven項目,需要導入一下依賴:
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.8</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-scratchpad</artifactId> <version>3.8</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.38</version> </dependency>
Bean.java
package com.chry.WordToSql; public class Bean { public String pian; public String zhang; public String title; public String content; public Bean(String pian, String zhang, String title, String content) { super(); this.pian = pian; this.zhang = zhang; this.title = title; this.content = content; } public String getPian() { return pian; } public String getZhang() { return zhang; } public String getTitle() { return title; } public String getContent() { return content; } public void setPian(String pian) { this.pian = pian; } public void setZhang(String zhang) { this.zhang = zhang; } public void setTitle(String title) { this.title = title; } public void setContent(String content) { this.content = content; } public Bean() { } @Override public String toString() { return "Bean [pian=" + pian + ", zhang=" + zhang + ", title=" + title + ", content=" + content + "]"; } }
Dao.java
package com.chry.WordToSql; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; public class Dao { public void add(Bean bean) { Connection connection = DBUtil.getConnection(); PreparedStatement preparedStatement = null; String sql = "insert into data (pian,zhang,title,content) value (?,?,?,?)"; try { preparedStatement = connection.prepareStatement(sql); preparedStatement.setString(1, bean.getPian()); preparedStatement.setString(2, bean.getZhang()); preparedStatement.setString(3, bean.getTitle()); preparedStatement.setString(4, bean.getContent()); preparedStatement.executeUpdate(); System.out.println("插入成功"); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { DBUtil.close(preparedStatement); DBUtil.close(connection); } } }
DBUtil.java
package com.chry.WordToSql; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class DBUtil { public static Connection getConnection(){ try { Class.forName("com.mysql.jdbc.Driver").newInstance(); } catch (InstantiationException e) { // TODO �Զ����ɵ� catch �� e.printStackTrace(); } catch (IllegalAccessException e) { // TODO �Զ����ɵ� catch �� e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO �Զ����ɵ� catch �� e.printStackTrace(); } String user="root"; String password="root"; String url="jdbc:mysql://localhost:3306/bigdata"; Connection connection=null; try { connection=DriverManager.getConnection(url, user, password); } catch (SQLException e) { // TODO �Զ����ɵ� catch �� e.printStackTrace(); } return connection; } public static void close(Connection connection) { try { if(connection!=null) { connection.close(); } } catch (SQLException e) { // TODO �Զ����ɵ� catch �� e.printStackTrace(); } } public static void close(PreparedStatement preparedStatement) { try { if(preparedStatement!=null) { preparedStatement.close(); } } catch (SQLException e) { // TODO �Զ����ɵ� catch �� e.printStackTrace(); } } public static void close(ResultSet resultSet) { try { if(resultSet!=null) { resultSet.close(); } } catch (SQLException e) { // TODO �Զ����ɵ� catch �� e.printStackTrace(); } } }
注:鏈接數據庫的用戶名,密碼,還有數據庫的名稱都要根據的情況進行修改。
WordToSql.java
package com.chry.WordToSql; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.List; import org.apache.poi.xwpf.extractor.XWPFWordExtractor; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFParagraph; public class WordToSql { public static String pian; public static String zhang; public static void readAndWriterTest4() throws IOException { File file = new File("D:\\2.docx"); String str = ""; try { FileInputStream fis = new FileInputStream(file); XWPFDocument xdoc = new XWPFDocument(fis); List<XWPFParagraph> paras=xdoc.getParagraphs(); Bean bean = new Bean(); for(XWPFParagraph p : paras)//遍歷段落 { //獲取段落的級別 String jibie = p.getStyleID(); if(jibie!=null) { if(jibie.equals("8")) { pian = p.getParagraphText(); bean.setPian(pian); }else if(jibie.equals("9")) { zhang = p.getParagraphText(); bean.setZhang(zhang); }else if(jibie.equals("10")){ //判斷的段落為標題 //System.out.println(bean.toString()); //寫入數據庫 Dao dao = new Dao(); dao.add(bean);
bean.setContent(""); String title = p.getParagraphText(); bean.setTitle(title); }else { //判斷段落為正文 String content = p.getParagraphText();
if(bean.getContent()!=null) { content = content + bean.getContent(); } bean.setContent(content); } } } fis.close(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) throws IOException { readAndWriterTest4(); } }
至此,便可以將一片word文檔完整的導入數據庫中,后續會進一步研究如何將更加復雜的word文檔導入數據庫中。
注:在word文檔中,每個人的字號的級別都不太一樣,所以可以先寫一個測試函數,輸出每個段落的字號,再去修改正式導入數據庫中的代碼,本博客是經過修正之后的。
如有問題,請留言。