vb.net操作excel代码太慢

zss427607 2014-01-20 08:16:32
使用vb.net操作excel进行数据处理才700条就得2分钟太慢了,

主要实现一下操作,1、打开excel判断是否存在“产量”的表,存在新建0-31张新表,2、判断产量大于0的数

据全部放在0表中,3、日期.day=1,的放在1表中,等于2的,放在2表中,一直到31.

请各位帮忙优化一下,谢谢了。

代码如下:
Dim strFilePath As String
Dim i, j, k, l, m, n As Integer
OpenFileDialog1.Multiselect = False
OpenFileDialog1.Filter = "Excel File (*.xls)|*.xls"
OpenFileDialog1.ShowDialog()
If OpenFileDialog1.FileName <> "" Then
strFilePath = OpenFileDialog1.FileName
Dim eExcel As New ExcelHandler(strFilePath)
eExcel.Open(strFilePath)
Try
For i = 1 To eExcel.wWorkbook.Sheets.Count
If eExcel.wWorkbook.Sheets(i).name = "产量" Then
For j = 0 To 31
eExcel.AddSheet(j)
Next
End If
Next

l = 2
For k = 2 To 1000 'eExcel.wWorkbook.Sheets("产量").Rows.Count
If eExcel.wWorkbook.Sheets("产量").Cells(k, 13).Value > 0 Then
eExcel.wWorkbook.Sheets("0").Cells(l, 1).Value = eExcel.wWorkbook.Sheets("产量").Cells(k, 1).Value
eExcel.wWorkbook.Sheets("0").Cells(l, 2).Value = eExcel.wWorkbook.Sheets("产量").Cells(k, 2).Value
eExcel.wWorkbook.Sheets("0").Cells(l, 3).Value = eExcel.wWorkbook.Sheets("产量").Cells(k, 3).Value
eExcel.wWorkbook.Sheets("0").Cells(l, 4).Value = eExcel.wWorkbook.Sheets("产量").Cells(k, 4).Value
eExcel.wWorkbook.Sheets("0").Cells(l, 5).Value = eExcel.wWorkbook.Sheets("产量").Cells(k, 5).Value
eExcel.wWorkbook.Sheets("0").Cells(l, 6).Value = eExcel.wWorkbook.Sheets("产量").Cells(k, 6).Value
eExcel.wWorkbook.Sheets("0").Cells(l, 7).Value = eExcel.wWorkbook.Sheets("产量").Cells(k, 7).Value
eExcel.wWorkbook.Sheets("0").Cells(l, 8).Value = eExcel.wWorkbook.Sheets("产量").Cells(k, 8).Value
eExcel.wWorkbook.Sheets("0").Cells(l, 9).Value = eExcel.wWorkbook.Sheets("产量").Cells(k, 9).Value
eExcel.wWorkbook.Sheets("0").Cells(l, 10).Value = eExcel.wWorkbook.Sheets("产量").Cells(k, 10).Value
eExcel.wWorkbook.Sheets("0").Cells(l, 11).Value = eExcel.wWorkbook.Sheets("产量").Cells(k, 11).Value
eExcel.wWorkbook.Sheets("0").Cells(l, 12).Value = eExcel.wWorkbook.Sheets("产量").Cells(k, 12).Value
eExcel.wWorkbook.Sheets("0").Cells(l, 13).Value = eExcel.wWorkbook.Sheets("产量").Cells(k, 13).Value
eExcel.wWorkbook.Sheets("0").Cells(l, 14).Value = eExcel.wWorkbook.Sheets("产量").Cells(k, 14).Value
l = l + 1
End If
Next
Dim MyDate As Date
n = 2
For m = 2 To 1000 'eExcel.wWorkbook.Sheets("产量").Rows.Count
MyDate = eExcel.wWorkbook.Sheets("产量").Cells(m, 2).Value
If MyDate.Day = "1" Then
eExcel.wWorkbook.Sheets("1").Cells(n, 1).Value = eExcel.wWorkbook.Sheets("产量").Cells(m, 1).Value
eExcel.wWorkbook.Sheets("1").Cells(n, 2).Value = eExcel.wWorkbook.Sheets("产量").Cells(m, 2).Value
eExcel.wWorkbook.Sheets("1").Cells(n, 3).Value = eExcel.wWorkbook.Sheets("产量").Cells(m, 3).Value
eExcel.wWorkbook.Sheets("1").Cells(n, 4).Value = eExcel.wWorkbook.Sheets("产量").Cells(m, 4).Value
eExcel.wWorkbook.Sheets("1").Cells(n, 5).Value = eExcel.wWorkbook.Sheets("产量").Cells(m, 5).Value
eExcel.wWorkbook.Sheets("1").Cells(n, 6).Value = eExcel.wWorkbook.Sheets("产量").Cells(m, 6).Value
eExcel.wWorkbook.Sheets("1").Cells(n, 7).Value = eExcel.wWorkbook.Sheets("产量").Cells(m, 7).Value
eExcel.wWorkbook.Sheets("1").Cells(n, 8).Value = eExcel.wWorkbook.Sheets("产量").Cells(m, 8).Value
eExcel.wWorkbook.Sheets("1").Cells(n, 9).Value = eExcel.wWorkbook.Sheets("产量").Cells(m, 9).Value
eExcel.wWorkbook.Sheets("1").Cells(n, 10).Value = eExcel.wWorkbook.Sheets("产量").Cells(m, 10).Value
eExcel.wWorkbook.Sheets("1").Cells(n, 11).Value = eExcel.wWorkbook.Sheets("产量").Cells(m, 11).Value
eExcel.wWorkbook.Sheets("1").Cells(n, 12).Value = eExcel.wWorkbook.Sheets("产量").Cells(m, 12).Value
eExcel.wWorkbook.Sheets("1").Cells(n, 13).Value = eExcel.wWorkbook.Sheets("产量").Cells(m, 13).Value
eExcel.wWorkbook.Sheets("1").Cells(n, 14).Value = eExcel.wWorkbook.Sheets("产量").Cells(m, 14).Value
n = n + 1
End If
Next

Catch
End Try
eExcel.Close()
End If

...全文
577 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
threenewbee 2014-01-21
  • 打赏
  • 举报
回复
用OLEDB以数据库方式读取。
zss427607 2014-01-21
  • 打赏
  • 举报
回复
引用 4 楼 caozhy 的回复:
用OLEDB以数据库方式读取。
Dim strFilePath As String Dim i, j, k, l, m, n As Integer OpenFileDialog1.Multiselect = False OpenFileDialog1.Filter = "Excel File (*.xls)|*.xls" OpenFileDialog1.ShowDialog() If OpenFileDialog1.FileName <> "" Then strFilePath = OpenFileDialog1.FileName Dim eExcel As New ExcelHandler(strFilePath) eExcel.Open(strFilePath) Try For i = 1 To eExcel.wWorkbook.Sheets.Count If eExcel.wWorkbook.Sheets(i).name = "产量" Then For j = 0 To 31 eExcel.AddSheet(j) Next End If Next Dim Conn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFilePath & ";Extended Properties=Excel 8.0;" Dim OleDbConnection As OleDb.OleDbConnection = New OleDb.OleDbConnection(Conn) Dim sql As String = "SELECT * FROM [产量$] where 产量 > 0" Dim OleDbDataAdapter As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(sql, Conn) Dim dt As New DataTable OleDbDataAdapter.Fill(dt) eExcel.wWorkbook.Sheets("0").cells(1, 1).value = dt.DataSet.Tables Catch End Try eExcel.Close() End If 取不到数据呀,请版主帮忙看看。
  • 打赏
  • 举报
回复
不要用最懒惰和最不需要思考的c#代码 --> 不要用最懒惰和最不需要思考的代码 代码不重要,思考和总结才重要。
  • 打赏
  • 举报
回复
我少估计你的奢侈浪费的尺度。你那不是3000次,而是大概30000次。 比如说,给Excel的 B2:F1001 进行赋值操作,用一个二维数组直接给 worksheet.Range("B2:F1001").Value2 赋值就行了。一次操作,而你用了5000次交互操作! 另外,对Excel操作之前,可以设置其 ScreenUpdating 为false,等更新完数据之后才设置为 True。 等等。对Excel操作需要认真学习Excel对象结构,不要用最懒惰和最不需要思考的c#代码。
  • 打赏
  • 举报
回复
如果3次于Excel进行跨平台交互操作就能搞定的,你要用3000次操作搞定,这能不慢么?
姓 名: 周方勇 网 名: 长江支流/咏方舟 Email: flygoldfish@sina.com.cn Blog: http://blog.csdn.net/flygoldfish 2004年04月18日 1、在网友的热心支持下免费提供空间和域名 www.webmis.com.cn 2004年04月07日 发布不带.dll的源码供交流 2005年01月24日 1、提供VB.NET及C#的使用示例工程 2、发布V2.2测试版 2005年01月22日 将打印示例程序按功能(简单打印、完整示例、Excel打印)分在不同的窗口 2005年01月14日 发布《MIS金质打印通》 V2.1测试版 2004年01月13日 1、将MisPrinter类改为MisGoldPrinter,以促进品牌效应。 2、在MisGoldPrinter类中再增加一个带参构造函数,以便直接默认横向打印/预览 3、增加DocumentName属性,以便在打印/预览时在窗口标题栏中显示指定的名称 2004年01月07日 调整打印程序内部结构,为使发出去的后期源程序版本一致,待近期调整完结构之后公布源码! 这就是继V1.1之后没有发源代码的原因。 ____________________________________________________ 2004年7月 完成了整体的框架、涉及打印的几个对话框、核心打印程序及几个基本打印对象并由BillPrinter类将其组织起来,程序基本定型。 本程序为通用打印程序,单据、会计凭证、发票清单、报表、任意复杂表格、合并表格如工矿企业合同都可以由系统提供的几个默 认打印对象组合打印。 DataGrid、DataTable、MSHFlexGrid等二维形式全部可以打印。 部分对象如PrinterMargins、Sewing、GridLineFlag、GridMergeFlag等提供图例,以促进理解。 后期版本将提供XML描述、SQL数据源的打印,并用管理器管理任意多个网格、文本对象、图象等,用户可以随意定义。 2004年8月初 为一些类或程序写上注释,如下: /// 程序提供:周方勇;Email:flygoldfish@sina.com。 /// 请 关 注:WebMIS.Net快速开发工具,不写一行程序开发B/S架构下MIS、OA、CRM、人事管理、档案管理等数据库网页系统。简单、实用、稳定、可靠。 /// 下 载: /// 上海奥联:WWW.AlinkSoft.COM /// 用友华表:WWW.CellSoft.CC ///★★★★★您可以免费使用此程序,但是请您保留此说明,以维护知识产权★★★★★ 2004年08月07日 1、将框架作了部分调整,并且将打印基本对象的基类Printer作了调整。 由于打印对象的定位及打印区域受PrintDocument、Sewing影响,为了方便Printer的子类不必在每次实例化后设置这 两个对象,故将PrintDocument、Sewing放在一个类中作为全局静态变量,现删除这两个全局静态变量, 改在Printer 的构造函数中,为每个子类提供一个默认的PrintDocument、Sewing实例对象。 2、为GridBase扩充了几个属性与方法,由于字段太多,每次增加或修改字段后要去构造函数中去修改他们的初始化, 太麻烦了,所以将它们的初始化直接放在定义处,并把相应的属性及相关方法直接放在字段后,并用#region指令将 它们折叠起来,便于维护。 3、增加了ReDimArrString(string[,] arrStr,int rows,int cols),即重定义二维字符数组,因为网格的行列数可能要改 变,但不能因为它们改变了而丢失原有的数据,因此写此程序保留新定义的行列,但保留和原有行列数相交的部分数据。 4、应用设计模式原理重新组织IPrinterPageSetting、PrinterPageSetting、WinPrinterPageSetting、WebPrinterPageSetting。 WebPrinterPageSetting待进一步完善。 2004年08月08日 1、将以往程序优化 2、将DrawGrid类中DrawGridLine(...)、DrawGridText(...)、DrawGridBorder(...)参数最全的核心函数改为protected,提供public的 无参方法供实例化对象调用; 由于在指定的区域内可能绘制不完网格,因此上面的几个函数可能会将返回类型void改为一个描述绘制结果的对象; SetText(int row,int col,string text)、SetText(int row,int col)将在后期版本中提供.Row[index].Text的属性; TransGrid()、ResetTransGrid()是在设计时为了能做任意的缩放的变换提供的,待进一步完善。 3、对Printer类中的ReSetVariableVal()、GetPrinterMargins()进行修改,以适应对纸张进行调整特别是横向、竖向打印的支持。 2004年08月09日 1、解决分页问题,主要是有些对象每页都重复打印,使得条件复杂。 2004年08月10日 1、13:42将源程序传给资深程序员李峰; 2、计划增加每页小计。 2004年08月11日 1、为网格增加画对角线的功能,以满足中国人表格的特点; 2、将Graphics、PrintDocument、Sewing、RectangleF、Height、Draw()重新组织在IDraw里,并在 BillPrinter中增加private void OutObject(IDraw outer),使每个对象输出时调用此方法,提高代码重用率; 2004年08月14日 1、忘了,反正又把程序看了看,修修补补做了些调整。 2004年08月15日 1、将分页又重新简化了一下,主要是打印Body上用了数据行指针; 2004年08月16日 1、发布V1.0源码版,程序名称为MIS金质打印王。 2、在CSDN上发布贴子: .^^.开源:C#.NET开发的MIS打印程序,各种网格如DataGrid打印、DataTable、HtmlTable等二维形式全搞定,源码免费下载 http://community.csdn.net/Expert/topic/3278/3278050.xml?temp=.5012934 2004年08月17日 1、在CSDN上发布文章: 开源:.NET环境下有关打印页面设置、打印机设置、打印预览对话框的实现 http://blog.csdn.net/flygoldfish/archive/2004/08/17/77208.aspx 2、应广大网友来信要求,计划将PrinterPageSetting目录开源到演示程序,以后逐一以文章的形式全部开放。 2004年08月18日 1、中国共享软件网收录 MIS金质打印王 V1.0源码版 http://www.shareware.cn/pub/2319.html 2、将PrinterPageSetting目录即(页面设置、打印机设置、打印预览)源码加入演示程序。 3、在MisGoldPrinter中添加属性,DataSource,这样,仅需几句话就可以打印了,如: MisGoldPrinter webmis = new MisGoldPrinter(); //申明并实例化打印组件 webmis.Title = "WebMIS.Net快速开发工具\nWWW.AlinkSoft.COM"; //网格标题 webmis.DataSource = this.dataGrid1; //DataGrid作为数据源 webmis.Preview(); //打印预览 注意:将将MisGoldPrinter中的Draw(Graphics g)打印各个对象时加一下 printerobject != null的判断,如 if (mCurrentPageIndex == 1 || _caption.IsDrawAllPage)... 改为 if (_caption != null && (mCurrentPageIndex == 1 || _caption.IsDrawAllPage))... 否则可能会出错。 4、将3的应用加到了frmPrint.cs ,做一个简单的打印。 2004年08月19日 1、将PrinterPageSetting目录即(页面设置、打印机设置、打印预览)源码加入演示程序。 2、发布V1.1源码版,程序名称为MIS金质打印王。 2004年09月03日 1、由于在CSDN上发表文档".NET环境下有关打印页面设置、打印机设置、打印预览对话框的实现", 因此将PrinterPageSetting封装成一个.dll,分别用C#与VB.net写了使用示例工程程序 2、在IPrinterPageSetting.cs增加event PrintPageDelegate PrintPage,并将原PrintPage改为PrintPageValue /// C#调用: /// PrinterPageSetting1.PrintPageValue = new PrintPageDelegate(this.PrintPageEventHandler); ///或 PrinterPageSetting1.PrintPage += new PrintPageDelegate(this.PrintPageEventHandler); /// VB调用: /// Me.printerPageSetting.PrintPageValue = New GoldPrinter.PrintPageDelegate(AddressOf printDocument_PrintPage) 3、增加了DrawText类,用以打印文档(其实可以用一行一列的DrawGrid打印) 4、PrinterPageSetting的readme.txt如下: ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ 声明: 1、版权归周方勇所有,如需传播,请保留完整的内容及此声明,以维护知识产权! 2、您可以使用本程序中的任何部分作为学习或商业用途,但是需要保留相关程序的注释。 3、最新版本下载:http://www.alinksoft.com 4、免费源码 5、本人不承担任何责任。 周方勇;Email:flygoldfish@sina.com。 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ 本程序带C#与VB.net版本使用方式,用VS.net打开PrinterPageSetting.sln, 在您喜欢的语言项目上单击鼠标右键,在弹出的菜单中选择"设为启动项目",然后运行。 5、准备独立发布PrinterPageSetting 2004年09月04日 重大喜讯:收到中国共享软件注册中心2004年09月03日的邮件。部分内容如下: 软件名称:MISGoldPrinter免费C#.NET源码版(5块钱给softreg吧) 注册价格:5元/套 您的软件在本站的编号是: /535AC7A1-9985-4314-A52C-978BB9C0BB29/ 软件注册页绝对链接: http://www.softreg.com.cn/shareware_view.asp?id=/535AC7A1-9985-4314-A52C-978BB9C0BB29/ 快捷链接: http://www.softreg.com.cn/shareware.asp?id=17260 2004年10月...日 改变PrintDocument的DefaultPageSettings就会改变PrinterMargins。由于是打印基类,继承者博多,因此 每次实例化时都会计算PrinterMargins会影响效率,这就是前些版本速度慢的原因。改为手动调用CalculatePageInfo()或改变 PrintDocument后在调用处重新计算一个PrinterMargins保存起来,因此增加PrinterSingleton, 使系统只有同一个PrintDocument及PrinterMargins,这样速度大大改观。 开发Excel打印功能 2004年11月20日 开发Excel打印功能完成,能够生成Excel文件、Excel打印预览、Excel操作。 自定制模板打印,非常灵活。完成各种打印、套打、报表、图表分析。 2004年11月23日 发布MIS金质打印王 V2.0测试版。如需要源码,下载V1.1即可。 V2.0源码版在预计在12月上旬推出。 2004年11月27日 改正预览时显示正确,在预览窗口单击打印时打印不出Body的错误。 其实只要在PrintPageEventHandler()中打印或预览重置当前页及当前行 this.mCurrentPageIndex = 1; this.mCurrentRowIndex = 0; 2004年12月...日 1、调整打印程序内部结构,公开部分程序基本没动,只作相应的错误更正及加几个属性。 2、PrinterBase不再包含装订线Sewing,打印对象的定位及打印区域只受PrintDocument的影响, 3、由于使用PrinterSingleton使系统只有同一个PrintDocument及PrinterMargins,因此在同一系统 两个地方使用时出现了打印一样的效果,如A处有header而B处没有,先打A再打B,结果B中也有header了, 于是在PrinterSingleton增加Reset()方法以使PrintDocument及PrinterMargins为null,在MisPrinter 构造函数中首先调用Reset()
2.5主要变动: 1.重要改进:新版本中Delphi下的VCL控件已经比较完善,封装良好,与Delphi无缝连接,改变了旧版中需要将Dataset中的数据复制到报表引擎中的实现方式,通过模拟ADO接口的方式直接支持BDE/ClientDataset/等非ADO方式的Dataset,不需要考虑太多的COM方面的因素,强烈建议Delphi的开发者直接使用该VCL控件。 使用VCL控件编译的程序发布时,将AcReport.dll和您的EXE放在同一个文件夹下一起发布即可,不需要运行RegSvr32来注册控件,VCL中的代码会自动注册该控件。 2.完善文本控制方式(在设计器界面上增加了此项菜单): 1).当文本控制设置为自动适应单元格(自动缩放字体)时,选择上对齐方式时,也能自动换行。 2)当文本控制设置为截断字符时,支持自动换行,保持单元格的高度不变,在某些特殊应用中,不管文本如何变化,可以保持表格的形状不变。 3.增加了OnSaveReport事件,当用户在设计器中点击“保存”按扭时,会触发此事件,程序可以响应此事件执行自定义保存,例如可以将报表保存到数据库中,或者返回一个信息给设计器用户。 4.直接支持ADO.net中的Dataset和DataTable对象,不需要再通过CustDataBuiler对象来转换,大大提高了在.net下的运行速度。(需要引用 AcNetUtils.dll,具体使用方法请参考Demo) 代码示例: //Dataset: //2.5以前的版本需要将Ado.net下datatable在AC中copy一个复本,速度比较慢 // AcReport.AcUtils.CopyDatasetToAcRptEngine(mDataset, mac, false); //新版本的处理方式,通过ADO-ADO.net适配器的方式直接访问 DbAdapter.FillDatasetToAC(mDataset, mac); //DataTable: mDataset.Tables["zlemployee"].TableName = "雇员档案"; AcReport.AcUtils.CopyTableToAcRptEngine(mDataset.Tables["雇员档案"], mac, false); //重新加入一个表到AcReport (旧版本方式) //在2.5以后的版本中,可以用如下的方式将ADO.net的DataTable对象通过AcRecordsetAdapter转换为ADO接口的方式直接加入到AcEngine, //这样做就不需要在AC中复制一个复本,大大提高的速度。 AcRecordsetAdapter RecordAdp = new AcRecordsetAdapter(mDataset.Tables["雇员档案"]); mac.AddNetAdoData("雇员档案", RecordAdp); // 以上两行也可以直接调用 AcNetUtils 类库里提供的现成方法(效果是一样的): AcNetUtils.DbAdapter.FillDataTableToAC(mDataset.Tables["雇员档案"], mac); 5.可拖动对象设计功能增强 6.支持 条码 Code128 Auto ACReport简介 Anycell Report(简称AC Report)是一款中国式报表组件,是国内最早的基于表格,支持图文混排、公式和脚本的中国式报表工具之一。就如Anycell Report的名称那样,灵活强大的表格功能一直是AC Report区别于其它软件或控件最显著的特征之一,AC Report 表格取消了传统表格概念中“列”的概念,每一行上的单元格数量可以不等,且可以自由活动,勿须上下对齐,在制作复杂的中国式报表时可以避免很多不必要的合并拆分操作,制作表格更加方便和随心所欲,并且省时省力。AC Report单元格支持多种丰富的形态,例如格式化文本、图片、图表、条码、OLE容器等。 AC Report的一些基本特点: 1.独具特色的表格,风格与Word表格相似,但可以做出比Word或Excel更灵活的表格来。 2. 功能全面、专业的中国式报表设计器,中国用户更易于学习和接受。 3.支持多种单元格样式,可以打印图像、图表(直方图、折线图等)、Rich文本、 条形码、中式财务帐薄、支持在报表中嵌入Word、Excel文档等。 4. 强大的计算和合计功能。内置表达式解析系统和函数库。 5. 可扩充性,可以在应用程序中给报表引擎扩充函数库、报表样式和单元格样式。 6.支持多种报表样式,如清单式、分组、交叉表、以及子报表

16,721

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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