C#快速往Excel中插入数据的问题,请小山,秋枫等热心高手帮忙

sywcf 2006-01-12 10:30:59
加精
我现在是做access数据导入到Excel中的程序.
我先把access中的数据存入了DataTable中,现在导入Excel中,查了好多资料,都说明了速度快是先把数据放入一个二维数组中,然后再赋给Range,我也这样试了。但速度并不快。现在只有2万多条记录,一个10个字段,
请高手给个能真正加快速度的好用实例。
...全文
1384 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
mybobby 2006-02-21
  • 打赏
  • 举报
回复
mark
dashen 2006-02-08
  • 打赏
  • 举报
回复
学习
echoxue 2006-01-15
  • 打赏
  • 举报
回复
学习一下
tangxuehua 2006-01-15
  • 打赏
  • 举报
回复
能不能先把数据放到SqlServer中,然后利用存储过程来实现;或者也可以考虑用bcp导入导出工具来实现。
ttrice 2006-01-15
  • 打赏
  • 举报
回复
mark
sywcf 2006-01-13
  • 打赏
  • 举报
回复
谢3000sunqin(3000sunqin),但是请注意,一定要是C#才行,别的现在是不能考虑,由不得自已定.
最好是那种能用C#调用access里的导出功能。vb好像可以,但不知C#怎么样?
sywcf 2006-01-13
  • 打赏
  • 举报
回复
昨天下午忙别的去了,没及时回贴,多谢大家关注。

多谢chenkejun(我的生活很无聊) ,现在问题是将数据导入到Excel中,有几种方法,但是我试过都不太理想,比如利用剪切板的这种,还有可以设置range的方法,最后通过range.set_Value(Missing.Value, saRet ); 把值传给excel,但是这些方法,在几K条记录时,还可以,几万条时,都很慢。
3000sunqin 2006-01-13
  • 打赏
  • 举报
回复
这个问题我碰到过,建议使用VBA来解决,以下是VB代码经过测试,3000条数据从Access中导出大概时间3秒不到;
Dim Rs_Data As New ADODB.Recordset
Dim Irowcount As Integer
Dim Icolcount As Integer

Dim xlApp As New Excel.Application
Dim xlBook As Excel.Workbook
Dim xlSheet As Excel.Worksheet
Dim xlQuery As Excel.QueryTable

With Rs_Data
If .State = adStateOpen Then
.Close
End If
.ActiveConnection = Cn
.CursorLocation = adUseClient
.CursorType = adOpenStatic
.LockType = adLockReadOnly
.Source = strOpen
.Open
End With
With Rs_Data
If .RecordCount < 1 Then
MsgBox ("没有记录!")
Exit Function
End If
'记录总数
Irowcount = .RecordCount
'字段总数
Icolcount = .Fields.Count
End With

Set xlApp = CreateObject("Excel.Application")
Set xlBook = Nothing
Set xlSheet = Nothing
Set xlBook = xlApp.Workbooks().Add
Set xlSheet = xlBook.Worksheets("sheet1")
xlApp.Visible = True

'添加查询语句,导入EXCEL数据
Set xlQuery = xlSheet.QueryTables.Add(Rs_Data, xlSheet.Range("a1"))

With xlQuery
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = True
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
End With

xlQuery.FieldNames = True '显示字段名
xlQuery.Refresh

With xlSheet
.Range(.Cells(1, 1), .Cells(1, Icolcount)).Font.Name = "黑体"
'设标题为黑体字
.Range(.Cells(1, 1), .Cells(1, Icolcount)).Font.Bold = True
'标题字体加粗
.Range(.Cells(1, 1), .Cells(Irowcount + 1, Icolcount)).Borders.LineStyle = xlContinuous
'设表格边框样式
End With

With xlSheet.PageSetup
.LeftHeader = "" & Chr(10) & "&""楷体_GB2312,常规""&10公司名称:" ' & Gsmc
.CenterHeader = "&""楷体_GB2312,常规""公司人员情况表&""宋体,常规""" & Chr(10) & "&""楷体_GB2312,常规""&10日 期:"
.RightHeader = "" & Chr(10) & "&""楷体_GB2312,常规""&10单位:"
.LeftFooter = "&""楷体_GB2312,常规""&10制表人:"
.CenterFooter = "&""楷体_GB2312,常规""&10制表日期:"
.RightFooter = "&""楷体_GB2312,常规""&10第&P页 共&N页"
End With

xlApp.Application.Visible = True
Set xlApp = Nothing '"交还控制给Excel
Set xlBook = Nothing
Set xlSheet = Nothing
End Function

不知道新的office2003中VBA是否支持.NET,这里使用的是ado的recordSet,看看新版的office有没有支持ado.net的方法
chenkejun 2006-01-13
  • 打赏
  • 举报
回复
系统剪切板的方法和那种用vbtab分割数据组成文件流的方法某些情况下会出错。
例如数据中存在回车换行的情况,就是Excel中一个cell中两行数据的情况。
还有要设定输出Excel的cell的属性,否则不好对应日期型、数字型的格式化。
你可以把二维数组设置成object型,直接把datatable中的数据赋值进去,再根据datatable的每列属性设置好excel的cell的属性,选取好要填充的区域,把设置好的数组填充过去。
sywcf 2006-01-13
  • 打赏
  • 举报
回复
to singlepine(小山):
这个我用过,如果记果几百条还可以,如果几万条,太慢了。
for( int k=0; k<ds.Tables[i].Columns.Count; k++ )
{

stringBuffer += ds.Tables[i].Rows[j][k].ToString();
if( k < ds.Tables[i].Columns.Count - 1 )
stringBuffer += "\t";
}
stringBuffer += "\n";
这里会执行很长时间.
我的表中的10个字段,几万个数据。
TT008 2006-01-13
  • 打赏
  • 举报
回复
Study
如果是SQL的话就直接用邹健老大写的存储过程就行了
不过数据量多于六万之后有些数据就导不出了
azmiao 2006-01-13
  • 打赏
  • 举报
回复
我的环境是ASP.NET,在服务器端生成Excel文件,但是如果运行到xlWorkbook.Save时,程序一下就过去了,但是网页还是显示秒漏形状,文件也没有保存下来。我把ASP.NET用户设置成超级用户了。
chenkejun 2006-01-13
  • 打赏
  • 举报
回复
恩,不错。
sywcf 2006-01-13
  • 打赏
  • 举报
回复
10几万条数据,只需几秒钟,哈哈,打错了
sywcf 2006-01-13
  • 打赏
  • 举报
回复
问题已经解决,将主要代码贴出,与大家一起分享。
1.引用COM组件access10

Access.ApplicationClass oAccess = new Access.ApplicationClass();
oAccess.Visible = false;
//ACCESS10:
oAccess.OpenCurrentDatabase("d:\\test.mdb",false,"");
//导入access
oAccess.DoCmd.TransferSpreadsheet(Access.AcDataTransferType.acExport,Access.AcSpreadSheetType.acSpreadsheetTypeExcel9,"一个表名","d:\\test.xls",true,null,null);
//导入txt
//oAccess.DoCmd.TransferText(Access.AcTextTransferType.acExportDelim,"","一个表名","d:\\test.txt",true,"",0);
oAccess.CloseCurrentDatabase();
oAccess.DoCmd.Quit(Access.AcQuitOption.acQuitSaveNone);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oAccess);
oAccess = null;
MessageBox.Show("导入成功");

这是调用access数据库的导出功能直接导出到Excel文件中,速度超级快,10条数据,只需几秒钟。

相关资料:
http://blog.csdn.net/wukong777/archive/2004/10/09/129329.aspx
http://wier.csse.monash.edu.au/live/file_data/wier_projects/306/codemodule.htm
http://book.77169.org/ask20/how124372.htm


chenkejun 2006-01-13
  • 打赏
  • 举报
回复
还有注意控制一下数据的大小,excel最多65535条数据,1024列。多了会出错。
chenkejun 2006-01-13
  • 打赏
  • 举报
回复
当然是没法和生成CSV文件的速度相比,但CSV不能设置cell属性,看你怎么取舍了。
另外我是用VB.NET实现的,应给和C#没什么差别吧。
chenkejun 2006-01-13
  • 打赏
  • 举报
回复
range设置的方法还算凑合吧。
我是先设置列属性,然后选定range,用range.value = array的方法。
生成Excel一共三个sheet,分别为24000行,36列;12000行,42列;3200行,20列。
整个文件大小14M左右。
用时不到30秒。
另外机器配置为迅驰1.7G / 2G DDR333内存。
运行时excel进程占用内存最大60M,最小20M。平均30到35M之间。
luojinat2005 2006-01-12
  • 打赏
  • 举报
回复
up
--------------------------------------------------------
lidong6 2006-01-12
  • 打赏
  • 举报
回复
csv文件用"\r\n"分隔行用"\t"分隔列的文本文件.

相信楼主应该很容易的实现的.
加载更多回复(13)

110,535

社区成员

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

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

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