com.word库分享

By 巴克队长 at 2022-04-30 • 0人收藏 • 1467人看过

由于最近经常写报告,其中很多图片需要格式化大小,所以仿照excel库写了个word库,分享给有需要的朋友。

由于office系列操作比较多,只写了一些常用的智能提示,复杂的操作还是需要参照官方的vba手册。

测试工程:

wordDoc_test.zip


简单的使用示例如下:

import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=759;bottom=469)
winform.add(
button={cls="button";text="Button";left=198;top=192;right=473;bottom=296;z=1}
)
/*}}*/

import com.wordDoc;
var word = com.wordDoc( 1 )

word.Visible=true
var aDoc = word.Open("\test.docx")

//图片类型为InlineShapes,1cm等于28.35px
var adjustPicSize=function(w,h){
   for(i=1;aDoc.InlineShapes.Count ;1){
        var pic = aDoc.InlineShapes(i)
        pic.LockAspectRatio = 0
        if(w) pic.Width =  w * 28.35
        if(h) pic.Height = h * 28.35
    }   
}
 
winform.button.oncommand = function(id,event){
    adjustPicSize(8.3)
    win.msgbox("图片调整完成")
}
 
winform.show();
win.loopMessage();



库代码如下:

//word 文档  
namespace com; 
 
class wordDoc{    

    ctor( create ){
        var createApp=function(){
            this.oWord = ..com.TryCreateObject("word.Application","kwpp.Application","wpp.Application")
            if( ! this.oWord ) return null,"请先安装word";
             
            this.oWord.Visible = false; 
            ..table.gc(this,"Quit");            
        }
         
        if( create ) createApp()
        else {
            this.oWord = ..com.TryGetObject("word.Application","kwpp.Application","wpp.Application")
            if(! this.oWord) createApp()
        }
         
        if( ! this.oWord ) return null,"请先安装word";
    };
    @_metaProperty;
}
 
namespace wordDoc{
	import util.metaProperty;    
    _metaProperty = util.metaProperty( 
        alerts = {
            _get = function(){
                return owner.oWord.Application.DisplayAlerts && owner.oWord.Application.ScreenUpdating 
            }       
            _set = function( value ){
                owner.oWord.Application.DisplayAlerts = value //wdalertsall=-1|wdalertsmessagebox-2|wdalertsnone=0
                owner.oWord.Application.ScreenUpdating = value?1:0
            }
        };
        get = function(k){
            return owner.oWord[k]
        };
        set = function(k,v){
            owner.oWord[k] = v;
        };
        find=function(docName){
            if(!owner.Documents.Count) return ; //尚无打开文档
            for(i,name,path,aDoc in owner.eachDocument(1) ){ 
                if(docName==name or path==docName) return aDoc; 
            }
        };
        eachDocument = function(index){
            var aDoc = owner.Documents(index);
            if(!aDoc) return function(){};
             
            var count = owner.Documents.Count
            var ind = 0
            var documents=owner.Documents
             
            return function(){
                ind++
                if(ind<=count){
                    var aDoc = documents(ind);
                    return ind,aDoc.Name,aDoc.FullName,aDoc
                }
                 
            }; 
        }; 
        Open = function(path){
            path = ..io.exist(path)
            return path ? owner.Documents.Open( path ) : null
        };
        SaveAs = function(path,format){
            if(!#path) error("请指定保存路径",2);
             
            if(format===null){
                var ext =  ..string.match(path,"[^.]+$");
                if( ext ){
                    format = ( {
                       doc=0/*wdformatdocument*/;
                       docx=16/*wdFormatDocumentDefault*/;
                       dotx=1/*wdformattemplate*/;
                       rtf=6/*wdformatrtf*/;
                       txt=7/*wdformatunicodetext*/;
                       html=8/*wdformathtml*/;
                       xml=12/*wdformatxml*/;
                       pdf=17/*wdFormatPDF*/;
                       xps=18/*wdFormatXPS*/;
                       odt=23/*wdFormatOpenDocumentText*/;
                    } ) [..string.lower(ext)];
                }; 
            } 
            return owner.ActiveDocument.SaveAs( ..io.fullpath(path),format );
        };
        createFile = function(path){
            var aDoc = owner.Open(path)
            if(aDoc) return aDoc;
             
            var word = owner.oWord;
            var aDoc = word.Documents.Add();  
            aDoc.SaveAs( ..io.fullpath(path) )  
            return aDoc; 
        };
        _topointer = lambda() owner.oWord;  //将word对象链接到word.oWord地址上
    );
}
 
/**intellisense()
com.wordDoc = word 支持库\n请不要使用精简版 word,\n兼容 WPS 表格,小提示:可在「WPS 配置工具」中关闭广告推送\n参考: https://docs.microsoft.com/en-us/office/vba/api/overview/word
com.wordDoc( __/*是否创建新实例*/ ) = 创建word对象\n如果参数为true,则新建word对象,否则,先获取现有打开对象,若无打开对象则新建word对象
com.wordDoc() = !wordDoc.
!wordDoc.eachDocument(1) = @for(i,name,path,aDoc in ??.eachDocument(1) ){ 
    console.dump(i,name,path,aDoc) 
}
 
!wordDoc.find(docNameWithExtOrPath) = 从已经打开的文档对象中查找文件名称(带后缀),若能查到则返回document对象\n参数@docNameWithExtOrPath,指定待查找文件名称(带后缀)或路径
!wordDoc.find()=!wordApp_document.
 
!wordDoc.Visible = 是否显示 word 界面,\n注意这个属性的默认值是 false
!wordDoc.alerts = 是否允许操作提示与屏幕更新,\n这个属性会同时设置 Application 对象的 DisplayAlerts 与 ScreenUpdating 属性\n如果只想设置其中一个属性,请直接通过 Application 对象设置即可
!wordDoc.Application = 请参考: https://docs.microsoft.com/en-us/office/vba/api/word.application%28object%29
!wordDoc.Application.DisplayAlerts = 是否允许操作提示,可选值-1,-2,0
!wordDoc.Application.ScreenUpdating = 是否允许屏幕更新,true|false
!wordDoc.Documents = 活动工作簿\n请参考 https://docs.microsoft.com/en-us/office/vba/api/word.application.Documents \n!wordApp_documents.
!wordDoc.Quit() = 退出word
 
!wordDoc.Open(__path) = 打开word文件,成功返回document对象
!wordDoc.Open() = !wordApp_document.
!wordDoc.ActiveDocument = 当前活动文档\n!wordApp_document.
!wordDoc.SaveAs("/my->doc") = 存储word文件
!wordDoc.SaveAs = @.SaveAs( io.fullpath("\__.doc"),word.fileType.doc )
 
 
!wordDoc.createFile("/my->doc") = 如果目标文件存在则打开,\n否则创建新文件
!wordDoc.createFile() =  !wordApp_document.
!wordApp_documents.Add()=!wordApp_document.
 
!wordDoc.Run("__/*宏名称*/(参数)") = 运行宏 
 
!wordApp_document.documents = 返回文档对象集合\n!wordApp_documents.
!wordApp_document.documents(__indexOrName) = 切换到其他文档\n!wordApp_document.
 
end intellisense**/
 
/**intellisense(!wordApp_documents.)
Count = 已打开文档的数量
Add(Template, NewTemplate, DocumentType, Visible)=新建空文档,并返回document对象。所有参数可选\参数@Template,指定模板名,默认使用 Normal 模板。\n参数@NewTemplate可选,默认false。True=将文档作为模板打开\n参数@DocumentType可选。_WdNew_指定一个常量,[默认0,空白文档|]\n参数@Visible可选,默认true。
Save(NoPrompt, OriginalFormat) = 保存 Documents 集合中的所有文档。如果用户没有保存过此文档或模板,可在“另存为”对话框中键入文件名。\n参数@NoPrompt可选[true,默认不提示|false],保存是否提醒;\n参数@OriginalFormat可选[1=原格式,默认|2=提醒用户|0=word文档]
Close(SaveChanges, OriginalFormat) = 关闭指定的一个或多个文档。\n参数@SaveChanges可选[0,默认不保存|-2,提醒用户保存|-1,自动保存]\n参数@OriginalFormat可选[1=原格式,默认|2=提醒用户|0=word文档]\n参数
end intellisense**/
 
/**intellisense(!wordApp_document.)
Name = 文档名称
AttachedTemplate.FullName=返回当前文档采用的模板名及模板所在位置
Bookmarks.Count=返回当前文档中的书签数
Characters.Count=返回当前文档的字符数
CodeName=返回当前文档的代码名称
Comments.Count=返回当前文档中的评论数
Endnotes.Count=返回当前文档中的尾注数
Fields.Count=返回当前文档中的域数目
Footnotes.Count=返回当前文档中的脚注数
FullName=返回当前文档的全名及所在位置
HasPassword=当前文档是否有密码保护
Hyperlinks.Count=返回当前文档中的链接数
Indexes.Count=返回当前文档中的索引数
ListParagraphs.Count=返回当前文档中项目编号或项目符号数
ListTemplates.Count=返回当前文档中使用的列表模板数
Paragraphs.Count=返回当前文档中的段落数
Password=XXX=设置打开文件使用的密码
ReadOnly=获取当前文档是否为只读属性
Saved=当前文档是否被保存
Sections.Count=当前文档中的节数
Sentences.Count=当前文档中的语句数
Shapes.Count=当前文档中的形状数
Styles.Count=当前文档中的样式数
Tables.Count=当前文档中的表格数
TablesOfAuthorities.Count=返回当前文档中的引文目录数
TablesOfAuthoritiesCategories.Count=返回当前文档中引文目录类别数
TablesOfContents.Count=返回当前文档中的目录数
TablesOfFigures.Count=返回当前文档中的图表目录数
ActiveWindow = 返回 Window 对象,该对象代表活动窗口(焦点所在的窗口)。如果没有打开的窗口,则会导致出错。只读\!wor_window.
Save(NoPrompt, OriginalFormat) = 保存 文档。如果用户没有保存过此文档或模板,可在“另存为”对话框中键入文件名。\n参数@NoPrompt可选[true,默认不提示|false],保存是否提醒;\n参数@OriginalFormat可选[1=原格式,默认|2=提醒用户|0=word文档]
Close(SaveChanges, OriginalFormat) = 关闭文档。\n参数@SaveChanges可选[0,默认不保存|-2,提醒用户保存|-1,自动保存]\n参数@OriginalFormat可选[1=原格式,默认|2=提醒用户|0=word文档]\n参数
Tables(index)=返回指定的表格对象\n!wordApp_TableObj.
end intellisense**/
 
/**intellisense(!wordApp_TableObj.)  
AllowAutoFit=使 Microsoft Word 可以自动重新调整表格中的单元格的大小以适应内容。Boolean 类型,可读写。
Application=word对象\n!wordDoc.
ApplyStyleColumnBands=布尔值,该值表示如果应用的预设表格样式为列提供了样式条带,则该值表示是否将样式波段应用于表中的列。读/写。
ApplyStyleFirstColumn=如果为 True,则 Microsoft Word 可将第一列格式应用于指定表的第一列。读/写布尔值 。
ApplyStyleHeadingRows=如果为 True,则 Microsoft Word 可将标题行格式应用于所选表的第一行。读/写布尔值 。
ApplyStyleLastColumn=如果为 True,则 Microsoft Word 可将最后一列格式应用于指定表的最后一列。读/写布尔值 。
ApplyStyleLastRow=如果为 True,则 Microsoft Word 可将最后一行格式应用于指定表的最后一行。读/写布尔值 。
ApplyStyleRowBands=返回或设置一个布尔值,该值表示如果应用的预设表格样式为行提供样式条带,则该值表示是否将样式波段应用于表中的行。读/写。
AutoFormatType=返回已应用于指定表的自动格式设置的类型。只读长整型。
Borders=返回一个Borders集合,该集合表示指定对象的所有边框\n!wordApp_Borders.
BottomPadding=底边距(以磅为单位),读/写。
LeftPadding=左边距(以磅为单位),读/写
RightPadding=右边距(以磅为单位),读/写
TopPadding=顶边距(以磅为单位),读/写
Columns=返回Columns集合,该集合表示表中的所有表列。只读\n!wordApp_Columns.
Creator=返回一个 32 位整数,该整数指示在其中创建指定对象的应用程序。只读长整型
Descr=返回或设置包含指定表的说明的String。读/写。
ID=将文档另存为网页时,返回或设置指定表的标识标签。读/写字符串。
NestingLevel=返回指定表的嵌套级别。只读长整型。
Parent=返回一个对象,该对象表示指定Table对象的父对象。
PreferredWidth=返回或设置指定表的首选宽度(以磅为单位或窗口宽度的百分比)。读/写单。
PreferredWidthType=返回或设置用于指定表宽度的首选度量单位。读/写 WdPreferredWidthType常量。
Range=返回一个Range对象,该对象代表指定表中包含的文档部分\n!wordApp_Range.
Rows=返回一个Rows集合,该集合代表表中的所有表行。只读\n!wordApp_Rows.
Shading=返回一个Shading对象,该对象引用指定对象的着色格式。
Spacing=表中单元格之间的间距(以磅为单位),读/写
Style=返回或设置指定表的样式。读/写。
TableDirection=Word 对指定表中的单元格进行排序的方向。读/写 WdTableDirection常量。
Tables=Tables集合,该集合代表嵌套在指定表中的所有表。只读。
Title=返回或设置包含指定表的标题的String。读/写。
Uniform=如果表中的所有行都具有相同的列数,则为 True。只读布尔值。
ApplyStyleDirectFormatting(StyleName)=应用指定的样式,但保留用户直接应用的任何格式。
AutoFitBehavior(Behavior)=确定 Microsoft Word 在使用自动调整功能时如何调整表的大小。参数为WdAutoFitBehavior常量
AutoFormat(Format, ApplyBorders, ApplyShading, ApplyFont, ApplyColor, ApplyHeadingRows, ApplyLastRow, ApplyFirstColumn, ApplyLastColumn, AutoFit)= 将预定义外观应用于表格。本方法用于 Table AutoFormat 对话框中的属性设定(Table 菜单)。
Cell(Row, Column)=返回一个 Cell 对象,该对象代表表格中的一个单元格\n!wordApp_Cell.
ConvertToText(Separator, NestedTables)=将表格转换为文本并返回一个 Range 对象,该对象代表带分隔符的文本
Delete()=删除选定的表格
Select()=选定指定的表格
Sort()=对选定的表格排序
SortAscending()=以字母升序给段落或表格行排序。将第一段或表格第一行视为域名记录,不进行排序。可用 Sort 方法将域名记录包含在排序中。\n注意,此方法为含有数据列的邮件合并数据源排序提供一种简化形式。对于大多数排序,请使用 Sort 方法。
SortDescending()=以字母降序给段落或表格行排序。将第一段或表格第一行视为域名记录,不进行排序。可用 Sort 方法将域名记录包含在排序中。\n注意,此方法为含有数据列的邮件合并数据源排序提供一种简化形式。对于大多数排序,请使用 Sort 方法。
Split(BeforeRow)=在表格中紧靠指定行的上面插入一空段落,并且返回一个 Table 对象,此对象包含指定行及其下一行。BeforeRow必选,将要拆分的表格的前一行,可以为 Row 对象或行号。
UpdateAutoFormat()=使用预定义表格格式对表格格式进行更新。例如,如果在用“自动套用格式”命令对一个表格设置格式之后插入行和列,那么该表格会不再与预定义格式相匹配。用 UpdateAutoFormat 方法可重新设置该格式。
end intellisense**/
 
/**intellisense(!wordApp_window.)
 
end intellisense**/
 
/**intellisense()
_wdalertsall=-1/*_wdalertsall*/
_wdalertsmessagebox=-2/*_wdalertsmessagebox*/
_wdalertsnone=0/*_wdalertsnone*/
 
_wdoriginaldocumentformat = 1/*_wdoriginaldocumentformat*/
_wdpromptuser = 2/*_wdpromptuser*/
_wdworddocument = 0/*_wdworddocument*/
 
_wddonotsavechanges= 0/*_wddonotsavechanges*/
_wdprompttosavechanges= -2/*_wdprompttosavechanges*/
_wdsavechanges= -1/*_wdsavechanges*/
 
 
_wdNewBlankDocument = 0/*_wdNewBlankDocument*/
_wdNewEmailMessage = 2/*_wdNewEmailMessage*/
_wdNewFrameset = 3/*_wdNewFrameset*/
_wdNewWebPage = 1/*_wdNewWebPage*/
 
_wdlinestyledashdot = 5/*_wdlinestyledashdot*/
_wdlinestyledashdotdot = 6/*_wdlinestyledashdotdot*/
_wdlinestyledashdotstroked = 20/*_wdlinestyledashdotstroked*/
_wdlinestyledashlargegap = 4/*_wdlinestyledashlargegap*/
_wdlinestyledashsmallgap = 3/*_wdlinestyledashsmallgap*/
_wdlinestyledot = 2/*_wdlinestyledot*/
_wdlinestyledouble = 7/*_wdlinestyledouble*/
_wdlinestyledoublewavy = 19/*_wdlinestyledoublewavy*/
_wdlinestyleemboss3d = 21/*_wdlinestyleemboss3d*/
_wdlinestyleengrave3d = 22/*_wdlinestyleengrave3d*/
_wdlinestyleinset = 24/*_wdlinestyleinset*/
_wdlinestylenone = 0/*_wdlinestylenone*/
_wdlinestyleoutset = 23/*_wdlinestyleoutset*/
_wdlinestylesingle = 1/*_wdlinestylesingle*/
_wdlinestylesinglewavy = 18/*_wdlinestylesinglewavy*/
_wdlinestylethickthinlargegap = 16/*_wdlinestylethickthinlargegap*/
_wdlinestylethickthinmedgap = 13/*_wdlinestylethickthinmedgap*/
_wdlinestylethickthinsmallgap = 10/*_wdlinestylethickthinsmallgap*/
_wdlinestylethinthicklargegap = 15/*_wdlinestylethinthicklargegap*/
_wdlinestylethinthickmedgap = 12/*_wdlinestylethinthickmedgap*/
_wdlinestylethinthicksmallgap = 9/*_wdlinestylethinthicksmallgap*/
_wdlinestylethinthickthinlargegap = 17/*_wdlinestylethinthickthinlargegap*/
_wdlinestylethinthickthinmedgap = 14/*_wdlinestylethinthickthinmedgap*/
_wdlinestylethinthickthinsmallgap = 11/*_wdlinestylethinthickthinsmallgap*/
_wdlinestyletriple = 8/*_wdlinestyletriple*/
 
_wdcolumnbreak = 8/*_wdcolumnbreak*/
_wdlinebreak = 6/*_wdlinebreak*/
_wdlinebreakclearleft = 9/*_wdlinebreakclearleft*/
_wdlinebreakclearright = 10/*_wdlinebreakclearright*/
_wdpagebreak = 7/*_wdpagebreak*/
_wdsectionbreakcontinuous = 3/*_wdsectionbreakcontinuous*/
_wdsectionbreakevenpage = 4/*_wdsectionbreakevenpage*/
_wdsectionbreaknextpage = 2/*_wdsectionbreaknextpage*/
_wdsectionbreakoddpage = 5/*_wdsectionbreakoddpage*/
_wdtextwrappingbreak = 11/*_wdtextwrappingbreak*/
 
_wdcollapseend = 0/*_wdcollapseend*/
_wdcollapsestart = 1/*_wdcollapsestart*/
end intellisense**/


7 个回复 | 最后更新于 2022-05-02
2022-04-30   #1

辛苦队长 了..

2022-04-30   #2

必须给赞啊

2022-04-30   #3

2022-04-30   #4

因为, COM库有用过这个com.word了......

image.png

所以冲突了. 

库名可以改为com.wordDoc,就行了

2022-04-30   #5

,真是众人拾材火焰高呀

2022-04-30   #6

回复#5 @巴克队长 :

我帮你把楼上代码改了下, 并打包了个工程,方便其他人测试. 

2022-05-02   #7

感谢分享

登录后方可回帖

登 录
信息栏
 私人小站

本站域名

ChengXu.XYZ

投诉联系:  popdes@126.com



快速上位机开发学习,本站主要记录了学习过程中遇到的问题和解决办法及上位机代码分享

这里主要专注于学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.
如果侵权,联系 Popdes@126.com

友情链接
Aardio官方
Aardio资源网


才仁机械


网站地图SiteMap

Loading...