将第一个xls文件中的信息和第二个文件中的信息按照学号合并

volkswageos 2010-05-31 07:40:10
将第一个xls文件中的信息和第二个文件中的信息按照学号合并

如:第一个文件

姓名 学号 结算金额(元)


齐正 200704021137 5000
沙杨 200704021138 5000
苏林 200704021139 5000
孙博 200704021140 5000
孙伟 200704021141 5000
杨文博 200704021142 5000
张宇轩 200704021143 5000
艾师祺 200704031079 5000


第二个文件:

学号 姓名 合计


200704021137 齐正 369
200704021138 沙杨 123
200704031079 艾师祺 98




合并之后的文件(生成一个新文件吧)

姓名 学号 结算金额(元) 备注 学号 姓名 合计


齐正 200704021137 5000   200704021137 齐正 369
沙杨 200704021138 5000   200704021138 沙杨 123
苏林 200704021139 5000      
孙博 200704021140 5000      
孙伟 200704021141 5000      
杨文博 200704021142 5000      
张宇轩 200704021143 5000      
艾师祺 200704031079 5000   200704031079 艾师祺 98

应该能够使用sql语句直接处理的吧,应该怎么写语句呢?
...全文
125 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
volkswageos 2010-06-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 htl258 的回复:]
SQL code
--如果数据量大,如上万条记录,用ACE引擎访问速度将有惊人的提升:

/*
Microsoft.ACE.OLEDB.12.0 安装文件:

http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=7554f536-8c28-4598-9b72-ef94e038c8……
[/Quote]
好像ACE是针对office 2007的吧
excel 2000 ~ 2003的 OleDb 连接串的格式如下:

Provider=Microsoft.Jet.OleDb.4.0;Data Source=’excel文件路径’;
Extended Properties=’Excel 8.0;HDR=YES’

excel 2007 的 OleDb 的连接串的格式如下:

Provider=Microsoft.Ace.OleDb.12.0;Data Source=’excel文件路径’;
Extended Properties=’Excel 12.0;HDR=YES’
volkswageos 2010-06-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xys_777 的回复:]
这样只能实现查询,如果要导出excel,就要看下贴,zj的存储过程

SQL code
Select *
From
OpenRowSet('MICROSOFT.JET.OLEDB.4.0','EXCEL 8.0;DataBase=c:\t1.xls',[sheet1$])a
left join
OpenRowSet('MICROSOFT.JET.OLEDB.4.0','EXC……
[/Quote]
你说的zj的存储过程是什么意思啊?
volkswageos 2010-06-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 htl258 的回复:]
SQL code
--如果数据量大,如上万条记录,用ACE引擎访问速度将有惊人的提升:

/*
Microsoft.ACE.OLEDB.12.0 安装文件:

http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=7554f536-8c28-4598-9b72-ef94e038c8……
[/Quote]
我想直接使用ACE的dll文件,不想要安装文件,这样的话会很麻烦还得安装
永生天地 2010-05-31
  • 打赏
  • 举报
回复
/*===================================================================*/
--如果从SQL数据库中,导出数据到Excel,如果Excel文件已经存在,而且已经按照要接收的数据创建好表头,就可以简单的用:
insert into OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
,'Excel 5.0;HDR=YES;DATABASE=c:\test.xls',sheet1$)
select * from 表


--如果Excel文件不存在,也可以用BCP来导成类Excel的文件,注意大小写:
--导出表的情况
EXEC master..xp_cmdshell 'bcp 数据库名.dbo.表名 out "c:\test.xls" /c -/S"服务器名" /U"用户名" -P"密码"'

--导出查询的情况
EXEC master..xp_cmdshell 'bcp "SELECT au_fname, au_lname FROM pubs..authors ORDER BY au_lname" queryout "c:\test.xls" /c -/S"服务器名" /U"用户名" -P"密码"'

/*--说明:
c:\test.xls 为导入/导出的Excel文件名.
sheet1$ 为Excel文件的工作表名,一般要加上$才能正常使用.
--*/


--下面是导出真正Excel文件的方法:

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_exporttb]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[p_exporttb]
GO

/*--数据导出EXCEL

导出表中的数据到Excel,包含字段名,文件为真正的Excel文件
,如果文件不存在,将自动创建文件
,如果表不存在,将自动创建表
基于通用性考虑,仅支持导出标准数据类型

--邹建 2003.10(引用请保留此信息)--*/

/*--调用示例

p_exporttb @tbname='地区资料',@path='c:\',@fname='aa.xls'
--*/
create proc p_exporttb
@tbname sysname, --要导出的表名
@path nvarchar(1000), --文件存放目录
@fname nvarchar(250)='' --文件名,默认为表名
as
declare @err int,@src nvarchar(255),@desc nvarchar(255),@out int
declare @obj int,@constr nvarchar(1000),@sql varchar(8000),@fdlist varchar(8000)

--参数检测
if isnull(@fname,'')='' set @fname=@tbname+'.xls'

--检查文件是否已经存在
if right(@path,1)<>'\' set @path=@path+'\'
create table #tb(a bit,b bit,c bit)
set @sql=@path+@fname
insert into #tb exec master..xp_fileexist @sql

--数据库创建语句
set @sql=@path+@fname
if exists(select 1 from #tb where a=1)
set @constr='DRIVER={Microsoft Excel Driver (*.xls)};DSN='''';READONLY=FALSE'
+';CREATE_DB="'+@sql+'";DBQ='+@sql
else
set @constr='Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties="Excel 8.0;HDR=YES'
+';DATABASE='+@sql+'"'


--连接数据库
exec @err=sp_oacreate 'adodb.connection',@obj out
if @err<>0 goto lberr

exec @err=sp_oamethod @obj,'open',null,@constr
if @err<>0 goto lberr

/*--如果覆盖已经存在的表,就加上下面的语句
--创建之前先删除表/如果存在的话
select @sql='drop table ['+@tbname+']'
exec @err=sp_oamethod @obj,'execute',@out out,@sql
--*/

--创建表的SQL
select @sql='',@fdlist=''
select @fdlist=@fdlist+',['+a.name+']'
,@sql=@sql+',['+a.name+'] '
+case
when b.name like '%char'
then case when a.length>255 then 'memo'
else 'text('+cast(a.length as varchar)+')' end
when b.name like '%int' or b.name='bit' then 'int'
when b.name like '%datetime' then 'datetime'
when b.name like '%money' then 'money'
when b.name like '%text' then 'memo'
else b.name end
FROM syscolumns a left join systypes b on a.xtype=b.xusertype
where b.name not in('image','uniqueidentifier','sql_variant','varbinary','binary','timestamp')
and object_id(@tbname)=id
select @sql='create table ['+@tbname
+']('+substring(@sql,2,8000)+')'
,@fdlist=substring(@fdlist,2,8000)
exec @err=sp_oamethod @obj,'execute',@out out,@sql
if @err<>0 goto lberr

exec @err=sp_oadestroy @obj

--导入数据
set @sql='openrowset(''MICROSOFT.JET.OLEDB.4.0'',''Excel 8.0;HDR=YES;IMEX=1
;DATABASE='+@path+@fname+''',['+@tbname+'$])'

exec('insert into '+@sql+'('+@fdlist+') select '+@fdlist+' from '+@tbname)

return

lberr:
exec sp_oageterrorinfo 0,@src out,@desc out
lbexit:
select cast(@err as varbinary(4)) as 错误号
,@src as 错误源,@desc as 错误描述
select @sql,@constr,@fdlist
go



if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_exporttb]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[p_exporttb]
GO

/*--数据导出EXCEL

导出查询中的数据到Excel,包含字段名,文件为真正的Excel文件
如果文件不存在,将自动创建文件
如果表不存在,将自动创建表
基于通用性考虑,仅支持导出标准数据类型

--邹建 2003.10(引用请保留此信息)--*/

/*--调用示例

p_exporttb @sqlstr='select * from 地区资料'
,@path='c:\',@fname='aa.xls',@sheetname='地区资料'
--*/
create proc p_exporttb
@sqlstr varchar(8000), --查询语句,如果查询语句中使用了order by ,请加上top 100 percent
@path nvarchar(1000), --文件存放目录
@fname nvarchar(250), --文件名
@sheetname varchar(250)='' --要创建的工作表名,默认为文件名
as
declare @err int,@src nvarchar(255),@desc nvarchar(255),@out int
declare @obj int,@constr nvarchar(1000),@sql varchar(8000),@fdlist varchar(8000)

--参数检测
if isnull(@fname,'')='' set @fname='temp.xls'
if isnull(@sheetname,'')='' set @sheetname=replace(@fname,'.','#')

--检查文件是否已经存在
if right(@path,1)<>'\' set @path=@path+'\'
create table #tb(a bit,b bit,c bit)
set @sql=@path+@fname
insert into #tb exec master..xp_fileexist @sql

--数据库创建语句
set @sql=@path+@fname
if exists(select 1 from #tb where a=1)
set @constr='DRIVER={Microsoft Excel Driver (*.xls)};DSN='''';READONLY=FALSE'
+';CREATE_DB="'+@sql+'";DBQ='+@sql
else
set @constr='Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties="Excel 8.0;HDR=YES'
+';DATABASE='+@sql+'"'

--连接数据库
exec @err=sp_oacreate 'adodb.connection',@obj out
if @err<>0 goto lberr

exec @err=sp_oamethod @obj,'open',null,@constr
if @err<>0 goto lberr

--创建表的SQL
declare @tbname sysname
set @tbname='##tmp_'+convert(varchar(38),newid())
set @sql='select * into ['+@tbname+'] from('+@sqlstr+') a'
exec(@sql)

select @sql='',@fdlist=''
select @fdlist=@fdlist+',['+a.name+']'
,@sql=@sql+',['+a.name+'] '
+case
when b.name like '%char'
then case when a.length>255 then 'memo'
else 'text('+cast(a.length as varchar)+')' end
when b.name like '%int' or b.name='bit' then 'int'
when b.name like '%datetime' then 'datetime'
when b.name like '%money' then 'money'
when b.name like '%text' then 'memo'
else b.name end
FROM tempdb..syscolumns a left join tempdb..systypes b on a.xtype=b.xusertype
where b.name not in('image','uniqueidentifier','sql_variant','varbinary','binary','timestamp')
and a.id=(select id from tempdb..sysobjects where name=@tbname)

if @@rowcount=0 return

select @sql='create table ['+@sheetname
+']('+substring(@sql,2,8000)+')'
,@fdlist=substring(@fdlist,2,8000)

exec @err=sp_oamethod @obj,'execute',@out out,@sql
if @err<>0 goto lberr

exec @err=sp_oadestroy @obj

--导入数据
set @sql='openrowset(''MICROSOFT.JET.OLEDB.4.0'',''Excel 8.0;HDR=YES
;DATABASE='+@path+@fname+''',['+@sheetname+'$])'

exec('insert into '+@sql+'('+@fdlist+') select '+@fdlist+' from ['+@tbname+']')

set @sql='drop table ['+@tbname+']'
exec(@sql)
return

lberr:
exec sp_oageterrorinfo 0,@src out,@desc out
lbexit:
select cast(@err as varbinary(4)) as 错误号
,@src as 错误源,@desc as 错误描述
select @sql,@constr,@fdlist
go
永生天地 2010-05-31
  • 打赏
  • 举报
回复
这样只能实现查询,如果要导出excel,就要看下贴,zj的存储过程
Select *  
From
OpenRowSet('MICROSOFT.JET.OLEDB.4.0','EXCEL 8.0;DataBase=c:\t1.xls',[sheet1$])a
left join
OpenRowSet('MICROSOFT.JET.OLEDB.4.0','EXCEL 8.0;DataBase=c:\t2.xls',[sheet1$])b
on a.学号=b.学号

/*

姓名 学号 结算金额(元) 学号 姓名 合计
------------------------------ ------------------------------ ------------------------------ ------------------------------ ------------------------------ ------------------------------
齐正 200704021137 5000 200704021137.0 齐正 369.0
沙杨 200704021138 5000 200704021138.0 沙杨 123.0
苏林 200704021139 5000 NULL NULL NULL
孙博 200704021140 5000 NULL NULL NULL
孙伟 200704021141 5000 NULL NULL NULL
杨文博 200704021142 5000 NULL NULL NULL
张宇轩 200704021143 5000 NULL NULL NULL
艾师祺 200704031079 5000 200704031079.0 艾师祺 98.0
NULL NULL NULL NULL NULL NULL
NULL NULL NULL NULL NULL NULL

(所影响的行数为 10 行)

*/
htl258_Tony 2010-05-31
  • 打赏
  • 举报
回复
--如果数据量大,如上万条记录,用ACE引擎访问速度将有惊人的提升:

/*
Microsoft.ACE.OLEDB.12.0 安装文件:

http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=7554f536-8c28-4598-9b72-ef94e038c891

*/
SELECT *
FROM OPENROWSET(
'MICROSOFT.ACE.OLEDB.12.0', 'EXCEL 12.0;HDR=YES;IMEX=2;DataBase=d:\file1.xls',
[sheet1$]
)a
LEFT JOIN OPENROWSET(
'MICROSOFT.ACE.OLEDB.12.0', 'EXCEL 12.0;HDR=YES;IMEX=2;DataBase=d:\file2.xls',
[sheet1$]
)b
ON a.学号 = b.学号
GOODlivelife 2010-05-31
  • 打赏
  • 举报
回复
Select *
From
OpenRowSet('MICROSOFT.JET.OLEDB.4.0','EXCEL 8.0;HDR=YES;IMEX=2;DataBase=d:\file1.xls',[sheet1$])a
left join
OpenRowSet('MICROSOFT.JET.OLEDB.4.0','EXCEL 8.0;HDR=YES;IMEX=2;DataBase=d:\file2.xls',[sheet1$])b
on a.学号=b.学号

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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