com.word库分享

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

由于最近经常写报告,其中很多图片需要格式化大小,所以仿照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

感谢分享

登录后方可回帖

登 录
信息栏
公告:
私人站, 专注分享, 可在分享中适当提问, 但谢绝纯提问, 否则不再提醒一律删帖, 谢谢合作!



本站域名:HtmLayout.Cn
aardio可以快速开发上位机,本站主要记录了学习过程中遇到的问题和解决办法及aardio代码分享

这里主要专注于aardio学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.

Aardio 官方站:Aardio官方
Aardio最新功能:Aardio官方更新日志
本 站 主 站:Stm32cube中文网
Sciter中文在线文档Sciter在线学习文档
空间赞助:才仁机械
Loading...