关于oledb操作excel的问题

benjerry 2015-12-17 02:11:26
各位高手,我这边想通过oledb连接Excel之后,将一个sheet的内容select出来后,select * into 到另一个sheet中。
代码如下:

public void ExeSql(string filename, string execsql)
{


OleDbConnection con = new OleDbConnection();
try
{

string str = string.Format("Provider=Microsoft.Ace.OLEDB.12.0;Data Source={0};Extended Properties='Excel 12.0; HDR=Yes;IMEX=0'", filename);
con.ConnectionString = str;
con.Open();

DataSet ds = new DataSet();
OleDbCommand com = new OleDbCommand(execsql,con);
int count=com.ExecuteNonQuery();




}
catch (Exception ex)
{


}
finally
{
if (con != null && con.State == ConnectionState.Open)
con.Close();


}



}
private void Test()
{
string sql = " SELECT * INTO temptt from [Sheet1$] ";
ExcelUtility.Instance.ExeSql("c:\a.xls", sql);


}


我使用select * into之后,本来的excel里面有3条记录
int count=com.ExecuteNonQuery();
这句话之后count返回3,表示3条记录受到影响。然后结果是在excel中。新的sheet是生成出来了。列也是有的,但是行一条也没有。这种方式不知道各位有没有试过。

后来我又测试了“INSRET INTO [temptt$] SELECT * fROM [Sheet1$]” 这句话直接就报
无效的 SQL语句;期待 'DELETE'、'INSERT'、'PROCEDURE'、'SELECT'、或 'UPDATE'
是不是excel不支持insert后面直接跟select的那种方式呢?各位有什么好的办法吗
...全文
417 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
benjerry 2015-12-21
  • 打赏
  • 举报
回复
感谢各位高手的帮助,问题已经解决。我最后只能采取曲线救国的方式,发现select * 也好,insert into select * 也好,插入到另一个新的excel文件中都是有数据的 ,只是自己insert到自己的excel的一个sheet里面就不行。我暂时采取把它拷到外面去,再进行处理的方式。非常感谢qbilbo给了我启发。
benjerry 2015-12-19
  • 打赏
  • 举报
回复
请问qbilbo,你用的是什么版本的office?
benjerry 2015-12-19
  • 打赏
  • 举报
回复
因为我试了两台机器的excel,貌似都不行。
qbilbo 2015-12-19
  • 打赏
  • 举报
回复
引用 14 楼 benjerry 的回复:
[quote=引用 13 楼 qbilbo 的回复:] 你可以这样测试: 1, string sql = " SELECT 1 as a,2 as b INTO t1"; ExcelUtility.Instance.ExeSql("d:\a.xlsx", sql); //保证d:\a.xlsx不存在,这样会由程序来创建xlsx文件。 2,string sql = " SELECT * INTO t2 from t1"; ExcelUtility.Instance.ExeSql("d:\a.xlsx", sql); //看看表t2是不是正常。 如果结果正常,把a.xlsx换成你原来的,再执行t2,如果不正常说明是原来的xlsx的格式问题或者说还是连接字符串与xlsx文件不匹配。
我运行了1之后,excel确实生成了。而且a.xlsx里面的a 和b列都有数据是1和2 然后我运行2.结果,t2 sheet 确实也生成了。在d:\a.xlsx里面。a列和b列也都是有的 。但是没有数据 如果不正常说明是原来的xlsx的格式问题或者说还是连接字符串与xlsx文件不匹配 这个应该不会啊,因为这个a.xlsx就是语句1运行之后生成出来的 。本来没有的。 难道还是连接字符串的问题吗? [/quote] 我测了一次,运行2时可以复制数据。是不是Office组件不完整?换台机子或完整安装下Excel试试。
qbilbo 2015-12-18
  • 打赏
  • 举报
回复
你可以这样测试: 1, string sql = " SELECT 1 as a,2 as b INTO t1"; ExcelUtility.Instance.ExeSql("d:\a.xlsx", sql); //保证d:\a.xlsx不存在,这样会由程序来创建xlsx文件。 2,string sql = " SELECT * INTO t2 from t1"; ExcelUtility.Instance.ExeSql("d:\a.xlsx", sql); //看看表t2是不是正常。 如果结果正常,把a.xlsx换成你原来的,再执行t2,如果不正常说明是原来的xlsx的格式问题或者说还是连接字符串与xlsx文件不匹配。
benjerry 2015-12-18
  • 打赏
  • 举报
回复
现在的代码如下 public void ExeSql(string filename, string execsql) { OleDbConnection con = new OleDbConnection(); try { //string str = "Provider=Microsoft.Ace.OLEDB.12.0;Extended Properties=\"Excel 8.0;HDR=yes;IMEX=2\"; Data Source=" + filename + ";"; string str = string.Format("Provider=Microsoft.Ace.OLEDB.12.0;Data Source={0};Extended Properties='Excel 12.0 Xml; HDR=Yes;IMEX=0'", filename); con.ConnectionString = str; con.Open(); DataSet ds = new DataSet(); OleDbCommand com = new OleDbCommand(execsql,con); int count=com.ExecuteNonQuery(); } catch (Exception ex) { LogUtility.WriteErrorLog(ex); } finally { if (con != null && con.State == ConnectionState.Open) con.Close(); } } private void Test() { string sql = " SELECT * INTO temptt from [Sheet1$] "; ExcelUtility.Instance.ExeSql("d:\a.xlsx", sql); }
benjerry 2015-12-18
  • 打赏
  • 举报
回复
引用 10 楼 qbilbo 的回复:
有的时候没问题,不代表所有时候都没问题,用我给你的连接字符串试一下就知道了。 当然sql语句还是要是要注意一下的。表不存在的时候用select * into ...存在的话,用inser into ... select ....
我在我的那句连接字符串后面加了Xml ,然后运行还是老样子。用select * into 的时候,新表会建立。但是只有列,没有行。 用insert into select 的时候,也没有值进去。
qbilbo 2015-12-18
  • 打赏
  • 举报
回复
有的时候没问题,不代表所有时候都没问题,用我给你的连接字符串试一下就知道了。 当然sql语句还是要是要注意一下的。表不存在的时候用select * into ...存在的话,用inser into ... select ....
benjerry 2015-12-18
  • 打赏
  • 举报
回复
我那个文件名是随便打的 ,我用的是xlsx文件。链接字符串应该没啥问题,因为直接在那个上面一般的insert和update都是可以的。select也能返回datatable
qbilbo 2015-12-18
  • 打赏
  • 举报
回复
比较好的做法是根据文件后缀名,用不同的连接字符串。
qbilbo 2015-12-18
  • 打赏
  • 举报
回复
连接字符串有问题。 string str = string.Format("Provider=Microsoft.Ace.OLEDB.12.0;Data Source={0};Extended Properties='Excel 12.0 Xml; HDR=Yes;IMEX=0'", filename); 另外用Microsoft.Ace.OLEDB.12.0的话,为什么不用xlsx呢?
benjerry 2015-12-18
  • 打赏
  • 举报
回复
现在主要的问题就是ExecuteNonQuery()有值,但是excel里面并没有变化。大家没人知道原因吗?
benjerry 2015-12-18
  • 打赏
  • 举报
回复
引用 20 楼 fatkids 的回复:
我也遇到过在Excel插入数据后没有值的情况,在安装了AccessDatabaseEngine后就恢复正常了!
其实我现在一条一条的insert是没有问题的。不过我希望实现的是批量insert,所以希望使用select * into 或者insert into **** selet * from 这种方式。accessdatabaseengine我倒是也装过。
fatkids 2015-12-18
  • 打赏
  • 举报
回复
我也遇到过在Excel插入数据后没有值的情况,在安装了AccessDatabaseEngine后就恢复正常了!
benjerry 2015-12-18
  • 打赏
  • 举报
回复
简单的来说,就是我有多个excel,或者也可以是一个excel的多个sheet,相互之间有些字段关联,然后组合起来生成一个join 7 8个sheet的查询,生成到另一个excel里面去。
benjerry 2015-12-18
  • 打赏
  • 举报
回复
引用 16 楼 benjerry 的回复:
[quote=引用 15 楼 xomix 的回复:] 老老实实用nopi,oledb的方式真的很麻烦,有时候还不如com+引用
nopi 能够像数据库一样把几个sheet的内容通过一些字段的join,然后查询出来吗 ? 类似像 select (a.b+b.b) from sheet1 a inner join sheet2 b on a.a=b.a 这种类似的 [/quote] 处理成datatable很多方式都可以做到。直接用oledb就行。每个sheet一个datatable,但是反过来,好像用linq去处理datatable,让这些datable相互进行关联,并不是很简单。特别是针对多个datatable的情况下,有没有什么稍微好一点的解决方案呢?
  • 打赏
  • 举报
回复
引用 16 楼 benjerry 的回复:
[quote=引用 15 楼 xomix 的回复:] 老老实实用nopi,oledb的方式真的很麻烦,有时候还不如com+引用
nopi 能够像数据库一样把几个sheet的内容通过一些字段的join,然后查询出来吗 ? 类似像 select (a.b+b.b) from sheet1 a inner join sheet2 b on a.a=b.a 这种类似的 [/quote] nopi可以把工作簿(sheet)处理为datatab 剩下的处理不用多说了吧?
benjerry 2015-12-18
  • 打赏
  • 举报
回复
引用 15 楼 xomix 的回复:
老老实实用nopi,oledb的方式真的很麻烦,有时候还不如com+引用
nopi 能够像数据库一样把几个sheet的内容通过一些字段的join,然后查询出来吗 ? 类似像 select (a.b+b.b) from sheet1 a inner join sheet2 b on a.a=b.a 这种类似的
  • 打赏
  • 举报
回复
老老实实用nopi,oledb的方式真的很麻烦,有时候还不如com+引用
benjerry 2015-12-18
  • 打赏
  • 举报
回复
引用 13 楼 qbilbo 的回复:
你可以这样测试: 1, string sql = " SELECT 1 as a,2 as b INTO t1"; ExcelUtility.Instance.ExeSql("d:\a.xlsx", sql); //保证d:\a.xlsx不存在,这样会由程序来创建xlsx文件。 2,string sql = " SELECT * INTO t2 from t1"; ExcelUtility.Instance.ExeSql("d:\a.xlsx", sql); //看看表t2是不是正常。 如果结果正常,把a.xlsx换成你原来的,再执行t2,如果不正常说明是原来的xlsx的格式问题或者说还是连接字符串与xlsx文件不匹配。
我运行了1之后,excel确实生成了。而且a.xlsx里面的a 和b列都有数据是1和2 然后我运行2.结果,t2 sheet 确实也生成了。在d:\a.xlsx里面。a列和b列也都是有的 。但是没有数据 如果不正常说明是原来的xlsx的格式问题或者说还是连接字符串与xlsx文件不匹配 这个应该不会啊,因为这个a.xlsx就是语句1运行之后生成出来的 。本来没有的。 难道还是连接字符串的问题吗?
加载更多回复(5)

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧