jacob大部分方法封装类
- 格式:docx
- 大小:21.82 KB
- 文档页数:18
中国电子网 转载 中国电子论坛 欢迎光临我们的网站IC 封装大全 IC 封装形式图片介绍BGA Ball Grid Array EBGA 680L 球栅阵列, 面阵 列封装TQFP 100L SC-70 5L 方形扁平封装SIP Single Inline PackageSOP Small Outline Package单列直插封装SOJ 32L SOJ J 形引线小外形 封装中国电子网 转载 中国电子论坛 欢迎光临我们的网站SOP EIAJ TYPE II 14L SOT220 小外形封装SSOP 16LSSOPTO-18TO-220TO-247TO-264中国电子网 转载 中国电子论坛 欢迎光临我们的网站TO3TO52TO52TO71TO72TO78TO8TO92中国电子网 转载 中国电子论坛 欢迎光临我们的网站TO93TO99TSOP Thin Small Outline PackageTSSOP or TSOP II Thin Shrink Outline PackageuBGA Micro Ball Grid ArrayZIP Zig-Zag Inline PackageuBGA Micro Ball Grid ArrayZIP Zig-Zag PackageInline中国电子网 转载 中国电子论坛 欢迎光临我们的网站BQFP132C-Bend LeadCERQUAD Ceramic Quad Flat PackCeramic CaseGull LeadsWingTO263/TO268LBGA 160LPBGA 217L Plastic Ball Grid Array中国电子网 转载 中国电子论坛 欢迎光临我们的网站SBGA 192LTSBGA 680LCLCCCPGA Ceramic Pin Grid ArrayDIP Dual Inline PackageDIP-tab Dual Inline Package with Metal Heatsink双列直插封装FBGAFDIP中国电子网 转载 中国电子论坛 欢迎光临我们的网站FTO220Flat PackHSOP28ITO220ITO3pJLCCLCCLDCC中国电子网 转载 中国电子论坛 欢迎光临我们的网站LGALQFPPCDIPPGA Plastic Pin Grid ArrayPLCC PQFP 有引线塑料芯 片栽体PSDIPLQFP 100L中国电子网 转载 中国电子论坛 欢迎光临我们的网站METAL QUAD 100LPQFP 100LQFP Quad PackageFlatSOT223SOT223SOT23SOT23/ SOT323SOT26/ SOT363中国电子网 转载 中国电子论坛 欢迎光临我们的网站SOT343SOT523SOT89SOT89LAMINATE TCSP 20L Chip Scale PackageTO252SO DIMM Small Outline Dual In-line Memory ModuleSIMM30 Single In-line Memory ModuleSocket 603FosterSOCKET 370 For intel 370 pin PGAPentium III &Celeron CPUPCI 64bit 3.3VPeripheralComponentInterconnect SIMM72 Single In-line Memory ModuleSOCKET462/SOCKET AFor PGA AMDAthlon &Duron CPUSOCKET 7 For intel Pentium & MMX Pentium CPUSLOT 1For intelPentium IIPentium III &Celeron CPUSLOT A For AMD Athlon CPUPCMCIA SIMM72 Single In-line Memory ModuleIC封装形式文字介绍1、BGA(ball grid array)球形触点陈列,表面贴装型封装之一。
jacobi迭代法原理一、引言Jacobi迭代法是一种数值方法,用于解线性方程组。
它是一种简单而又实用的方法,可以在计算机上高效地实现。
本文将详细介绍Jacobi 迭代法的原理。
二、线性方程组在介绍Jacobi迭代法之前,我们先来了解一下线性方程组。
一个线性方程组可以表示为:A*x = b其中A是一个n×n的矩阵,x和b是n维列向量。
我们的目标是求解x。
三、Jacobi迭代法的基本思想Jacobi迭代法的基本思想是将矩阵A分解为两个部分:D和R。
其中D是A的对角线部分,R是除对角线外的部分。
例如,对于下面这个3×3的矩阵:A = [4 1 0; 1 4 1; 0 1 4]我们可以将其分解为:D = [4 0 0; 0 4 0; 0 0 4]R = [0 -1 0; -1 0 -1; 0 -1 0]然后我们可以将原方程组表示为:(D+R)*x = b进一步化简得到:D*x = b - R*x这就是Jacobi迭代法的基本式子。
四、Jacobi迭代法的算法流程Jacobi迭代法的算法流程如下:1. 将矩阵A分解为D和R。
2. 初始化x为一个任意的向量。
3. 对于每个迭代步骤,计算新的x值:x(i) = (b(i) - R(i)*x(i-1)) / D(i,i)4. 重复第3步,直到收敛。
五、Jacobi迭代法的收敛性Jacobi迭代法并不总是能够收敛。
如果矩阵A不满足对角线严格占优条件,则可能会出现发散的情况。
对于一个n×n的矩阵A,如果它满足以下条件之一,则称其为对角线严格占优:1. 对于所有i=1,2,...,n,有|a(i,i)| > ∑|a(i,j)| (j≠i)2. 对于所有i=1,2,...,n,有|a(i,i)| > ∑|a(j,i)| (j≠i)如果矩阵A满足对角线严格占优条件,则Jacobi迭代法一定会收敛。
六、Jacobi迭代法的优缺点Jacobi迭代法具有以下优点:1. 简单易懂:相较于其他数值方法,Jacobi迭代法更加简单易懂。
封装知识点总结一、封装的概念封装是面向对象编程中的一个重要概念,它指的是将数据和方法封装到一个抽象的数据类型中,从而隐藏数据的实现细节,只暴露必要的接口给外部使用。
通过封装,我们可以将一个复杂的系统拆分成几个相互独立的模块,提高代码的可复用性和可维护性。
在封装中,通常会使用访问修饰符来控制类的成员变量和方法的访问权限。
常见的访问修饰符包括public、private和protected,它们分别表示公有、私有和受保护的成员,用来控制外部对类的成员的访问。
二、封装的优点封装具有以下几个优点:1. 隐藏细节:通过封装,可以隐藏数据的实现细节,只暴露必要的接口给外部使用。
这样可以降低类与类之间的耦合度,提高系统的灵活性和可维护性。
2. 简化接口:封装可以将一组相关的数据和方法组织成一个抽象的数据类型,从而简化系统的接口。
这样可以降低使用者对系统的理解和使用难度,提高系统的易用性。
3. 信息隐藏:通过封装,可以控制类的成员的访问权限,只暴露必要的接口给外部使用。
这样可以保护数据的安全性,防止数据被直接访问和修改,提高系统的安全性。
4. 提高可复用性:封装可以将功能代码封装到一个模块中,从而提高代码的可复用性。
这样可以降低系统开发和维护的成本,提高系统的效率和可靠性。
5. 方便维护:封装可以将功能代码封装到一个模块中,从而提高代码的可维护性。
这样可以方便对模块进行修改和扩展,提高系统的灵活性和可维护性。
三、封装的实现方式在面向对象编程中,通常会使用类和对象来实现封装。
一个类可以包含成员变量和方法,成员变量用来存储数据,方法用来操作数据。
通过访问修饰符,可以控制成员变量和方法的访问权限,从而实现数据的封装。
在Java语言中,可以通过访问修饰符来实现封装。
常见的访问修饰符包括public、private和protected,它们分别表示公有、私有和受保护的成员。
通过这些访问修饰符,可以控制类的成员的访问权限,只暴露必要的接口给外部使用。
汽水初进入中国时被称为荷兰水,至少在1887年已经出现在上海街头,饮料呈淡绿色,售卖时装在带盖子的瓦盆里。
民国时期,最受年轻人喜欢的去处,是饮冰室。
报纸上用喝汽水的照片来反映人们的休闲生活,称“富人们在茶室闲坐终日,汽水、可口可乐、鲜橘汁,是却暑妙品”。
20世纪20、30十年代,外资品牌洋汽水售价大约一元,国产品牌只能卖到七八角,而路边摊的汽水,可能只要三四角。
在饮食上动手能力极强的中国人,不仅乐于购买成品汽水,还开始琢磨如何在家庭自制。
气泡水很早就是夏日饮品市场上的佼佼者,瓶盖打开的那一刻听到滋滋冒泡声,我们仿佛已经有了抵抗酷暑燥热的力量。
童年记忆中,“汽水、西瓜、凉席”这夏日三件套好像比空调更让人觉得消暑。
事实上,汽水的解暑功效不止是一种错觉。
人们饮用碳酸饮料后,由于温度的升高和压力的降低,碳酸就会分解为二氧化碳和水。
由于该反应为吸热反应,因此伴随着二氧化碳从体内的排出而带走一些热量,进而起到清凉降温的作用。
不过,几百年前人们想尽办法把二氧化碳注入水中的初衷,可不是为了喝着痛快,而是为了研制药物,碳酸饮料的发明实属无心插柳之举。
人工气泡水艰难诞生在活火山比较多的欧洲,很多泉水天然带气。
在西方历史上,含气的天然矿泉水一直被视为珍品,人们相信它具有魔力,包治百病。
16世纪60年代,就有人记录过英国巴斯的“神仙水”产地。
这些矿泉的周边开设了大量温泉浴场,成为有钱人休闲保健的好去处。
商人们起初也想把这些天然气泡水运到集市上卖,赚个盆满钵满,没曾想到了集市开盖一看,水里原先的气泡早就跑光了,只留了缸底的一层沉淀物。
气泡矿泉水除了用于泡澡,后来逐渐又被摆上餐桌,是因为大家发现带有气泡的水喝起来似乎特别清凉解渴,猜想气泡水一定对人体健康有益。
既然做不了大自然的搬运工,不如想办法模仿大自然。
如何制作出有气泡的水?历史上有不少人就这个问题进行过研究。
一般认为,英国人布朗明哥(William Brownrigg,1712—1800)是往水里加气造“汽水”的第一人。
常见的封装类型封装大致经过了如下发展进程:结构方面:DIP封装(70年代)->SMT工艺(80年代 LCCC/PLCC/SOP/QFP)->BGA封装(90年代)->面向未来的工艺(CSP/MCM)材料方面:金属、陶瓷->陶瓷、塑料->塑料;引脚形状:长引线直插->短引线或无引线贴装->球状凸点;装配方式:通孔插装->表面组装->直接安装一.TO 晶体管外形封装TO(Transistor Out-line)的中文意思是“晶体管外形”。
这是早期的封装规格,例如TO-92,TO-92L,TO-220,TO-252等等都是插入式封装设计。
近年来表面贴装市场需求量增大,TO封装也进展到表面贴装式封装。
TO252和TO263就是表面贴装封装。
其中TO-252又称之为D-PAK,TO-263又称之为D2PAK。
D-PAK封装的MOSFET有3个电极,栅极(G)、漏极(D)、源极(S)。
其中漏极(D)的引脚被剪断不用,而是使用背面的散热板作漏极(D),直接焊接在PCB上,一方面用于输出大电流,一方面通过PCB散热。
所以PCB的D-PAK焊盘有三处,漏极(D)焊盘较大。
%二. DIP 双列直插式封装DIP(DualIn-line Package)是指采用双列直插形式封装的集成电路芯片,绝大多数中小规模集成电路(IC)均采用这种封装形式,其引脚数一般不超过100个。
封装材料有塑料和陶瓷两种。
采用DIP封装的CPU芯片有两排引脚,使用时,需要插入到具有DIP结构的芯片插座上。
当然,也可以直接插在有相同焊孔数和几何排列的电路板上进行焊接。
DIP封装结构形式有:多层陶瓷双列直插式DIP,单层陶瓷双列直插式DIP,引线框架式DIP(含玻璃陶瓷封接式,塑料包封结构式,陶瓷低熔玻璃封装式)等。
DIP封装具有以下特点:1.适合在PCB (印刷电路板)上穿孔焊接,操作方便。
2.比TO型封装易于对PCB布线。
雅克比迭代法python
-Jacobi迭代法是一种数值计算技术,用于求解非线性系统的迭代方法。
它将
非线性系统拆解为若干个独立的一维或二维子系统,利用迭代过程不断迭代地改进参数,最终收敛到满足约束条件的最优解。
Jacobi迭代法有利于在非线性系统中有效求解问题,它具有以下特点:
1、计算简单:Jacobi迭代法只需要计算每次迭代的细节,不需要求解任何解析表
达式,这种迭代方法可以有效地减少计算量和计算时间;
2、易编译:Jacobi迭代法只需要将等式离散化,然后对每组等式进行迭代,在程
序上比较容易编译;
3、稳定性好:Jacobi迭代法能够很快地收敛到最优解。
因此,Jacobi迭代法在不断优化的求解参数的过程中,以及优化非线性系统
的运算效率上,都具有较高的效率和准确度。
它的优势在于计算简单性和高效的稳定性,可以有效地提升计算效率,作为从大规模非线性系统中求解问题的一种技术,它在机器学习、信号处理、图像处理、线性系统控制、建模和函数优化等诸多领域都得到了广泛应用,受到学术界和实际应用界的高度重视。
通过Java调用OCX控件有几种方法,JNI、JACOB、Jawin等最直接的方式,也是最麻烦的方式,需要自己完成所有的工作,不推荐。
尝试了一下,效果不错,但相对来说,其编程风格更贴近Windows,离Java有点远使用Jacob非常方便,Java编程风格,需要了解的知识比较少。
下载地址projects/jacob-project/Jacob的使用方法1.初始化(true);ActiveXComponent com = new ActiveXComponent("组件的ProgID") ;Dispatch disp = ();2.调用控件里面的方面调用无参的方法,并返回一个short值(disp, "Init").getShort();调用有一个参数的方法,并返回一个boolean值(disp,"Method",new Variant(args)).getBoolean();调用多个参数依次类推,注意在传递参数前,将Java中的参数转换成Variant。
问题解决在使用Jacob调用OCX控件时,总是出一个异常Exception in thread "main" A COM exception has been encountered:At Invoke of: InitDescription: 灾难性故障通过Jawin调用,会出现8000FFFF错误。
这个错误是由ActiveX结构设计造成的。
在版本之前,外部程序是可以直接调用OCX中方法的。
之后,每次调用控件中的方法,系统会自动检查是否允许调用,即运行 (DISPID)该方法检查控件是否正确的初始化或者是否通过持久存储接口正确加载,如果两个条件有一个满足,即返回TRUE,否则返回FALSE。
当控件在MFC中使用时,很多细节,如初始化,都被过滤了,这样,大多数用户都不会遇到这个问题。
实验名称:项目一 Jacobi 旋转法,Jacobi 过关法实验题目:用Jacobi 旋转法,Jacobi 过关法计算下面矩阵A 的全部特征值以及特征向量2100121001210012A -⎡⎤⎢⎥--⎢⎥=⎢⎥--⎢⎥-⎣⎦ 实验过程:1、 Jacobi 旋转法程序如下:function [EigV alMat,EigV ecMat]=JocobiRot(A,eps)% 本程序是根据jacobi 旋转法求实对称矩阵的全部特征值和特征向量% 输入变量:A 为对称实矩阵,eps 为允许误差.% 输出变量:EigValMat 为A 的特征值,EigVecMat 为特征向量n=size(A);n=n(1); % n 为矩阵A 的阶数P=eye(n); % P 为旋转矩阵,赋初值为单位阵trc=1; % trc 为矩阵A 的非对角元素的平方和,赋初值为1; num=0; % num 设置为累加器,记录迭代的次数while abs(trc)>=eps % 进行正交变换A=PAP'将A 的两个绝对值最大的非对角元素化零,直到所有非对角元素的平方和小于给定的eps,则结束循环.MaxMes=FinMax(A); % 寻找绝对值最大的非对角元素的位置及所有非对角元素的平方和l=MaxMes(1); % l 为绝对值最大的非对角元素的行号s=MaxMes(2); % s 为绝对值最大的非对角元素的列号trc=MaxMes(3); % trc 为矩阵A 的非对角元素的平方和RotMat=ComRotMat(A,l,s); % 计算此次旋转的平面旋转矩阵RotMatA=RotMat*A*RotMat'; % 对当前A 进行一次旋转变换将A 的两个绝对值最大的非对角元素化零,并仍记为AP=RotMat*P; % 记录到目前为止所有旋转矩阵的乘积num=num+1; % 记录已经进行旋转的次数endEigValMat=A;EigVecMat=P;numfunction MaxMes=FinMax(A)% 对上三角进行扫描,寻找矩阵A的绝对值最大的非对角元素的位置及所有非对角元素的平方和% 输入量:实对称矩阵A% 输出量:MaxMes记录矩阵A的绝对值最大的非对角元素的行号列号及所有非对角元素的平方和n=size(A);n=n(1);trc=0;MaxVal=0; % MaxVal记录矩阵A的绝对值最大的非对角元素赋初值为0for i=1:n-1for j=i+1:ntrc=trc+2*A(i,j)^2;if abs(A(i,j))>MaxValMaxVal=abs(A(i,j));l=i; % l为绝对值最大的非对角元素的行号s=j; % s为绝对值最大的非对角元素的列号endendendMaxMes=[l,s,trc];function RotMat=ComRotMat(A,l,s)% 计算平面旋转矩阵% 输入量:实对称矩阵A及矩阵A的绝对值最大的非对角元素的行号l列号s% 输出量:旋转的平面旋转矩阵RotMatn=size(A);n=n(1);if A(l,l)==A(s,s)c1=1/sqrt(2); s1=1/sqrt(2);elsetan2=2*A(l,s)/(A(l,l)-A(s,s));c2=1/sqrt(1+(tan2)^2);s2=tan2*c2;c1=sqrt((1+c2)/2);s1=s2/(2*c1);endRotMat=eye(n);RotMat(l,l)=c1;RotMat(s,s)=c1;RotMat(l,s)=s1;RotMat(s,l)=-s1;2、Jacobi过关法程序如下:function [EigV alMat,EigV ecMat]=JocobiGG(A,eps)% 本程序是根据jacobi过关法求实对称矩阵的全部特征值和特征向量% 输入变量:A为对称实矩阵,eps为允许误差.% 输出变量:EigValMat为A的特征值,EigVecMat为特征向量n=size(A);n=n(1); % n为矩阵A的阶数P=eye(n); % P为旋转矩阵,赋初值为单位阵trc=0; % trc为矩阵A的非对角元素的平方和,赋初值为0;num=0; % num设置为累加器,记录迭代的次数for i=1:n-1for j=i+1:ntrc=trc+2*A(i,j)^2; % 计算矩阵A的非对角元素平方和endendr0=trc^(1/2);r1=r0/n;while r1>=epsfor i=1:n-1for j=i+1:nif abs(A(i,j))>=r1 % 对abs(A(i,j))>=r1的元素进行旋转变换,将A(i,j)化为0,其余元素视为“过关”,不作相应的变换l=i;s=j;RotMat=ComRotMat(A,l,s); % 计算此次旋转的平面旋转矩阵RotMatA=RotMat*A*RotMat';P=RotMat*P; % 记录到目前为止所有旋转矩阵的乘积num=num+1; % 记录已经进行旋转的次数endendendr1=r1/n; % 当所有非对角元素绝对值都小于r1后,缩小阀值endEigValMat=A;EigVecMat=P;numfunction RotMat=ComRotMat(A,l,s)% 计算平面旋转矩阵% 输入量:实对称矩阵A及矩阵A的绝对值最大的非对角元素的行号l列号s% 输出量:旋转的平面旋转矩阵RotMatn=size(A);n=n(1);if A(l,l)==A(s,s)c1=1/sqrt(2); s1=1/sqrt(2);elsetan2=2*A(l,s)/(A(l,l)-A(s,s));c2=1/sqrt(1+(tan2)^2);s2=tan2*c2;c1=sqrt((1+c2)/2);s1=s2/(2*c1);endRotMat=eye(n);RotMat(l,l)=c1;RotMat(s,s)=c1;RotMat(l,s)=s1;RotMat(s,l)=-s1;实验结果:1、Jacobi旋转法运行结果如下:>>A=[2 -1 0 0;-1 2 -1 0;0 -1 2 -1;0 0 -1 2];eps=0.0001;[EigValMat,EigV ecMat]=JocobiRot(A,eps) num =7EigValMat =0.3820 0 0 -0.00000 3.6180 0 00 -0.0000 1.3820 00 0 0 2.6180EigVecMat =0.3717 0.6015 0.6015 0.3717-0.3717 0.6015 -0.6015 0.3717-0.6015 -0.3717 0.3717 0.60150.6015 -0.3717 -0.3717 0.60152、Jacobi过关法运行结果如下:>> [EigValMat,EigVecMat]=JocobiGG(A,eps)num =16EigValMat =0.3820 0.0000 -0.0000 -0.00000.0000 3.6180 -0.0000 0.0000-0.0000 -0.0000 1.3820 0.00000.0000 0.0000 0.0000 2.6180EigVecMat =0.3717 0.6015 0.6015 0.3717-0.3718 0.6015 -0.6015 0.3717-0.6015 -0.3717 0.3717 0.60150.6015 -0.3717 -0.3718 0.6015实验名称:项目二 Romberg 方法求数值积分 实验题目:用Romberg 方法计算下列积分:(1)30sin x e xdx ⎰,要求准确到610-(2)210x e dx -⎰,要求准确到610-实验过程:function I=romberg(fun,a,b,eps)m=1;h=b-a;I=h/2*(feval(fun,a)+feval(fun,b));T(1,1)=I;while 1N=2^(m-1);h=h/2;I=I/2;for i=1:NI=I+h*feval(fun,a+(2*i-1)*h);endT(m+1,1)=I;M=2*N;k=1;while M>1T(m+1,k+1)=(4^k*T(m+1,k)-T(m,k))/(4^k-1);M=M/2;k=k+1;endif abs(T(k,k)-T(k,k-1))<epsbreak;endm=m+1;endI=T(k,k);实验结果:>> fun=inline('exp(x)*sin(x)');a=0;b=3;eps=0.000001;I=romberg(fun,a,b,eps)I =11.8595>> fun=inline('exp(-x^2)');a=0;b=1;eps=0.000001;I=romberg(fun,a,b,eps)I =0.7468。
package com.bjsasc.avidm.avplan.evaluate.util;import java.io.File;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import com.jacob.activeX.ActiveXComponent; import FailException; import Thread;import .Dispatch;import .Variant;public class EvaluateJacobWordUtil {/** Word应用对象*/private ActiveXComponent wordApplication;/** 所有文档对象*/private Dispatch wdDocuments;/** 当前活动文档对象*/private Dispatch wdDocument;/** 当前选择范围*/private Dispatch wdSelection;/** 所有表格对象*/private Dispatch wdTables;/** 当前表格对象*/private Dispatch wdTable;/** 单元格对象*/private Dispatch tbCell;/** 所有书签对象*/private Dispatch wdBookmarks;/** 当前书签对象*/private Dispatch wdBookmark;/** empty */private Dispatch range;/** word是否以可视化方式运行*/private static boolean wdVisible = false;public void setVisible(boolean visible){wdVisible = visible;}/*** 启动Word应用,并调用ComThread.InitSTA()方法*/private void run() throws Exception{// 初始化COM进程initCom();// 启动word应用wordApplication = new ActiveXComponent("Word.Application");// 是否以可视化方式运行wordApplication.setProperty("Visible", new Variant(wdVisible));// 得到所有word文档对象this.wdDocuments = wordApplication.getProperty("Documents").getDispatch(); }/*** 初始化COM线程*/public void initCom() {ComThread.InitSTA();}/*** 释放COM线程资源,COM的线程回收不由java 垃圾回收机制回收*/public void releaseCom() {ComThread.Release();}/*** 启动word,同时打开word文档* @param String filePath 文档地址* @deprecated*/public void openDocument(String filePath) throws Exception{try{run();wdDocument = Dispatch.call(wdDocuments, "Open", filePath).getDispatch();wdTables = wordApplication.call(wdDocument, "Tables").getDispatch();wdBookmarks = wordApplication.call(wdDocument, "Bookmarks").getDispatch();wdSelection = wordApplication.getProperty("Selection").getDispatch();}catch(ComFailException e){throw new Exception(e);}}/*** 根据模版创建新文件* @param String templatePath 模版文件地址*/public void newDocumentByTemplate(String templatePath) throws Exception{ try{run();wdDocument = Dispatch.call(wdDocuments, "Add", templatePath).getDispatch();wdTables = wordApplication.call(wdDocument, "Tables").getDispatch();wdBookmarks = wordApplication.call(wdDocument, "Bookmarks").getDispatch();wdSelection = wordApplication.getProperty("Selection").getDispatch();}catch(ComFailException e){throw new Exception(e);}}/*** 关闭Word当前文档* @param Boolean saveOnExit (ture保存并关闭,false不保存关闭)*/public void closeDocument(boolean saveOnExit) throws Exception {if(wdDocument != null){Dispatch.call(wdDocument, "Close",new Variant(saveOnExit));wdDocument = null;}}/*** 另存为其他格式文档* @param String outFileName 保存文件路径* @param Int saveFormat 保存文件类型* saveFormat | Member name Description* 0 | wdFormatDocument Microsoft Word format.* 1 | wdFormatTemplate Microsoft Word template format.* 2 | wdFormatText Microsoft Windows text format.* 3 | wdFormatTextLineBreaks Microsoft Windows text format with line breaks preserved.* 4 | wdFormatDOSText Microsoft DOS text format.* 5 | wdFormatDOSTextLineBreaks Microsoft DOS text with line breaks preserved.* 6 | wdFormatRTF Rich text format (RTF).* 7 | wdFormatEncodedText Encoded text format.* 7 | wdFormatUnicodeText Unicode text format.* 8 | wdFormatHTML Standard HTML format.* 9 | wdFormatWebArchive Web archive format.* 10 | wdFormatFilteredHTML Filtered HTML format.* 11 | wdFormatXML Extensible Markup Language (XML) format.*/public void saveAs(String outFileName,int saveFormat) throws Exception{Dispatch.call(wdDocument, "SaveAs", outFileName,new Variant(saveFormat));}/*** 另存为* @param String outFileName 保存文件路径*/public void saveAs(String outFileName) throws Exception{saveAs(outFileName,0);}/*** 退出Word应用,并调用ComThread.Release()方法*/public void quit() {if(wordApplication != null){wordApplication.invoke("Quit", new Variant(0));wordApplication = null;}releaseCom();}/*** 选中dispatch对象* @param dispatch(分配,派遣)*/private void select(Dispatch dispatch) {Dispatch.call(dispatch, "Select");}private Dispatch getSelection(){return this.wdSelection;}private Dispatch getRange(Dispatch dispatch){return Dispatch.get(dispatch,"Range").getDispatch();}private Dispatch getTables(){return this.wdTables;}/*** 根据索引查找文档中的表格* @param tbIndex* @return wdTable 当前表格对象*/private Dispatch getTable(int tbIndex) {wdTable = Dispatch.call(wdTables, "Item", new Variant(tbIndex)).getDispatch();return wdTable;}/*** 在selection对象范围内索引表* @param tbIndex* @return wdTable 当前表格对象*/private Dispatch getTable(Dispatch selection,int tbIndex) {Dispatch tables = Dispatch.call(selection, "Tables").getDispatch();Dispatch table = Dispatch.call(tables, "Item", new Variant(tbIndex)).getDispatch();return table;}/*** 查找指定表的某单元格* @param Dispatch tableDispatch* @param int tbRowIndex* @param int tbColumnIndex* @return tbCell 当前单元格对象*/private Dispatch getCell(Dispatch tableDispatch,int tbRowIndex, int tbColumnIndex) throws Exception{try{tbCell = Dispatch.call(tableDispatch, "Cell",new Variant(tbRowIndex),new Variant(tbColumnIndex)).getDispatch();}catch(ComFailException cfe){throw new Exception(cfe);}return tbCell;}private void putText(Dispatch dispatch,String text) throws Exception{range = getRange(dispatch);Dispatch.put(range,"Text",text);}private void insertFile(Dispatch dispatch,File file) throws Exception{range = getRange(dispatch);// select(dispatch);Dispatch.call(range,"insertFile",file.getPath());}/*** 在指定的表格中的单元个填充数据* @param tbIndex word文件中的第N张表(从1开始)* @param rowIndex指定行的序号(从1开始)* @param colIndex指定列的序号(从1开始)* @param text填充的文本内容*/public void putTextToCell(int tbIndex, int rowIndex,int colIndex,String text) throws Exception{// getTable(tbIndex);putText(getCell(getTable(tbIndex),rowIndex,colIndex),text);}/*** 在指定的表格中的单元个填充数据,光标放置在文本后面* @param tbIndex word文件中的第N张表(从1开始)* @param rowIndex指定行的序号(从1开始)* @param colIndex指定列的序号(从1开始)* @param text填充的文本内容*/public void setTextToCell(int tbIndex, int rowIndex,int colIndex,String text) throws Exception{ Dispatch cell = getCell(getTable(tbIndex),rowIndex,colIndex);select(cell);Dispatch.call(wdSelection,"InsertAfter",text);}/*** 在指定行前面增加一行* @param tbIndex word文件中的第N张表(从1开始)* @param tbRowIndex指定行的序号(从1开始)*/public void insertRowAtTable(int tbIndex,int tbRowIndex) throws Exception{// 根据索引取表格wdTable = getTable(tbIndex);// 表格的所有行Dispatch tbRows = Dispatch.get(wdTable, "Rows").getDispatch();Dispatch tbCell = getCell(getTable(tbIndex),tbRowIndex,1);Dispatch.call(tbRows, "Add", new Variant(tbCell));}/*** 在指定行下面增加行* @param int tbIndex word文件中的第N张表(从1开始)* @param int tbRowIndex指定行的序号(从1开始)* @param int rowNum插入的行数*/public void insertRowBelow(Dispatch tableDispatch,int tbRowIndex,int rowNum)throws Exception{// 表格的所有行// Dispatch tbRows = Dispatch.get(wdTable, "Rows").getDispatch();Dispatch tbCell = getCell(tableDispatch,tbRowIndex,1);select(tbCell);Dispatch.call(wdSelection, "InsertRowsBelow",new Variant(rowNum));}/*** 在指定行下面增加行* @param int tbIndex word文件中的第N张表(从1开始)* @param int tbRowIndex指定行的序号(从1开始)* @param int rowNum插入的行数*/public void insertRowBelow(int tbRowIndex,int rowNum)throws Exception{wdTable = getTable(tbRowIndex);Dispatch tbCell = getCell(wdTable,tbRowIndex,1);select(tbCell);Dispatch.call(wdSelection, "InsertRowsBelow",new Variant(rowNum));}private void copyOrDeleteRow(Dispatch tbRow, int nDataBlockRow) {/** 没有找到变量*/if (nDataBlockRow == -1)return;/** 变量内容为零条*/if (nDataBlockRow == 0) {Dispatch.call(tbRow, "delete");return;}/** 不用复制*/if (nDataBlockRow == 1)return;if (nDataBlockRow > 1) {Dispatch.call(tbRow, "select");Dispatch.call(wdSelection, "Copy");int nCopyNow = nDataBlockRow - 1;for (int nCopys = 0; nCopys < nCopyNow; nCopys++) {try {Dispatch.call(wdSelection, "Paste");}catch(Exception e) {e.printStackTrace();//有时候文档损坏,可以忽略本问题,实际上已经粘贴上了}}}}/*** 填充表格* @param Dispatch tableDispatch表格对象* @param int tbRowIndex指定行的序号(从1开始)* @param int tbColIndex指定列的序号(从1开始)*/private void fillTable(Dispatch tableDispatch,ArrayList al,int tbRowIndex, int tbColIndex)throws Exception{Dispatch rows = Dispatch.get(tableDispatch, "rows").getDispatch();int rowCount = Dispatch.get(rows,"Count").getInt();if(rowCount > al.size()){rowCount = al.size();}for(int i = 0; i < rowCount; i++){String rowData[] = (String[])al.get(i);for(int j = 0; j < rowData.length; j++){try{getCell(tableDispatch,tbRowIndex + i, tbColIndex + j);if(new File(rowData[j]).exists()){insertFile(tbCell,new File(rowData[j]));}else{putText(tbCell,rowData[j]);}}catch(ComFailException e){e.printStackTrace();}}}}/*** 填充表格,并自动扩展表格* @param tbIndex word文件中的第N张表(从1开始)* @param tbRowIndex指定行的序号(从1开始)* @param tbColIndex指定列的序号(从1开始)*/public void autoFillTable(ArrayList al,int tbIndex,int tbRowIndex, int tbColIndex)throws Exception{if(al.size() < 1){System.out.println("[Empty Table:" + tbIndex + "]");return;}wdTable = getTable(tbIndex);Dispatch rows = Dispatch.get(wdTable, "rows").getDispatch();Dispatch row = Dispatch.call(rows,"Item",new Variant(tbRowIndex)).getDispatch();this.copyOrDeleteRow(row,al.size());fillTable(wdTable,al,tbRowIndex,tbColIndex);}/*** 填充表格* @param ArrayList数据LIST* @param tbIndex word文件中的第N张表(从1开始)* @param tbRowIndex指定行的序号(从1开始)* @param tbColIndex指定列的序号(从1开始)*/public void insertAtTable(ArrayList al,int tbIndex,int tbRowIndex,int tbColIndex)throws Exception{if(al.size() < 1){System.out.println("[Empty Table:" + tbIndex + "]");return;}wdTable = getTable(tbIndex);fillTable(wdTable,al,tbRowIndex,tbColIndex);}private float getHeight(Dispatch dispatch) throws Exception{float height = 0;try{if(dispatch != null){height = Dispatch.get(dispatch, "Height").getFloat();}}catch(ComFailException cfe){throw new Exception(cfe);}return height;}/*** 设置指定对象的高度* @param Dispatch dispatch* @param String height 高度值*/private void setHeight(Dispatch dispatch,String height) throws Exception{try{if(dispatch != null){Dispatch.put(dispatch, "Height",new Variant(height));}}catch(ComFailException cfe){throw new Exception(cfe);}}/*** 拆分单元格* @param Dispatch cellDispatch 要拆分的单元格* @param int numRows 拆分的行数* @param int numColumns 拆分的列数*/public void splitCell(Dispatch cellDispatch,int numRows,int numColumns)throws Exception{ try{Dispatch.call(cellDispatch,"Split",new Variant(numRows),new Variant(numColumns));}catch(ComFailException cfe){throw new Exception(cfe);}}private Dispatch getBookmarks(){return this.wdBookmarks;}/*** 根据书签名称得到书签对象。