Word中表格内容批量插入数据库

一、内容概要

1,下载jacob.jar,将jacob自带的DLL放入SYSTEM32中,确保电脑装了WORD程序;

2,方法是:FILE[]遍历特定文件夹,JACOB读取WORD中表格的内容,封装成arraylist,然后批量插入数据库

二、核心码

1,words.java;遍历文件夹,取出word表格中的内容到arraylist

package main.java.utils;

import java.io.File;//用于遍历文件夹下所有文件
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import main.java.Cus;//一个POJO普通类

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
//import test.wordBean;
public class Words {
	 // word文档
	 private static Dispatch doc;
	 // word运行程序对象
	 private ActiveXComponent word;
	 // 所有word文档集合
	 private Dispatch documents;
	 // 选定的范围或插入点
	 private Dispatch selection;
	 private boolean saveOnExit = true;
	 
	 private ArrayList alist=null;
	 private ArrayList<Cus> al1=null;
	 private Cus cus=null;
	 
	 public Words() throws Exception {
		  if (word == null) {
			  word = new ActiveXComponent("Word.Application");
			  word.setProperty("Visible", new Variant(false)); // 不可见打开word
			  word.setProperty("AutomationSecurity", new Variant(3)); // 禁用宏
		  }
		  if (documents == null)
			  documents = word.getProperty("Documents").toDispatch();
		 }

//创建一个新的word文档
	 public void createNewDocument() {
		  doc = Dispatch.call(documents, "Add").toDispatch();
		  selection = Dispatch.get(word, "Selection").toDispatch();
		 }
 
//打开一个已存在的文档
	 public void openDocument(String docPath) {
		  createNewDocument();
		  doc = Dispatch.call(documents, "Open", docPath).toDispatch();
		  selection = Dispatch.get(word, "Selection").toDispatch();
	 }

 //获得指定的单元格里数据
	 public String getTxtFromCell(int tableIndex, int cellRowIdx, int cellColIdx) {
	  // 所有表格
		  Dispatch tables = Dispatch.get(doc, "Tables").toDispatch(); 
		  // 要填充的表格
		  Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();
		  Dispatch rows = Dispatch.call(table, "Rows").toDispatch();
		  Dispatch columns = Dispatch.call(table, "Columns").toDispatch();
		  Dispatch cell = Dispatch.call(table, "Cell", new Variant(cellRowIdx),new Variant(cellColIdx)).toDispatch();
		  Dispatch Range=Dispatch.get(cell,"Range").toDispatch();
		//  System.out.println(Dispatch.get(Range,"Text").toString());
		  Dispatch.call(cell, "Select");
		  String ret = "";
		  ret = Dispatch.get(selection, "Text").toString();
		  ret = ret.substring(0, ret.length() - 2); // 去掉最后的回车符;
		  return ret;
	 }
 //关闭
	 public void closeDocumentWithoutSave() {
		  if (doc != null) {
		   Dispatch.call(doc, "Close", new Variant(false));
		   doc = null;
		  }
	 }
 
 //关闭全部应用
	 public void close() {
		 //closeDocument();
		 if (word != null) {
			 Dispatch.call(word, "Quit");
			 word = null;
		 }
			 selection = null;
			 documents = null;
	 }
	 
	 //遍历文件夹下的所有文件路径
	 public  ArrayList getFilePath(File filedir) throws Exception{
		  File[] file = filedir.listFiles();
		  alist=new ArrayList();
		  for(int i=0; i<file.length; i++){
          //获取绝对路径
		   String filepath=file[i].getAbsolutePath();
//		   System.out.println(file[i].getAbsolutePath());
		   alist.add(filepath);
//		   System.out.println(alist.get(i));
		   if(file[i].isDirectory()){
		    try{
		    	getFilePath(file[i]);
		    }catch(Exception e){}
		   }
		  }
		  return alist;
		 }
	 
	 //遍历文件夹下的所有文件名
	 public  ArrayList getFileName(File filedir) throws Exception{
		  alist=new ArrayList();
		  File[] file = filedir.listFiles();
		  for(int i=0; i<file.length; i++){
		   //获取文件名
		   String filename=file[i].getName().substring(0, file[i].getName().indexOf("."));
		   alist.add(filename);
//		   System.out.println(alist.get(i));
		   if(file[i].isDirectory()){
		    try{
		    	getFileName(file[i]);
		    }catch(Exception e){}
		   }
		  }
		  return alist;
		 }
	 //获取文件夹下文件数量
	 public  int getFileCount(File filedir) throws Exception{
		  File[] file = filedir.listFiles();
		  int filecount=file.length;
		  return filecount;
		 }
	 
	 //获取表格中的所有有效内容
	 public ArrayList<Cus> getFileContent() throws Exception{
		 
		  File myfiledir = new File("C:\\list");
		  File[] file = myfiledir.listFiles();
		  
		  al1=new ArrayList<Cus>();
		  cus=new Cus();
		  
		  for (int i = 0; i < file.length; i++) {
			  System.out.println(file.length);
			  if (!file[i].isHidden()) {
				  
				  String filepaths=getFilePath(myfiledir).get(i).toString();
				  String filenames=getFileName(myfiledir).get(i).toString();
				  openDocument(filepaths);
				  // 所有表格
				  Dispatch tables = Dispatch.get(doc, "Tables").toDispatch(); 
				  // 获取第1个表格
				  Dispatch table = Dispatch.call(tables, "Item", new Variant(1)).toDispatch();
				  // 获取表格值(固定10行)
			      cus=new Cus();
			      cus.setId(filenames);
			      cus.setProvince(getTxtFromCell(1, 1, 2));
			      cus.setProvince_manager(getTxtFromCell(1, 2, 2));
			      cus.setCustom(getTxtFromCell(1, 3, 2));
			      cus.setBusiness(getTxtFromCell(1, 4, 2));
			      cus.setReceiver(getTxtFromCell(1, 5, 2));
			      cus.setBill_info(getTxtFromCell(1, 6, 2));
			      cus.setInvoice_info(getTxtFromCell(1, 7, 2));
			      cus.setCus_info(getTxtFromCell(1, 8, 2));
			      cus.setGoods(getTxtFromCell(1, 9, 2));
			      cus.setRequirement(getTxtFromCell(1, 10, 2));
			      closeDocumentWithoutSave();
			}else{
				  System.out.println("请关闭所有Word文档,并结束进程!");
				  break;
			}
			      al1.add(cus);
		    }
		          close();
		          return al1;
	 }
	 
//测试方法
// public static void main(String[] args)throws Exception{
//	  Jtest word = new Jtest(); 
//	  ArrayList<Cus> list=new ArrayList<Cus>();
//	  list=word.getFileContent();
//	  Iterator<Cus> it=list.iterator();
//	  while (it.hasNext()) {
//		System.out.println(it.next());
//
//	}
//		} 
}

2,插入数据DAO

package main.java.dao;

import java.util.ArrayList;
import java.util.Iterator;

import main.java.Cus;
import main.java.utils.Words;

public class Dao {
	private Words words=null;
	private ArrayList<Cus> al=null;
	private Cus cus=null;

	//创建数据库
	public void init() {
		DBAccess db = new DBAccess();
		if(db.createConn()) {
		   String sql = " create table CUSTOM ( " +
		   		        " id varchar ( 30 ) primary key, " +
						" Province varchar ( 50 ), "+
						" Province_manager varchar, ( 50 )" +
						" Custom varchar ( 50 ), "+
						" Business varchar ( 50 ), "+
						" Receiver varchar ( 50 ), "+
						" Bill_info varchar ( 200), "+
						" Invoice_info varchar ( 200 ), "+
						" Cus_info varchar ( 50 ), "+
						" Goods varchar ( 50 ), "+
						" Requirement varchar ( 100 ))";
			db.update(sql);
			db.closeStm();
			db.closeConn();
		}
	}

	//批量将WORD表格插入数据库
	public void insertWordToDb() throws Exception{
		DBAccess db = new DBAccess();
		words=new Words();
		al=new ArrayList<Cus>();
		al=words.getFileContent();
		Iterator<Cus> it=al.iterator();
		while (it.hasNext()) {
			cus=new Cus();
			cus=it.next();
			if(db.createConn()) {
				    String sql = "insert into custom values( ‘ "
				    	          + cus.getId() + "‘,‘"
				    	          + cus.getProvince() + "‘,‘"
				    	          + cus.getProvince_manager() + "‘,‘"
				    	          + cus.getCustom() + "‘,‘"
				    	          + cus.getBusiness() + "‘,‘"
				    	          + cus.getReceiver() + "‘,‘"
				    	          + cus.getBill_info() + "‘,‘"
				    	          + cus.getInvoice_info() + "‘,‘"
				    	          + cus.getCus_info() + "‘,‘"
				    	          + cus.getGoods() + "‘,‘"
				    	          + cus.getRequirement() + "‘)";
					db.update(sql);
					db.closeStm();
					db.closeConn();
				}
		}

	}
}

3,增删改查封装

package main.java.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class DBAccess {

	private String drv = "org.h2.Driver";

	private String url = "jdbc:h2:file:~/cus;AUTO_SERVER=TRUE";

	private String usr = "sa";

	private String pwd = "";

	private Connection conn = null;

	private Statement stm = null;

	private ResultSet rs = null;

	public boolean createConn() {
		boolean b = false;
		try {
			Class.forName(drv).newInstance();
			conn = DriverManager.getConnection(url, usr, pwd);
			b = true;
		} catch (SQLException e) {
		} catch (ClassNotFoundException e) {
		} catch (InstantiationException e) {
		} catch (IllegalAccessException e) {
		}
		return b;
	}

	public boolean update(String sql) {
		boolean b = false;
		try {
			stm = conn.createStatement();
			stm.execute(sql);
			b = true;
		} catch (Exception e) {
			System.out.println(e.toString());
		}
		return b;
	}

	public void query(String sql) {
		try {
			stm = conn.createStatement();
			rs = stm.executeQuery(sql);
		} catch (Exception e) {
		}
	}

	public boolean next() {
		boolean b = false;
		try {
			if(rs.next())b = true;
		} catch (Exception e) {
		}
		return b;
	}

	public String getValue(String field) {
		String value = null;
		try {
			if(rs!=null)value = rs.getString(field);
		} catch (Exception e) {
		}
		return value;
	}

	public void closeConn() {
		try {
			if (conn != null)
				conn.close();
		} catch (SQLException e) {
		}
	}

	public void closeStm() {
		try {
			if (stm != null)
				stm.close();
		} catch (SQLException e) {
		}
	}

	public void closeRs() {
		try {
			if (rs != null)
				rs.close();
		} catch (SQLException e) {
		}
	}

	public Connection getConn() {
		return conn;
	}

	public void setConn(Connection conn) {
		this.conn = conn;
	}

	public String getDrv() {
		return drv;
	}

	public void setDrv(String drv) {
		this.drv = drv;
	}

	public String getPwd() {
		return pwd;
	}

	public void setPwd(String pwd) {
		this.pwd = pwd;
	}

	public ResultSet getRs() {
		return rs;
	}

	public void setRs(ResultSet rs) {
		this.rs = rs;
	}

	public Statement getStm() {
		return stm;
	}

	public void setStm(Statement stm) {
		this.stm = stm;
	}

	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	public String getUsr() {
		return usr;
	}

	public void setUsr(String usr) {
		this.usr = usr;
	}
}

4,POJO类

package main.java;

public class Cus {
	private String Id;
	private String Province;
	private String Province_manager;
	private String Custom;
	private String Business;
	private String Receiver;
	private String Bill_info;
	private String Invoice_info;
	private String Cus_info;
	private String Goods;
	private String Requirement;
	public String getId() {
		return Id;
	}
	public void setId(String id) {
		Id = id;
	}
	public String getProvince() {
		return Province;
	}
	public void setProvince(String province) {
		Province = province;
	}
	public String getProvince_manager() {
		return Province_manager;
	}
	public void setProvince_manager(String provinceManager) {
		Province_manager = provinceManager;
	}
	public String getCustom() {
		return Custom;
	}
	public void setCustom(String custom) {
		Custom = custom;
	}
	public String getBusiness() {
		return Business;
	}
	public void setBusiness(String business) {
		Business = business;
	}
	public String getReceiver() {
		return Receiver;
	}
	public void setReceiver(String receiver) {
		Receiver = receiver;
	}
	public String getBill_info() {
		return Bill_info;
	}
	public void setBill_info(String billInfo) {
		Bill_info = billInfo;
	}
	public String getInvoice_info() {
		return Invoice_info;
	}
	public void setInvoice_info(String invoiceInfo) {
		Invoice_info = invoiceInfo;
	}
	public String getCus_info() {
		return Cus_info;
	}
	public void setCus_info(String cusInfo) {
		Cus_info = cusInfo;
	}
	public String getGoods() {
		return Goods;
	}
	public void setGoods(String goods) {
		Goods = goods;
	}
	public String getRequirement() {
		return Requirement;
	}
	public void setRequirement(String requirement) {
		Requirement = requirement;
	}

}
时间: 2024-11-03 21:42:39

Word中表格内容批量插入数据库的相关文章

使用SqlBulkCopy将DataTable中的数据批量插入数据库中

#region 使用SqlBulkCopy将DataTable中的数据批量插入数据库中 /// <summary> /// 注意:DataTable中的列需要与数据库表中的列完全一致. /// </summary> /// <param name="conStr">数据库连接串</param> /// <param name="strTableName">数据库中对应的表名</param> //

C# 将DataTable表中的数据批量插入到数据库表中的方法

C#中有时候需要将内存中的数据批量插入到数据库表中,使用for循环进行批量插入不但耗时而且会频繁操作数据库. 针对数据量很少的可以使用for循环插入,但是针对于数据量大的则不推荐使用for循环插入,推荐使用sql的块处理插入. 块处理不但耗时少而且不会频繁对数据库进行操作,只是需要注意的一点是DataTable中的列必须与表的列完全一致. 如下代码是批量插入的一个函数,自测可用. 1 #region 使用SqlBulkCopy将DataTable中的数据批量插入数据库中 2 /// <summa

SQL SERVER 使用BULK Insert将txt文件中的数据批量插入表中(1)

1/首先建立数据表 CREATE TABLE BasicMsg( RecvTime FLOAT NOT NULL , --接收时间,不存在时间相同的数据 AA INT NOT NULL, --24位地址码 . FlightID Varchar(10) NULL, --航班号) 2/ 建立存储过程 USE DF17DataProIF EXISTS (SELECT * FROM SYS.PROCEDURES WHERE OBJECT_ID = OBJECT_ID(N'[DBO].[BulkDataP

DataTable批量插入数据库

DataTable批量插入数据库 最近在将excel中的文件导入到数据库中,用程序进行编写,由于数据量较大所以速度很慢,后来采用了SqlBulkCopy类,解决了速度的问题,我就insert语句,sqldataadapter.update(dataset,tablename);sqlbulkcopy.WriteToServer(datatable);三个方法的性能进行比较: 1.生成测试的datatable表,表结构如下: UniqueID(主键,自动增长) | CompanyName | Co

MYSQL批量插入数据库实现语句性能分析

假定我们的表结构如下 代码如下   CREATE TABLE example ( example_id INT NOT NULL, name VARCHAR( 50 ) NOT NULL, value VARCHAR( 50 ) NOT NULL, other_value VARCHAR( 50 ) NOT NULL ) 通常情况下单条插入的sql语句我们会这么写: 代码如下   INSERT INTO example (example_id, name, value, other_value)

Java MySql 批量插入数据库addBatch

//addBatch批量插入数据库 public static void insertCommentToMySql(Set<String> commentList) { Iterator<String> it = commentList.iterator(); Statement st=null; try { st = DBConnection.getConnection(dbName,dbUser,dbPwd).createStatement(); } catch (SQLExc

在Redis集群中使用pipeline批量插入

由于项目中需要使用批量插入功能, 所以在网上查找到了Redis 批量插入可以使用pipeline来高效的插入, 示例代码如下: String key = "key"; Jedis jedis = new Jedis("xx.xx.xx.xx"); Pipeline p = jedis.pipelined(); List<String> myData = .... //要插入的数据列表 for(String data: myData){ p.hset(ke

批量插入数据库数据,有则更新,无则追加

# 批量插入数据库数据,有则更新,无则追加import pymysqlimport numpy as npimport pandas as pdconn = pymysql.connect( host='127.0.0.1', port=3306, user='root', passwd='root', db='py3_userinfo', charset='utf8' )# 游标cur = conn.cursor()df = pd.DataFrame([['合肥', 12, 110],['北京

根据excel表格中的内容更新Sql数据库

关于[无法创建链接服务器 "(null)" 的 OLE DB 访问接口 SQL Server 2008读取EXCEL数据时,可能会报这个错误:无法创建链接服务器 "(null)" 的 OLE DB 访问接口 "MSDASC" 的实例. 1. 此错误主要是在使用代码读取数据时发生: insert into 数据库表名 select * from OpenDataSource ('Microsoft.Ace.OLEDB.12.0','Data Sou