关于EXCEL导入导出

as54608451899 2008-08-25 08:56:51
我有一个像订单一样的EXCEL表格,其中固定列,就是不变的列有30列,其它的是可变的,也就是说从31开始,有些单位可能会填写31-38列,有的也就是31-34列这样子,现在怎么样才能把EXCEL导入到数据库中?
...全文
117 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
caowenkai 2008-08-25
  • 打赏
  • 举报
回复
如2楼所说的做就行了.网上有很多资料.
jinjazz 2008-08-25
  • 打赏
  • 举报
回复
获取excel表结构
http://blog.csdn.net/jinjazz/archive/2008/05/13/2441635.aspx
用SqlBulkCopy 导入数据
http://blog.csdn.net/jinjazz/archive/2008/07/14/2650506.aspx
wlm1314 2008-08-25
  • 打赏
  • 举报
回复
学习
wwd252 2008-08-25
  • 打赏
  • 举报
回复
学习
suyiming 2008-08-25
  • 打赏
  • 举报
回复
用存储过程导出
这样就可以控制你需要的列
邹建的sql
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','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
chenyijiu 2008-08-25
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 as54608451899 的回复:]
问题是,要导入的数据全是有用数据。所以我不仅要导入固定列,还要导入扩展的列。各位有什么好办法解决没有?
[/Quote]
先把数据放到一个datatable里,就可以根据datatable的columns来获取其固定列和扩展列,你想怎么导入就怎么导入啊
tm62490309 2008-08-25
  • 打赏
  • 举报
回复
int rowNum = tmpDataTable.Rows.Count;
int columnNum = tmpDataTable.Columns.Count;
int rowIndex = 1;
int columnIndex = 0;

Excel.Application xlApp = new Excel.ApplicationClass();
xlApp.DefaultFilePath ="";
xlApp.DisplayAlerts = true;
xlApp.SheetsInNewWorkbook = 1;
Excel.Workbook xlBook = xlApp.Workbooks.Add(true);

//fieldname を书きます
foreach(DataColumn dc in tmpDataTable.Columns)
{
columnIndex ++;
xlApp.Cells[rowIndex,columnIndex] = dc.ColumnName;
}

//データを导出します
for(int i = 0;i<rowNum; i++)
{
rowIndex ++;
columnIndex = 0;
for (int j = 0;j<columnNum; j++)
{
columnIndex ++;
xlApp.Cells[rowIndex,columnIndex] = tmpDataTable.Rows[i][j].ToString();
}
}
xlBook.SaveAs((object)strFileName,objt,objt,objt,objt,objt,Excel.XlSaveAsAccessMode.xlNoChange,objt,objt,objt,objt,objt);
MessageBox.Show ("EXCELL表を作って终わりました!");
xlApp.Quit();
}
as54608451899 2008-08-25
  • 打赏
  • 举报
回复
问题是,要导入的数据全是有用数据。所以我不仅要导入固定列,还要导入扩展的列。各位有什么好办法解决没有?
chenyijiu 2008-08-25
  • 打赏
  • 举报
回复
你把excel中的数据读到一个dataset(or DataTable)里,然后根据datatable里的列数导入自已想要的数据
就行了
km4098 2008-08-25
  • 打赏
  • 举报
回复
up

62,254

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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