关于通过COM自动化调用Excel的效率问题
如果笔者告诉你,往Excel表格中写几十万条数据不会超过10秒钟,而不是通常设想的数分钟甚至数十分钟,你是否会相信,但实际情况就是这样。在Office开发中,最为常用的对象就是Range对象,而最被误用的对象也是Range对象。下面笔者举一个简单的例子说明如何有效的使用Range对象,以导出数据到Excel。
在实践中,通过COM自动化调用Excel,不管是通过VB还是通过VSTO在.net下调用Excel,最为耗时的操作就是对Range的操作,而Excel对象、WorkBook和WorkSheet 对象的创建通常会在1-3秒内完成(笔者计算机上测试最多不会超过5秒)。如果我们需要向Excel中导出大量数据,一般的做法是(使用晚绑定):
1Sub test1()
2Dim objExcel As Object
3Dim objBook As Object
4Dim objSheet As Object
5Dim objRng As Object
6Dim i As Long, j As Long
7
8Set objExcel = CreateObject("Excel.Application")
9Set objBook = objExcel.Workbooks.Add()
10Set objSheet = objBook.Worksheets(1)
11Set objRng = objSheet.Range("A" & 1 & ":" & "J" & 2000)
12
13With objRng
14For j = 1 To 2000 Step 1
15For i = 1 To 10 Step 1
16 .Cells(j, i).Value = CStr(j)
17Next i
18Next j
19End With
20
21 objExcel.Visible = True
22
23Set objBook = Nothing
24Set objSheet = Nothing
25Set objExcel = Nothing
26End Sub
27
28
这段程序大概需要执行2分钟左右(注意,数据一共是2000行;笔者的机器是Dell i8500笔记本,P4 2.0,512内存)甚至更长。使用早期绑定和晚期绑定对于这样的程序,差别很小。
如果测试一下,可以发现时间主要花在Range的操作上。查一下Excel的文档,可以看到,Range对象可以和数组进行很好的互操作。在笔者正在进行的《Excel与VBA程序设计》中关于效率一节(7.7)对Range对象的使用,特别是大数据量频繁引用的情况下,需要使用数组代替,但没有展开讨论。
例如将Range赋给数组:vData = ActiveSheet.Range("A1:B10").Value
vData 就是一个数组。反过来,使用:
ActiveSheet.Range("D1:E10").Value = vData
就可以将数组vData的值赋给Range,如果Range的范围较小,则自动截断。
下面,我们将上面的例子使用此思路修改为以下的样子(这次数据一共为20000行,是上边的10倍):
1Sub Test2()
2
3Dim objExcel As Object
4Dim objBook As Object
5Dim objSheet As Object
6Dim objRng As Object
7Dim i As Long, j As Long
8
9Set objExcel = CreateObject("Excel.Application")
10Set objBook = objExcel.Workbooks.Add()
11Set objSheet = objBook.Worksheets(1)
12Set objRng = objSheet.Range("A" & 1 & ":" & "J" & 20000)
13
14Dim a(1 to 20000, 1 to 10) As Variant
15
16For j = 1 To 20000 Step 1
17
18For i = 1 To 10 Step 1
19 a(j, i) = CStr(j)
20Next i
21
22Next j
23
24 objRng.Value = a
25
26 objExcel.Visible = True
27
28Set objBook = Nothing
29Set objSheet = Nothing
30Set objExcel = Nothing
31
32End Sub
33
这段程序在笔者机子上运行时间为2-4秒,一般为2.x秒,效率差别可见一斑。
一般来说,我们向Excel中写数据,很多数据块应该都是可以使用数组代替的,这种情况下,先生成数组,再将数组赋给Excel的Range对象,即可大大提高效率(而且,数据量越大,效率差别越大)。
Java实现Excel数据导入导出的研究与应用 王晶晶 北京邮电大学网络教育学院(100088) E-mail:bolalisi_double@https://www.docsj.com/doc/1c10672353.html, 摘要:Excel能够通过功能强大的工具将杂乱的数据组织成有用的信息,然后分析、交流和共享所得到的结果。很多系统由于存在着大量需要处理的数据,Excel本身强大的功能使得它成为处理分析这些数据首选的工具。随着Java语言成为越来越多系统的开发语言,利用Java进行Excel的数据导入导出在很多系统中都发挥着重要的作用,本文主要介绍了Jxl API的主要功能,并结合实例探讨了利用Jxl API操作Excel数据的导入和导出。 关键字:Java;Excel; Jxl API;数据导入导出 中图分类号:TP312文献标识码:A 1. 引言 MS的电子表格(Excel)是Office的重要成员,是保存统计数据的一种常用格式。在一个Java应用中,将一部分数据生成Excel格式,是与其他系统无缝连接的重要手段。在远程网络教学系统中,利用Excel表格统计学生的作业考试情况信息,便于老师了解学生的学习情况,分析教学效果,制定教学计划。所以,用Java操作Excel表格,导出相关的信息对于远程网络教育系统有着的很重要的意义。 在开源世界中,有两套比较有影响的API提供Excel数据导入导出的功能,一个是POI,一个是jExcelAPI。本文结合基于J2EE开发的多媒体教学系统中提供的将学生作业信息导出到Excel表格中的实例,详细阐述了利用JAVA开发的jExcelAPI操作excel的方法。 2. Jxl 简介 2.1 Java语言简介 Java语言具有面向对象、与平台无关、安全、稳定和多线程等优良特性,是目前软件设计中极为强大的编程语言[1]。它具有以下一些特点[2]:简单,面向对象,分布式,解释执行,鲁棒,安全,体系结构中立,可移植,高性能,多线程以及动态性。 2.2什么是Jxl Java Excel是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容、创建新的Excel文件、更新已经存在的Excel文件。使用该 API非Windows操作系统也可以通过纯Java应用来处理Excel数据表。因为是使用Java编写的,所以我们在Web应用中可以通过JSP、 Servlet来调用API实现对Excel数据表的访问。 Jxl发布的稳定版本是V2.0,提供以下功能: 从Excel 95、97、2000等格式的文件中读取数据[3]; 读取Excel公式(可以读取Excel 97以后的公式)[3];
如何成功把EXCEL表的数据导入到SQL数据库,代码如何编写 唯一下载软件下载,软件,下载,共享,共享软件,免费,免费软件,汉化,汉化补丁,游戏,游戏下载,软件教程,软件新闻,软件资讯,操作系统,邮件. 如何成功把EXCEL表的数据导入到SQL数据库,代码如何编 写· https://www.docsj.com/doc/1c10672353.html,/jasoncheung/archive/2005/01/07/243624.aspx /*=================== 导入/导出Excel的基本方法===================*/ 从Excel 文件中,导入数据到SQL数据库中,很简单, ... 如何成功把EXCEL表的数据导入到SQL数据库,代码如何编写. 摘要:如何成功把EXCEL表的数据导入到SQL数据库,代码如何编写――点击此处阅读全文. 发表于@ 2006年04月05日11:21:00 | 评论(loading...) Powered by: Copyright ? gjcxywwx. DTS 能从文本文件或OLE DB 数据源(例如,Microsoft Access 2000 数据库)将数据导入到SQL Server 中。或者,也可以从SQL Server 将数据导出到OLE DB ...用DTS是肯定可以的,而且可以自动生成VB代码。我也不知道如何用SQL语句实现,关注!!!Top ... 例如:导入和导出数据。DTS 能从文本文件或OLE DB 数据源(例如,Microsoft Access 2000 数据库)将数据导入到SQL Server 中。或者,也可以从SQL Server 将数据...用DTS是肯定可以的,而且可以自动生成VB代码。我也不知道如何用SQL语句实现,关注!... ... gjcxywwx 2006-06-19T10:26:00Z VB操作LotusNotes数据库Wed, 24 May 2006 04:07:00 +0800 ... gjcxywwx 2006-04-05T11:28:00Z 如何成功把EXCEL表的数据导入到SQL数据库,代码如何编写Wed, 05 Apr 2006 19:21:00 +0800 ... 如何成功把EXCEL表的数据导入到SQL数据库,代码如何编写. 导出表中的数据到Excel,包含字段名,文件为真正的Excel文件,如果文件不存在,将自动创建文件,如果表不存在,将自动创建表基于通用性考虑,仅支持导出标准数据类型--邹建2003.10--*/导出查询中的数据...
实验环境:WIN XP,MS Office Excel2007,Sql Server2008 准备数据:Excel文档:D:\test\重复出修率.xlsx 方法一: 第一步:打开SSMS: 【开始】→【所有程序】→【Microsoft Sql Server2008】→【Sql Server Management Studio】
第二步:连接数据库: 在’对象资源管理器’中点击【连接】→【数据库引擎】登陆服务器 (P.S:如果没有看到’对象资源管理器’,点击左上角的【视图】→【对象管理器】) 第三步:登陆成功后,右击你要导入数据的数据库名,我这里数据库名是’TEST’ 右击【TEST】→【任务】→【导入数据】
这时候会出现一个向导:点击【下一步】 在弹出的窗口中,【数据源】选择:Microsoft Excel; 【Excel文件路径】就选择你本地电脑存放Excel文档的路径,我这里是D:\test\重复出修率.xlsx 【Excel版本】选择Excel2007(可以根据你office的版本,选择其他如Excel2003等等。)选中【首行包含列名称】框,最后点击【下一步】 “首行包含列名称”是指Excel中的首行数据插入数据库后将作为新建表的列名.
在弹出窗口中,【目标】可以采取默认的,【服务器名称】也是一样可以选择身份验证,最后选择你要插入数据到哪个数据库中。 如我这里选的是’TEST’,选好后点击【下一步】
如果就把Excel数据插入一个新表,就选择【复制一个或多个表或视图的数据】 如果想把Excel数据插入到已存在的一张表中,则选择下面的【编写查询以指定要传输的数据】 我这里是选择上面一个,然后点击【下一步】 接着会弹出Excel表中的sheet表名字,如果你没有修改过sheet表名字,则可能显示的是’shee1$’,’shee2$’,’shee3$’等等. 然后你选中你想要导入的哪张表的数据,我这里导入的是【’aug$’】 选中后,右边的【目标】栏位中会出现内容, dbo是指数据库的架构名,aug$只是新建的表名,如果你想修改表明,双击就可以表明进入编辑状态就可以修改了。我这里修改的表名称为:aug_info
Excel模板数据导入教程 Excel模板数据导入教程 Excel导入模板中的数据既可以直接在我们提供的模板文件中录入,列标题中有红色“(必填)”文字的列必须要填写,其它列根据实际需求可以不填写,换算比率、销售价格、库存数量、成本价这些数字列如果要导入的话,一定是纯数字格式,必须要填写而且不能包括任何汉字或字母。 库存数量与成本价必须是以基本计量单位核算录入,也就是以最小计量单位核算录入。 如果从管家婆、速达等进销存软件中导出到Excel文件,一定要修改导出的Excel文件格式,否则肯定不能正常识别和导入,修改的要求如下: 1、Excel导入模板文件扩展名必须为xls,如果为其它扩展名,必须双击打开模板文件,然后另存为“Excel97-2003工作簿(*.xls)”格式的文件; 2、窗口左下角的工作薄名称必须为“Sheet1”,管家婆或速达导出来的工作薄名称一般为其它名称,必须要修改为Sheet1,请见以下截图; 3、第一行必须为列名,第二行开始必须为要导入的正式数据,请见以下截图;
附上一张标准的导入模板数据截图 本教程只演示怎么导入在我们提供的Excel导入模板中录入的数据,如果从管家婆或速达等进销存软件导出来的数据,导入方式大同小异,只是列名或列的数量不一致而已; 在导入之前一定要关闭要导入的Excel模板文件,否则因为独占模式导致导入时无法识别模板文件中的数据。 产品资料导入 产品资料模板中包括“产品资料基础信息、销售价格、库存记录”3部分内容,需要将同一个产品资料模板文件分3步分别导入,如果有辅助计量单位的销售价格也需要导入,那么需要分4步分别导入。 在导入的模板中如果包括软件中已存在的产品资料记录,一定要在导入窗口将 下拉框选择,这样就不会将相同的记录重复导入到软件中。 第一步:既可以在软件初次使用向导窗口中点击“产品资料导入”按钮,也可以在“基础数据----产品资料”列表窗口点击“Excel导入”菜单,弹出产品资料导入窗口,先选择要导入的Excel模板文件,然后根据要导入的列,按照以下截图设置要导入的列,在第一步中只能导入产品资料的基础数据,销售价格和库存记录在以下步骤中导入。
public void CreateExcel(DataSet ds,string typeid,string FileName) { HttpResponse resp; resp = Page.Response; resp.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312"); resp.AppendHeader("Content-Disposition", "attachment;filename=" + FileName); string colHeaders= "", ls_item=""; int i=0; //定义表对象与行对像,同时用DataSet对其值进行初始化 DataTable dt=ds.Tables[0]; DataRow[] myRow=dt.Select(""); // typeid=="1"时导出为EXCEL格式文件;typeid=="2"时导出为XML格式文件if(typeid=="1") { //取得数据表各列标题,各标题之间以\t分割,最后一个列标题后加回车符for(i=0;i colHeaders+=dt.Columns[i].Caption.ToString()+"\t"; colHeaders +=dt.Columns[i].Caption.ToString() +"\n"; //向HTTP输出流中写入取得的数据信息 resp.Write(colHeaders); //逐行处理数据 foreach(DataRow row in myRow) { //在当前行中,逐列获得数据,数据之间以\t分割,结束时加回车符\n for(i=0;i ls_item +=row[i].ToString() + "\t"; ls_item += row[i].ToString() +"\n"; //当前行数据写入HTTP输出流,并且置空ls_item以便下行数据 resp.Write(ls_item); ls_item=""; } } else { if(typeid=="2") { //从DataSet中直接导出XML数据并且写到HTTP输出流中 resp.Write(ds.GetXml()); } } //写缓冲区中的数据到HTTP头文件中 resp.End(); }
Option Explicit Sub 生成标签() Dim R As Long Dim i As Long Dim sht As Worksheet Dim shtFrom As Worksheet Dim shtMB As Worksheet Dim toBK As Excel.Workbook Dim FoundMB As Boolean Dim FoundData As Boolean For i = 1 To ThisWorkbook.Worksheets.Count If ThisWorkbook.Worksheets(i).Name = "模板" Then FoundMB = True If ThisWorkbook.Worksheets(i).Name = "数据" Then FoundData = True Next If FoundMB = False Or FoundData = False Then MsgBox "找不到[模板]或[数据]工作表" GoTo Exit_Sub End If Set shtMB = ThisWorkbook.Worksheets("模板") Set shtFrom = ThisWorkbook.Worksheets("数据") R = shtFrom.Range("A65536").End(xlUp).Row Application.ScreenUpdating = False Set toBK = Application.Workbooks.Add For i = 2 To R Step 3 shtMB.Copy , toBK.Worksheets(toBK.Worksheets.Count) Set sht = toBK.Worksheets(toBK.Worksheets.Count) With sht .Range("c1") = "'" & shtFrom.Cells(i, 1) .Range("C3") = shtFrom.Cells(i, 2) .Range("g5") = shtFrom.Cells(i, 3) .Range("c19") = "'" & shtFrom.Cells(i + 1, 1) .Range("C21") = shtFrom.Cells(i + 1, 2) .Range("g23") = shtFrom.Cells(i + 1, 3) .Range("c37") = "'" & shtFrom.Cells(i + 2, 1) .Range("C39") = shtFrom.Cells(i + 2, 2) .Range("g41") = shtFrom.Cells(i + 2, 3)
EXCEL工作表数据导入到DBF的方法 操作惯了EXCEL的同行,一定觉得使用VF6.0打开DATA数据库输入数据很麻烦。以输入新生入学花名册为例,EXCEL可以实现快速复制、粘贴、排序、筛选、统计等多项功能。而DBF只能逐一追加新记录。那么,可否先用EXCEL输机,再把数据导入到DBF呢? 答案是:可以! 本人实践操作过程如下: 1、现有EXCEL表,命名为“HESHI2010XS.XSL”,如下图1 图1 2、将此文件另存为“HESHI2010”,保存类型为:“Microsoft Excel 97- Excel 2003 & 5.0/95工作簿。如图2;
图2 3、运行Microsoft Visual Foxpro。点“文件”,出现“导入”等下拉窗口,如图3;图 图3 4、点“导入”,出现图4 图4 5、点“来源于”选框后边的“…”按纽,找到“HESHI2010.XSL”,“工作表”选框设为“SHEET1”或者是新生数据所在的工作表。如图5:
图5 6、点“确定”,即生成“heshi2010.DBF”,找到并打开该文件,就算搞定!如图6 图6 几点补充: 1、为什么上面第二步要“将此文件另存为‘HESHI2010’,保存类型为:‘Microsoft Excel 97- Excel 2003 & 5.0/95工作簿。’”? 因为:VF6.0只能将Microsoft Excel 97- Excel 2003 & 5.0/95工作簿导入!当然,也可以导入Microsoft Excel 5.0/95工作簿。在对Excel文件进行保存时,一定先点“另存为”,在出现的窗口中,点“保存类型”即可选择以上两种形式的工作簿。
在浏览网页时,你一定会不时看到一些需要保存的数据信息。这些信息或许是一个完整的表格,或许是一段文字,如果要保存这类信息,我们常用的方法就是拖动鼠标,选中这些信息,然后用Ctrl+C组合键复制文字,然后再保存到Word、Excel当中去。 这样的步骤算不上麻烦,但如果要求你在一个个内容丰富的大网页(比如新浪、网易、Sohu首页)中频繁地复制、粘贴,一定会让你感到疲劳和浪费时间。有什么好办法呢?用“Ctrl+A”全选后复制所有文字?粘贴后你会发现麻烦更大,因为所有文字都堆在一起了!下面,理睬教你一种方便的方法。 实例:抓取新浪首页不同位置内容 第一步:打开IE,访问理睬博客首页https://www.docsj.com/doc/1c10672353.html,/ 。 第二步:在网页左侧或右侧的空白处点击鼠标右键,在菜单中选择“导出到Microsoft Office Excel”。注意,不要在文字链接之间的空白处点右键,而是应该在完全没有任何网页内容的地方点右键。 第三步:这时Excel会启动,并出现一个“新建Web查询”的窗口。稍等片刻,等待这个窗口中显示出了完整网页,左下角会出现“完毕”字样。注意观察网页,你会发现网页被分割成了很多小的表格,每个表格的左上角有一个小的箭头标志。 第四步:双击窗口最上方标题栏,最大化窗口。依次找到要收藏的内容,然后按下该位置左上角的箭头,使它变成绿色的对勾。然后按下下方的“导入”按钮。 第五步:在弹出窗口中选择放置位置,然后按下“确定”按钮,文字、表格信息就可以自动导入Excel 了。字体格式、颜色自动处理为Excel默认的样式,表格也会被放到适当的单元格中。这样,就有效避免了直接复制粘贴网页造成一些无法识别的格式、链接信息加入网页,同时提高了导入速度。 你知道吗? 如何不将网页格式带入Office文档中? 当你在浏览器中复制一段内容,然后粘贴到Word、Excel中,会将一些网页格式直接照搬进来,这可能不是我们希望的,因为它会增大文件体积,也不利于加工整理。其实,你只要不用“Ctrl+V”来粘贴,而是选择Word、Excel中的“编辑→选择性粘贴→文本”来进行粘贴就可以了。
实验环境: WIN XP ,MS Office Excel 2007 ,Sql Server 2008 准备数据: Excel文档: D:\test\重复出修率.xlsx 方法一: 第一步: 打开SSMS: 【开始】→【所有程序】→【Microsoft Sql Server 2008】→【Sql Server Management Studio】
第二步: 连接数据库: 在’对象资源管理器’中点击【连接】→【数据库引擎】登陆服务器 (P.S:如果没有看到’对象资源管理器’,点击左上角的【视图】→【对象管理器】) 第三步: 登陆成功后,右击你要导入数据的数据库名,我这里数据库名是’TEST’ 右击【TEST】→【任务】→【导入数据】
这时候会出现一个向导:点击【下一步】 在弹出的窗口中,【数据源】选择:Microsoft Excel ; 【Excel文件路径】就选择你本地电脑存放Excel文档的路径,我这里是D:\test\重复出修率.xlsx 【Excel版本】选择Excel 2007 (可以根据你office的版本,选择其他如Excel 2003等等。)选中【首行包含列名称】框,最后点击【下一步】 “首行包含列名称”是指Excel中的首行数据插入数据库后将作为新建表的列名.
在弹出窗口中,【目标】可以采取默认的,【服务器名称】也是一样可以选择身份验证,最后选择你要插入数据到哪个数据库中。 如我这里选的是’TEST’,选好后点击【下一步】
如果就把Excel数据插入一个新表,就选择【复制一个或多个表或视图的数据】 如果想把Excel数据插入到已存在的一张表中,则选择下面的【编写查询以指定要传输的数据】 我这里是选择上面一个,然后点击【下一步】 接着会弹出Excel表中的sheet表名字,如果你没有修改过sheet表名字,则可能显示的是’shee1$’, ’shee2$’, ’shee3$’等等. 然后你选中你想要导入的哪张表的数据,我这里导入的是【’aug$’】 选中后,右边的【目标】栏位中会出现内容, dbo是指数据库的架构名,aug$只是新建的表名,如果你想修改表明,双击就可以表明进入编辑状态就可以修改了。我这里修改的表名称为:aug_info
学习使人进步 心之所向,所向披靡 EXCEL表格数据导入系统操作说明: Excel表格的修改: (1)将原Excel表格复制一份,保证数据的安全 (2)确定需要保留的字段 (3)将确定不需要的字段删除(需谨慎操作) (4)将Excel表格中的空白单元格全部用0填补 (5)如发现不常用的生僻字,在光盘中找到special.txt文件,放入软件安装路径如:C:\Program Files\MLGL\sinfarch文件夹下,同时将此生僻字添加进special.txt文件,保存,然后再进行导入操作 (6)将Excel表格的单元格格式设置成文本格式(选中格式→单元格) 注意:尽量单独选中列操作,保证每一列都被设置成文本格式,设置完成后再检查一遍(7)在光盘中找到mapping.xml文件,放入软件安装路径如:C:\Program Files\MLGL\sinfarch文件夹下,右击选择打开方式为记事本格式,进行编辑; 表名编辑: 在编辑的时候,例如