如何在EXCEL表中匹配数据,并自动更新

假设 表一:
ID name price
1 奶粉 55.00
2 奶瓶 42.00
. . .
. . .
表二:
ID name price
2 奶瓶 48.00
. . .
. . .

由于两个表的结构相同,只更新价格(把表二的新价格更新到表一,表一中记录的价格不是全部都变的,是完全按表二来的),请问如何实现

一定要用excel来实现

update [表一$] a
set (a.price) =
(select b.price from [表二$] b where a.id = b.id)

用java连接 excel 执行以上sql语句

package excel;

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

public class ExcelDAO {
/**
* 与连接ACCESS 一样 打开ODBC 只需在系统DSN内增加一个数据库源 但EXCEL是将一个 EXCEL 文件 作为一个 数据库
* 所以在选择工作薄时 选择EXCEL文件
*
* ...
*/

/**
* 注意:操作必须使用一个可更新的查询 错误 解决方法 1.打开 管理工具 数据源 选择系统DSN 下的 EXCLE 数据库 在 选项 内 取消 勾选
* 只读 2.检查数据库文件夹 是否 只读? 取消只读 3.文件夹 选项 取消勾选 使用简单文件夹共享(推荐) 项
*/
/**
* 错误“操作必须使用一个可更新的查询”原因及解决办法
*
* 原因: 有几个主要的错误原因: 这个错误发生在当你的程序试图执行更新数据库或其它类似操作时。这是因为
* ADO由于以下的几个原因而不能够写数据库造成的。 1。最普遍的原因是匿名用户帐号(IUSR_MACHINE)对该数据库文件没有写权限。
* 要解决这个问题,在管理器中调整数据库文件的属性,让匿名用户有正确的权限。 当使用ACCESS数据库时,不仅要给文件写的权限,还要给该目录写
* 的权限,因为 Jet需要在该目录建立一个.ldb文件。 2。第二个原因是数据库没有使用正确的模式打开。应该使用下面的方法打开。 SQL =
* "UPDATE Products Set UnitPrice = 2;" Set Conn =
* Server.CreateObject("ADODB.Connection") Conn.Mode = 3 '3 =
* adModeReadWrite Conn.Open "myDSN" Conn.Execute(SQL) Conn.Close
* 注意默认的Mode是设置0(adModeUnknown),它是允许更新的。 3。还有可能是在ODBC管理器中将该DSN的只读选项选中。
* 4。你是在同时更新两个表中的字段,也会出现这个错误信息,解决办法是分开来更新 这两个表中各自字段。
* 5。当你使用了一个从低版本中(如ACCESS2.0,ACCESS7.0)载入到高版本(ACCESS 2000)
* 中的查询时,在执行这个查询是会出现该错误。
*/

/**
* "INSERT INTO [ITQueStat]
* VALUES('一','二','三','四','五','六','七','八','九','十')"; 写入Excel表头
*/
private Connection conn;

private Statement sta;

private ResultSet res;

public ExcelDAO() {
try {

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
conn = DriverManager.getConnection("jdbc:odbc:excel", "", "");
sta = conn.createStatement();
System.out.println("数据库连接成功");
} catch (ClassNotFoundException e) {
System.out.println("缺少架包支持");
e.printStackTrace();
} catch (SQLException e) {
System.out.println("连接错误 检查用户名密码 或 url ");
e.printStackTrace();
}

}

public void close() {

try {
if (res != null) {
res.close();
}
if (sta != null) {
sta.close();
}
if (conn != null) {
conn.close();
}

} catch (SQLException e) {
System.out.println("sql不能执行");
e.printStackTrace();
}

}

public ResultSet querry(String sql) {
try {
res = sta.executeQuery(sql);
} catch (SQLException e) {
System.out.println("sql不能执行");
System.out.println(sql);
e.printStackTrace();
}
return res;
}

public int update(String sql) {
int flag = -1;
try {
flag = sta.executeUpdate(sql);
} catch (SQLException e) {
System.out.println("以下sql不能执行");
System.out.println(sql);
e.printStackTrace();
}
commit();
return flag;

}
public void commit(){
try {
conn.commit();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

private Connection getConn() {
return conn;
}

public static void main(String[] args) {
ExcelDAO d = new ExcelDAO();
String sql = "SELECT e.* FROM [emp$] as e";
ResultSet res = d.querry(sql);
try {
while (res.next()) {
System.out.println(res.getString("a") + "\t"
+ res.getString("b") + "\t" + res.getString("c"));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

System.out.println("吧不是".indexOf("哈"));

}

}
温馨提示:内容为网友见解,仅供参考
第1个回答  2007-12-05
按你以上提供的资料与排列,在工作表 表1 D列单元格输入==VLOOKUP(B:B,表2!B:C,2,0)本回答被提问者采纳
第2个回答  2007-12-04
找VBA相关资料.
第3个回答  2007-12-04
应该是不可以的吧.
不然还要数据库做什么.
相似回答