设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

1234下一页
返回列表 发新帖
查看: 18494|回复: 33
打印 上一主题 下一主题

access菜鸟七大邪门武器之1—DsoFramer让word、excel作Access的报表

[复制链接]
跳转到指定楼层
1#
发表于 2015-1-18 10:14:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 ganlinlao 于 2015-1-25 14:59 编辑

       兄弟,如果你和我和一样,只是一个刚入门的access菜鸟。兄弟,如果你和我一样,可怜到只会一点点word和excel,而站在access门前徘徊许久而不得而入。那么本邪门武器就是为你我准备的。让我们用这种另类的方法,一起渡过苦难的菜鸟岁月吧。

  作为一个有觉悟的Access的超烂菜鸟,Access的一些功能让我很迷惑,以下是我的一些愚蠢的看法:
(1)、Access的报表功能很烂。我根本就学不会Access的报表。
(2)、Access窗体的条件格式功能不强,使用条件格式很容易出问题。
(3)、Access的查询简单易用,但对查询后的数据局部分析功能很弱。要进行分析,你得写一堆又一堆的vba代码,而VBA在这方面的能力也是超级低能。
(4)、Access的窗体无法动态加载,这让我几乎绝望。
(5)、Access的连续窗体和数据表视图让我一直很迷惑,虽然它们很易用,但确实让我很迷惑。我根本不知道它们是以什么样的方式在工作?虽然我隐隐有所猜测,但总觉得这种臆度可能是不准确的。
(6)、随着Access版本的提升,Access的图表功能会变得很烂,而且只会越来越烂。
……
俗话说:武功再高,也怕菜刀,作为菜鸟,我决定挥舞这把菜刀肢解Access功能。

       用word和excel分别替代Access的部分功能。这是因为人们对word和excel的熟悉程度远远超过对Access的使用。随便走出来一个办公室的更年期大妈,使用word的水平,都不是我能匹敌的。而不少人对excel的研究之精到了令人发指的地步。

  为此我不惜引入这个让人又爱又恨的DsoFramer,之所以让人恨,是因为它的小缺陷很多很多,但带来的好处也是相当明显的。而且用它还有可能带来一些额外的其它更有趣的东西,这也是我为什么会想用它。
再次声明这只是我个人菜鸟式的使用方式,聪明人一般要慎用。

1、2.3版的DsoFramer的使用范围:
DsoFramer支持office2003,2007,2010,2013,Wps,viso,project,支持office2015也是没问题。但DsoFramer不支持office2003打开docx,xlsx,pptx。也就是说不支持2007格式兼容包。所以在2003中使用要特别注意。DsoFramer对doc,xls,ppt的支持最好。DsoFramer支持任何office版本的混装(我就是在混装2003,2010,2013环境下测试),也支持office的精简版,但正常情况下还是使用完整版为好,这样问题会少一些。DsoFramer是开源的,所以没有任何版权问题。
2、2.3版的dsoframer的缺陷:
(1)、dsoframer的getApplicaiton方法:在新建word文档时,获取word的application会出现错误,弥补的方法是:set docApp=dsoFramer.acitveDocument.Application。在调用excel和PPT则不会。
(2)、dsoFramer的LoadoriginalFile方法,既支持doc,xls,ppt,而且也支持docx,xlsx,pptx。但使用docx,xlsx,pptx时,要这样写:
dsoFramer.loadOriginalFile "c:\1.docx","doc"。xlsx,pptx的写法类似。也可以用Open方法打开文档。Open方法在打开http:\\文件时,
docx,xlsx,pptx格式的文件,会出现问题。所以在web中使用,尽量使用LoadOriginalFile方法。
(3)、DsoFramer本身的SaveAs方法,默认会保存为doc,xls,ppt,而不支持docx,xlsx,pptx。所以应该用word,excel,ppt程序的SaveAs方法另存为来支持全部的格式。
(4)、DsoFramer的getTempFilePath,会默认返回一个支持doc,xls,ppt格式的tmp文件。这个tmp文件写入docx,xlsx,pptx格式时,word或excel程序打开文档会出错。弥补的方法:
如果是xlsx,docx,pptx等文件格式,则后缀名必须改成docx等。带VBA代码的excel文件,最好统一用xls格式。
(5)、DsoFramer在关闭excel文档后,没有释放excel的进程,这是后来改编的人粗心造成的。所以系统后台进程会一直有一个excel.exe,但不影响任何使用。这个目前我还没找到简易的方法弥补。如果你找到了,希望告知。Word和ppt则没有这个缺陷。
(6)、DsoFramer没有文档事件连接点,这是最大的遗憾。不过因为我们是在Aceess或VB中使用,所以这点缺陷还是能够弥补回来一些。
(7)、DsoFramer在使用word的打印预览没有任何问题。但在使用excel的打印预览,会有一些问题,可以调出打印预览界面,但调不回普通页面,这是excel的打印预览特殊性造成的。

(8)、DsoFramer没有简易的isOpened方法来判断文档是否打开或新建,弥补的方法:我们可以通过onDocumentOpened事件,用一个isOpened变量来记录是否打开或新建。
文档格式是doc或者是docx,这个可以有很多办法来判断。所以在这里我就不提了,但最好还是用一个doctype变量来记录是doc还是docX。Excel和PPT类似。
(9)、使用excel的VBA,宏安全性必须调到最低。这是oleobject方式决定的。在特殊的网络环境下,可能还需要调整保护视图。
(10)、以后再补上,写太多了,会让你后怕,呵呵。

冬瓜汤  2015-1-18

评分

参与人数 2经验 +12 金钱 +10 收起 理由
roych + 10 看起来相当强大哦!
admin + 12

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享分享 分享淘帖 订阅订阅
推荐
 楼主| 发表于 2015-1-18 12:05:56 | 只看该作者
本帖最后由 ganlinlao 于 2015-1-30 20:25 编辑

第6章、网络篇
2、Access作为客户端与web的交互能力的思考
          坦白地说,作为一个超烂的菜鸟,我总愚蠢地认为写任何一个access应用,都应该具有网络功能。没有网络功能的access应用更象是一种自娱自乐。甚至我悲观地认为,如果access不具有强大的网络交互能力的话,那么在不远的将来,它会很快走向消亡。而且我坚信,以后的Access应该具有很强大的网络交互能力,否则它确实没有多少存在的意义。微软在access2013中已经开始尝试了。

很可惜,在认坛里这么多年来,极少人谈及Access与网络交互能力。似乎太多的人坚定地认为access+SQLserver是唯一正确的方式。Access+SQL server是一种双层结构,有它的便利的一面。也有它的一些的局限性。这种局限性包括:SQL server的安装问题(在一些很小的应用中,这会是一个问题,其它的不算是问题)。在线更新问题,拓展性问题(拓展起来不方便),office文档管理问题(我了解到不少人尝试想利用sqlserver的filestream读取word或excel文件,但似乎问题很多而不可行),图片等资源的更新问题……


    虽然我们在access经常使用com组件,整个windows到处都是,而vba也只支持com的对象。但com本质是什么?我个人愚蠢地认为com的核心能力之一是聚合能力。通过组件的聚合,通过接口,达到简便地复用。而且我个人愚蠢地认为网络的核心功能之一就是聚集能力。不管是xml,webservice,还是其它的让人眼花缭乱的新技术,无非都是为了方便数据的聚集。在这一点上com组件和网络有着惊人一致的一面。

       当谈及access与web网络交互能力时,有几个概念是一定要厘清的。
1、有状态和无状态。Access与sql server的连接是一种有状态的连接。而access与http的连接是一种无状态的连接。但websock的出现可能会改变这种情况。
2、字符集。整个windows都是采用gbk字符集,access和sql server也是默认以gbk作为默认字符集,但web上,gbk只是一种可选的字符集,更多的是采用utf-8字符集,很可惜vba没有简便的函数处理utf-8字符集。
3、缓存问题。尽管access也有缓存,只要你打开一个mdb或acced,缓存就一定存在。但这个缓存和浏览器中的缓存,是两个概念。
4、同步和异步:access打开本地的mdbaccedaccess打开sql server,所有的recordset默认是同步的。尽管你可以使用异步,但我很少见到有人使用异步。但在web的数据交互时,异步但会成为一个异常重要的问题。
5、相对路径和绝对路径:



为实现Http访问,微软提供了这么几种API:
(1)Winsock,工作于网络层和传输层的开发库,对于编写TCP,UDP,以及原始IP通信程序非常合适。函数原形也基本符合Unix socket标准。Windows平台上的大多数程序,如QQ,讯雷等都基于其开发。
(2)ws2_32,是Winsock的升级版本,在兼容的基础上增加了不符合Unix socket标准,但更适合Windows平台的库函数,一般以WSA*开头。
现代的大多数Windows平台程序也都开始依赖于此库。
(3)WinInet,Windows Internet扩展库,工作于应用协议层,提供了http,ftp,gopher协议的实现,为基于以上三种协议的程序开发提供基础平台,需要说明的是,尽管WinInet工作于应用层,但其本身wininet.dll的实现并不依赖于winsock.dll或ws2_32.dll,而是独立存在的。至少目前的版本是这样。基于WinInet的应用程序最著名的例子就是IE了。
(4)WinHttp,也是工作于应用协议层,提供了http协议的实现。看起来与WinInet有重复的部分,没错,WinHttp就是为了替换WinInet中的http部分的,它更加健壮稳定,而且还为http服务器端开发提供了库函数。如果进行现代http的开发,建议使用WinHTTP而不是WinInet。使用WinHTTP进行开发的著名例子就是Google的浏览器Chrome,但是Chrome2.0以后版本google放弃了winhttp而是使用了自己开发的http库,这也是为了使chrome实现跨平台的重要举措。另外,WinHttp.dll也不依赖于winsock或ws2_32,也是独立运行的。
如果基于socket编程的话,Winows平台与其它平台函数基本相同,实现跨平台比较容易。
wsock和wininet或winhttp也可以同时使用。


WinInet HttpSendRequest使用的事项

   HttpSendRequest不支持异步模式,虽然API文档说可以,但是在其它官方文章中已证实不可以;要用异步方式完成任务,需要通过使用线程来自己封装。
   HttpSendRequest使用的INTERNETHANLE要每次通过HttpOpenRequest获取,不能重用,否则可能会出现无法读取返回数据或数据重复等错误;虽然API文档说只要每次把上次的数据取完就可以,但这是经历了无数痛苦的unit test后换来的经验。
    发送httpSendRequest后,需要使用InternetReadFile来读取,重复多次读,直到返回数据为0byte为止。
    错误代码在http://support.microsoft.com/kb/193625  ,API文档中找不到。

什么是WinHTTP?
WinHTTP的全称是Microsoft Windows HTTP Services,它提供给开发者一个HTTP客户端应用程序接口(API), 通过这种API借助HTTP协议给其他的HTTP服务器发送请求.
WinHTTP支持桌面应用程序, Windows系统服务, 和Windows服务器端应用程序.
对于基于Microsoft.NET Framework的应用程序, 不推荐使用WinHTTP服务, 因为.NET Framework应用程序应该使用在System.Net命名空间下的网络基础设施类型.
WinHTTP提供了两种编程方式, 一种是CC++的API, 另一种是COM组件.
WinHTTP与WinINet的区别
================
WinHTTP被设计为主要应用在服务器端应用程序的场景下, 让服务器端应用程序访问HTTP服务器.
WinINet是一种更老的技术, 它被设计为一个HTTP客户端平台, 用于交互式桌面应用程序, 比如说IE, Office等.
服务器端应用程序要求HTTP客户端服务使用WinHTTP而不是WinINet.
WinHTTP和WinINet在微软是由不同的团队来提供支持的.
WinHTTP与Proxy
================
如果HTTP Proxy需要认证(authentication), 那么HTTP Application会收到407(proxy requiresauthentication). 除了这个状态码, 代理服务器还会发送一个或更多的authenticate headers:“Proxy-Authenticate”. 这些信息足够我们在network monitor trace中鉴定HTTP无法访问是否是由于proxy需要认证引起的了.
WinHTTP的proxy配置是存储在注册表键
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionInternetSettingsConnectionsWinHttpSettings
当中的, 修改和查看需要使用一个命令行工具proxycfg


下面来说说实现Http访问的流程(基本上都一样的流程):
1, 首先我们打开一个Session获得一个HINTERNET session句柄;
2, 然后我们使用这个session句柄与服务器连接得到一个HINTERNET connect句柄;
3, 然后我们使用这个connect句柄来打开Http 请求得到一个HINTERNET request句柄;
4, 这时我们就可以使用这个request句柄来发送数据与读取从服务器返回的数据;
5, 最后依次关闭request,connect,session句柄。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 1 反对 0

使用道具 举报

3#
 楼主| 发表于 2015-1-18 10:15:29 | 只看该作者
本帖最后由 ganlinlao 于 2015-1-18 10:25 编辑

第1章、基本功能篇----恨你的妖艳从看你的第一眼开始

这里的例子仅仅是作为一些基本功能的测试


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
4#
 楼主| 发表于 2015-1-18 10:15:43 | 只看该作者
本帖最后由 ganlinlao 于 2015-1-21 11:32 编辑

第2章、word功能篇---好白菜都让猪给拱了

(1)、用word作打印报表
      (1)word普通表格的作为打印报表
      一般在数据量比较少的情况下,可以用word的普通表格作为报表输出。word毕竟有强大的域功能。可以进行适当的公式计算等。
      但数据量比较大的情况下,应该选择用excel作为报表输出。在这里,我只是采用遍历循环,性能可能比较低,更快的方法,应该
      是采用剪贴板方式。注意点:强大的域功能是值得关注和掌握的。word的保护文档,不同模式下,对打印和页面设置的影响。


例子:同时适当修正一点上面例子的小错误

    (2)利用word的书签功能作为打印报表,并可以多页连续打印
        word的书签功能是无比强大的功能。可以说没有书签功能,word的作用至少废了三分之一了。域也是
        word的书签功能的特殊运用。可惜我也掌握不是很好,有待深入。
        注意点:word的书签每一次插入内容后,书签会被自动删除。所以每一次插入内容之后,必须重新添加书签


   (3)利用word的邮件合并功能
        word的邮件合并功能,其实也是蛮有趣的一个功能。如果有兴趣的话,可以继续深入一点。在这里我就不多谈

(2)、用word作输入界面:各种述职报告,会计纪要、审计报告,请假条……等
       正常来说,一般是不提倡用word或excel作为输入界面,因为word和excel都没有数据绑定功能。但因为办公文件的种类实在是庞大而烦杂。象各种报告,会计记录、病历卡,各种常见的文涵等,用Access作为这种输入界面其实是相当不易用的。至少没有word来得熟悉和容易上手。
    word作为输入界面:需要注意的无非就是两点,一个是输入内容的验证,因为有书签,表格、域等功能。验证内容其实是蛮容易。这跟使用RichText或richText32.ocx差不多。但word绝对比前面两种控件强大得多。
       另一个是对word的事件交互。就是在Access中响应word的事件。这个说穿了也是蛮容易的,跟使用access的控件没什么两样,无非就是要对VBA的事件有一点本质的认识。这个我用excel的事件来作为例子。永远不要忘记,整个Office都是com组件

(3)、文档阅读的权限控制。批注,审阅等电子签章加密问题(这是公文流转的第一步)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
5#
 楼主| 发表于 2015-1-18 10:16:15 | 只看该作者
本帖最后由 ganlinlao 于 2015-1-22 11:05 编辑

第3章、excel表格篇—牛粪,请给鲜花一次傲骄的机会

(1)用excel作打印报表

(2)用excel作查询子窗体的优缺点

(3)用excel作输入界面:发票、凭证……等需要套打的界面

(4)关于excel的事件连接点的思考:
     DsoFramer有一个显著的缺陷,就是没有事件连接点。这个如果放在IE、chrome或FireFox中使用,绝对是一个致命的缺点。
     但如果是在access或vb6中使用,这个缺陷是可以弥补回来的。如果在aauto或python中使用,这个根本就不是缺点。因为aauto等自
带有事件接受收器。它们使用com组件,甚至比vb6来得更简洁。
    vba中跟外部com组件事件有关,只有一个withEvents语句。withEvents其实就是vba的事件接受器。但它必须依赖于类型库。因为事件的接口就是在类型库中声明的,对vb来说也只能是在类型库中声明。类型库tlb对vb来说是至关重要的,没有它,vb基本什么事都干不了。
   事件接收受器其实是一个com组件,只不过VBA帮助参考上永远不会告诉你,withEvents是一个com对象。它只会告诉你withEvents只能在类模块中使用。但为什么只能在类模块中使用呢?因为事件收受器是一个com组件,所以你必须通过类,把它实例化成一个com对象,这样才能建立起事件连接点。同样的道理,你也应该很容易理解event和raiseEvent语句了。
    VBA必须依赖于类型库才能建立事件连接点。但excel2003,excel2007,excl2010,excel2013等不同版本,类型库是不同的,如何做到兼容性呢?这里利用到了Access的特殊性,access对于类型库会自动从低版本升级成高版本。但不能从高版本降低成低版本。所以为了兼容性,你在写代码的时候应该统一用低版本的类型库。目前常用的应该是excel2003版本算是最低了。
    我在例子里会提供一个excel2003的类型库,这是因为excel很奇怪。它的类型库隐在excel.exe里面。至于word、powrpoint和access,它们的类型库都是单独的一个olb文件,这很容易获得。在使用时,你百度一下tlb的注册工具,把excel类型库注册一下。然后就可以开始使用了。以后编译成mde文件,不用去管类型库。只要对方有安装office,mde会自动升级excel的类型库。那个excel11.tlb也不需要带上,不用去管它。
       例子代码截图:通过例子,你会发现写excel的事件,跟在excel中用vba写excel事件是一模一样的。
           





   

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
6#
 楼主| 发表于 2015-1-18 10:16:29 | 只看该作者
本帖最后由 ganlinlao 于 2015-1-22 14:33 编辑

第3章、Excel表格篇
(5)、Access的vba和excel的vba之间的奸情无限


         我前面曾说过很多人对excel的研究之精,已达到人兽共愤,令人发指的地步。所以excel文件中带上vba,是经常会发生的事情。
       一般来说,因为access的vba能全面控制excel,所以vba代码应该尽量在access中写。毕竟access有编译功能,能比较好地保护vba代码和数据库信息。但因为vba是单线程的,有些时候用excel的vba功能,反而会更便捷。记住:access和excel是两个不同的进程,所以access的vba和excel的vba就变成了多线程。两个VBA之间的通信就变成了两个进程间的通信。
       幸运的是,在windows上进程间的通信方式还是很多的。但简单易用的方式其实不算多。以下是我个人理解比较简易的方式,如果你有更简易的方式,希望告知。


<1>最简单易用的方式:用excel表的辅助列(或辅助表)。因为access能读写excel文件的表格内容,而excel的VBA也能读写自身文件的表格。所以利用辅助列或辅助表,可以让access的vba变量值与excel的vba的变量值进行互传


<2>利用剪粘板:虽然office的vba不能直接使用clipboard对象。但幸运的是,只要安装有vba,总有一个dataobject存在。这是office共有的,所以通过dataobject对象就可进行两个vba之间的变量值互传。Dataobject对象隐藏在form20.dll里面。所以使用时记得引用这个dll。

<3>其它的方式,为了避免无谓的复杂性,我就不说了。


      Excel的vba代码是无法受到编译级的保护。只不过这种代码其实也没必要有什么保护。

     写到这里,我也不禁对excel.application.parient属性嘘嘘一番,这货总返回自身对象。那有什么意义呢。



7#
 楼主| 发表于 2015-1-18 10:16:43 | 只看该作者
本帖最后由 ganlinlao 于 2015-1-21 14:23 编辑

第5章、excel透视表篇

点击这里给我发消息

8#
发表于 2015-1-18 10:31:24 | 只看该作者
强大啊!冬瓜爆发了!
9#
 楼主| 发表于 2015-1-18 10:47:43 | 只看该作者
占位
回复

使用道具 举报

10#
 楼主| 发表于 2015-1-18 10:48:14 | 只看该作者
占位
回复

使用道具 举报

11#
 楼主| 发表于 2015-1-18 10:48:36 | 只看该作者
本帖最后由 ganlinlao 于 2015-1-25 14:47 编辑

第6章、网络篇
     1、excel或word模板从网络中载入:
我的例子里自带有一个小型的服务器,足以支撑数百个并发,你不用太担心它的性能,你无须安装iis。无须配置网站。使用例子前,你得先点击一下exe,你的电脑就是一个web网站,程序所在的目录就是web网站的根目录。当然你想动手搭建一个iis的网站,那也只是几分钟的事情。正常来说,你应该选c#、vb.net或php、java来写服务端,因为这是最常用的。这个例子里,只是一个静态web。只是为了测试dsoframer从web端载入excel、word文件的能力。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-5-6 13:27 , Processed in 0.116681 second(s), 38 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表