Word文档格式从doc转为mht.docx
- 文档编号:6085202
- 上传时间:2023-01-03
- 格式:DOCX
- 页数:31
- 大小:43.98KB
Word文档格式从doc转为mht.docx
《Word文档格式从doc转为mht.docx》由会员分享,可在线阅读,更多相关《Word文档格式从doc转为mht.docx(31页珍藏版)》请在冰豆网上搜索。
Word文档格式从doc转为mht
Word文档格式从doc转为mht
发布时间:
2008年12月27日 作者:
olivertan
阅读次数:
491次 类别:
学习 永久链接 Trackback
一、 Java调用动态链接库的方法
Java以其跨平台的特性深受人们喜爱,但正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能。
解决Java对本地操作的一种方法就是JNI。
Java通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式)。
通过调用本地的库文件的内部方法,使Java可以实现和本地机器的紧密联系,调用系统级的各接口方法。
但是Java不能直接调用动态链接库,必须按照JNI的开发步骤,利用C或C++语言生成遵循JNI规范的dll文件。
JNI的开发步骤如下所示。
1. 编写带有native声明的方法的java类;
2. 使用javac命令编译所编写的java类,生成class文件;
3. 使用“javah类名”生成扩展名为h的头文件;
4. C/C++程序引用生成的头文件,并实现本地方法;
5. 将C/C++编写的文件生成动态链接库;
6. 将生成的dll文件放到编译好的javaclass文件目录下。
具体的开发细节请参考JNI规范(Java本地接口规范),浏览地址:
http:
//www.iplab.cs.tsukuba.ac.jp/~liuxj/jdk1.2/zh/docs/guide/jni/spec/jniTOC.doc.html
二、 Java与.Net互操作使用OfficeCOM对象
Java使用OfficeCOM对象一般有以下两种途径。
直接使用JNI自定义实现方法
Java通过JNI调用本地方法,该本地方法存放在遵循JNI规范的C++程序生成的dll文件中。
由于C++程序不是托管代码,不能直接访问OfficePIA,所以必须在C++程序中使用托管代码(C#或VB)访问OfficePIA,通过OfficePIA使用OfficeCOM组件。
这种方式虽然实现起来比较繁琐,但是可以灵活控制和维护。
java程序和C++程序是相互透明的,可以分开维护。
当Office升级时,可以方便地更新C++代码,重新生成动态链接库,而不必更新Java代码。
使用Jacob等中间件
Jacob顾名思义,就是JAVA-COMBridge,Jacob也是间接使用了JNI方式,封装了一些COM对象的功能。
Jacob和其它第三方产品一样,只是自定义了若干的功能,并没有完全使用OfficeCOM对象,所以有一定的局限性。
另外,当Office升级时,如果这些中间件不能及时更新,将会影响应用系统的正常使用。
本文的示例采用第一种方式,Java利用JNI方法与.Net互操作,通过OfficePIA使用OfficeCOM对象。
三、 开发环境的配置
Java环境的配置
1、安装JDK;
2、设置系统变量JAVA_HOME;
3、将“%JAVA_HOME%\bin”加入系统变量PATH;
4、将“%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar”加入系统变量CLASSPATH。
.Net环境的配置
.Net环境需要安装以下软件:
MicrosoftOffice2003andrelatedSPs
Microsoft.NETFrameworkandrelatedSPs
MicrosoftVisualStudio.NET2003
与安装OfficeXP不同,装好Office2003后,操作系统就自动装上OfficePIA。
通过访问PIA(主程序集,PrimaryInteropAssembly)来使用由Office应用程序公开的COM组件。
在ASP和VB中使用Office的COM组件是很方便的,可以通过形如CreateObject(Word.Application)的方式建立OLE对象并操作它的属性。
在.NET中,微软提供了PIA以方便C++和C#程序员,但C++是非托管代码,必须使用托管代码(C#或VB)访问PIA。
四、 开发Java程序
程序调用本地方法Convert2mht将folder目录下的doc文件批量转化为mht文件。
publicclassdoc2mht{
publicnativebooleanConvert2mht(Stringfolder);//folder存放要转化的doc文件
static{
System.loadLibrary("doc2mht");
}
publicstaticvoidmain(String[]args)
{
booleansuccess=newdoc2mht().Convert2mht("D:
\\doc2mht");
if(success==true)
System.out.println("转化成功!
");
else
System.out.println("转化失败!
");
}
}
在Java程序中声明和使用本地方法(native)Convert2mht,该方法的实现在doc2mht.dll中,dll文件由C++程序编译而成,和Java的class文件放在同一目录下。
使用命令“javahdoc2mht”生成头文件doc2mht.h,C++程序调用该头文件来生成所需的库文件。
#include
#ifndef_Included_doc2mht
#define_Included_doc2mht
#ifdef__cplusplus
extern"C"{
#endif
JNIEXPORTjbooleanJNICALLJava_doc2mht_Convert2mht(JNIEnv*,jobject,jstring);
#ifdef__cplusplus
}
#endif
#endif
在具体实现的时候,我们只关心函数原型:
JNIEXPORTjbooleanJNICALLJava_doc2mht_Convert2mht(JNIEnv*,jobject,jstring);
这里JNIEXPORT和JNICALL都是JNI的关键字,表示此函数是要被JNI调用的。
函数的名称是JAVA_再加上java程序的package路径再加函数名组成的。
而jstring是以JNI为中介使JAVA的String类型与本地的string沟通的一种类型。
JNI接口指针是本地方法的第一个参数,其类型是JNIEnv。
第二个参数随本地方法是静态还是非静态而有所不同。
非静态本地方法的第二个参数是对对象的引用,而静态本地方法的第二个参数是对其Java类的引用。
我们可以在C++程序中用接口指针env来操作Java对象。
比如通过以下代码将Java中的String转化为C++的字符串类型:
constchar*directory=env->GetStringUTFChars(folder,0);
五、 开发C++程序
打开VS.NET新建项目,在“VisualC++项目”中找“类库”,新建项目“doc2mht”。
可以看到源文件中生成了默认的doc2mht.cpp,把java程序生成的doc2mht.h加到项目的头文件列表中覆盖默认文件。
添加引用“Microsoft.Office.Interop.Word.dll”。
右键单击项目,选“属性”,在“配置属性/常规/使用托管扩展”选择“是”,在“C/C++”中选“常规”,在“附加包含目录”中输入“JAVA_HOME\include;JAVA_HOME\include\win32”,其中JAVA_HOME用你自己的JDK安装主目录代替。
在“解析#using引用”中输入“D:
\VSNET\EnterpriseFrameworks”,同样,用你自己的PIA安装目录代替,一般在MicrosoftVisualStudio.NET2003安装目录下。
打开文件doc2mht.cpp,用以下程序覆盖默认代码。
#include"stdafx.h"
#include"doc2mht.h"
#include
#using"mscorlib.dll"
#using"Microsoft.Office.Interop.Word.dll"
usingnamespaceSystem;
usingnamespaceSystem:
:
Reflection;
usingnamespaceSystem:
:
IO;
usingnamespaceMicrosoft:
:
Office:
:
Interop;
//使用OfficeCOM组件将doc文件批量转化为mht文件
JNIEXPORTjbooleanJNICALLJava_doc2mht_Convert2mht(JNIEnv*env,jobjectobj,jstringfolder)
{
boolsuccess=false;//转化是否成功
constchar*directory=env->GetStringUTFChars(folder,0);//将Java中的String转化为C++的字符串类型,directory下存放要转化的doc文件
System:
:
String*files[]=Directory:
:
GetFiles(directory);//获取directory下所有文件的文件名,文件名包括完整的路径信息
System:
:
String*docType=S"doc";//要转化的格式
System:
:
String*mhtType=S"mht";//转化后的格式
System:
:
String*split=S".";//用来分割文件名以获取文件格式
System:
:
Charsplits[]=split->ToCharArray();
intwdFormatWebArchive=9;//转化用的参数
System:
:
Object*wordSaveAsFormat=dynamic_cast
System:
:
Object*oMissing=System:
:
Reflection:
:
Missing:
:
Value;//转化用的参数
Word:
:
ApplicationClass*pWord=newWord:
:
ApplicationClass();//COM对象
Word:
:
Documents*pDocs=pWord->Documents;
try
{
Console:
:
WriteLine("开始转化doc文件...");
for(inti=0;i
{
System:
:
String*inputFile=files[i];//文件名
System:
:
String*parts[]=inputFile->Split(splits);//分割文件名
System:
:
String*type=parts[parts->Length-1]->ToLower();//该文件的格式
if(System:
:
String:
:
Compare(type,docType)==0)//判断是否为doc文件
{
System:
:
String*part=inputFile->Substring(0,inputFile->Length-3);
System:
:
String*outputFile=System:
:
String:
:
Concat(part,mhtType);//转化后的文件名,包括了路径信息
Console:
:
WriteLine(outputFile);
System:
:
Object*inputObj=inputFile;//转化为托管类型
System:
:
Object*outputObj=outputFile;//转化为托管类型
Word:
:
_Document*pDoc=pDocs->Open(&inputObj,&oMissing,&oMissing,&oMissing,&oMissing,&oMissing,&oMissing,&oMissing,&oMissing,&oMissing,&oMissing,&oMissing,&oMissing,&oMissing,&oMissing,&oMissing);
pDoc->SaveAs(&outputObj,&wordSaveAsFormat,&oMissing,&oMissing,&oMissing,&oMissing,&oMissing,&oMissing,&oMissing,&oMissing,&oMissing,&oMissing,&oMissing,&oMissing,&oMissing,&oMissing);
pDoc->Close(&oMissing,&oMissing,&oMissing);
System:
:
Runtime:
:
InteropServices:
:
Marshal:
:
ReleaseComObject(pDoc);
}
}
success=true;
}
catch(System:
:
Exception*e)
{
Console:
:
WriteLine(e->GetBaseException()->Message);
Console:
:
WriteLine(e->GetBaseException()->StackTrace);
System:
:
Runtime:
:
InteropServices:
:
Marshal:
:
ReleaseComObject(pDocs);
pWord->Quit(&oMissing,&oMissing,&oMissing);
System:
:
Runtime:
:
InteropServices:
:
Marshal:
:
ReleaseComObject(pWord);
GC:
:
Collect();
}
System:
:
Runtime:
:
InteropServices:
:
Marshal:
:
ReleaseComObject(pDocs);
pWord->Quit(&oMissing,&oMissing,&oMissing);
System:
:
Runtime:
:
InteropServices:
:
Marshal:
:
ReleaseComObject(pWord);
GC:
:
Collect();
returnsuccess;
}
熟悉C++的程序员可能觉得这段代码十分别扭,这是因为使用了C#托管代码。
注意使用托管函数时,函数的参数必须为托管类型。
比如程序中将非托管的参数wdFormatWebArchive强制转化为托管参数wordSaveAsFormat,使用了动态映射和装箱的方法。
__box将托管数据封装成托管对象(__gc对象)。
dynamic_cast表示运行时检查,不在编译时检查,用于多态的类型转换(upcast,downcast和crosscast),只能转换指针和引用。
编译项目,将生成的doc2mht.dll放到doc2mht.class的目录下,利用java命令就可以开始将folder目录下的doc文件批量转化为mht文件。
看电视学英语
发布时间:
2008年12月26日 作者:
olivertan
阅读次数:
163次 类别:
学习 永久链接 Trackback
很早就开始看Friends,最开始是从起床开始,就一个人对着电脑,傻笑一天,每天吃一顿饭,傍晚和同学一起吃饭的时候,基本就不会说中国话了,被人说什么第一个反应就是英文。
周末同学都回家了,更是变本加厉,因为没有人和我说话,内心独白都是F6里的各种声音,还有那种“哄笑”配乐,一个周下来,感觉人快疯了。
大学的时候是为了好玩,没想着真的用它来学英语。
后来工作了几年,因为一直野心勃勃的要去美国公干,所以从那个时候开始重新FANF6,很长一段时间过去,学下来,感觉有些许体会了,上来冒个泡。
第一遍,带中文字幕看一遍
10季真不是个小数字,看了一遍把当初那种感觉找了回来,所谓的感觉,就是在内心独白的时候都是英语,说话的第一个反应也是英文。
第二遍,带英文字母看了一遍
我买的是60张的那种DVD,英文字母有几季还是不错的,后面的越做越差,真是没法看,就当了剧本。
第二次看,基本都能听懂了,就帮着DVD校对字幕,校对的过程中,听力本身就是一个提升。
第三遍,不说你也知道了,去掉字幕,
去掉字母有一个好处,就像丢了拐棍,你听起来就不会像看着英文字母那样一下就反映到脑子里,还要想一下,哦,这个单词是什么来着,因为我们很多时候对于掌握了的单词,突然冒出来,还是会思维停滞一下,就在这停滞的一下,新的内容又冲进来了,你就顾此失彼,到最后,前面的没想起来,后面的又忘了听,刚开始的时候是懊丧不已,因为前两遍的信心全被他给摧毁了,不过没关系,很正常的么,这个地方,你就要不停的重复听,所以你买DVD机比较好,有那个A-B重复健,可以无限重复你要听的句子,你总有想起来的那一刻吧
第三遍是最痛苦的,也是最能升华的一个阶段。
我在做第三遍的时候,是听力口语一起来的,其实这两个本来就是分不开的,
口语,要求自己强力模仿!
!
注意这个词哦~~~不是吃干饭的,充分利用了A-B健,一个句子重复放,跟着读,然后跟着说,最后脱口而出,一点也不比他们差,甚至可以在语气,语调上,和他们一模一样。
作这一部分的时候,我犯了一个错误,就是跟着读剧本,这是十分错误的,正确的做法是,像学鸟叫一样,学他们的声音,不要把自己原来读英文的习惯带到里面去,剧本只是告诉你他们再说什么内容,只是一个提示的作用,因为他们有很多连度,四个音节,在他们嘴里常常变成了 2个音节,甚至一个音就带过了,你根本就反应不过来,这也就是我们听不懂他们说话的原因,太快了,而你根本不知道他连读了,如果按照自己的读英文的习惯,永远也做不到他们一样快。
所以记住,!
!
学他们发出的声音,而不是读他们说出的句子!
!
这第三遍,我可以用老牛拉破车来形容,实在是很慢很无聊,要花费大量的时间,特别是一开始,记得101背到我想吐,莫尼卡的那句“THEREISNOTHINGTOTELL@!
#$%@#%@!
%@$#%”可以直接当减肥药了,一听到就想吐!
!
但是,有一点保证,以后老外用多快的速度,我都能听懂她在说“THEREISNOTHINGTOTELL@!
#$%@#%@!
%@$#%”而且可以和她说的一样快,一样纯正的美国纽约音。
兄弟们~~~代价惨重阿~~~~~`你可以算一下,一集大约20分钟,每句话重复10遍,那是什么概念,就是一集学下来要200分钟,折合3个多小时,如果你特别笨的话,多跟几遍,时间又上去了,我经常会思想溜号,A-B的时候不知道想什么去了,就要多重复几遍。
我当初算了一下,我大约要跟到第7遍的时候才有感觉,前面不是语速慢了,就是快了,要么就是停顿不对,也可能我比较笨?
加上笨的原因,加上溜号,大约有4个小时一集把.
下面分析一下他们六个人的口音语速,RACH,我最喜欢的角色,她的口音不很好学,因为她经常会发出很可爱的声音,感情丰富啊,而且连音也比较多,但是学她很有用,因为她的发音很性感,个人认为。
CHANDLER这个家伙经常会把我逼疯的,他太贫了,语速又快,最难学了,,最好学的是PHEEBS,很喜欢她,她的发音很圆润,语速也很正常,MONIKA可以用她来练长句子,她经常会一口气说很多,JOEY,他反映慢,语速适中应该是最好学的一个,可是他的声音太低了,不适合女生学,我学他太吃力了,男生的话是个首选~~~~
这样我整了3季的时候,除了生词,在新天地泡吧的时候,可以和老外自由对话,心理满足了一把
过了3季,后面的7季就会块很多,因为很多句子,在你的耳朵里已经是很简单的,根本不需要重复,你要练习的只是特别难的那些长句,记不记得伦敦之行?
走之前,莫尼卡的那一口气说完的长句子,呵呵,那就是最高境界,你可以脱口而出,和她一样快,一样不喘气,后面的你就不用跟了,你可以出师了~~~
但是,这是3季以后的事了,3季不过,一切免谈~
而且有一项工作是必须作的,是贯穿10季的工作,那就是笔记!
除非你的牛人,不过牛人也就不来看我这个帖子了,呵呵
笔记很重要,里面会有生词,特别是“该死的ROSS”,他在里面经常不出好词,你就查吧,
再就是俚语,很多俚语这才是地道的美语,你只有作了笔记你才有积累,最重要的是多有成就干啊,看到那么多的笔记,我的笔记可以从地板摞到写字台那么高,因为我字特别大?
不是!
是我做得很细!
细到从头看IS的用法,把它当作一个事业来做,当作一个重整英语的契机,好好的梳理一下自己的存货。
说实话,这也很痛苦的~看肥皂剧是很开心的,可是学肥皂剧就没那么开心了
最后,就是坚持的动力了,我不知道别人是为什么,要学好英语,但是你的动力要足,而且经常要受受刺激,否则的话很容易坚持不下来。
并发处理
发布时间:
2008年12月25日 作者:
olivertan
阅读次数:
482次 类别:
学习 永久链接 Trackback
一并发处理
数据库的特点就是数据的集中管理和共享。
在通常情况下总是有
若干个事务并发地运行,这些并行的事务可能并发地存取相同的数据。
因此,数据库管理系统的一个重要任务就是要有一种机制去保证这种
并发的存取和修改不破坏数据的完整性,确保这些事务能正确地运行
并取得正确的结果。
我们知道,事务并发执行时若不加控制的话将导致不正确的结果
和数据库的不一致状态。
为保证数据库数据正确地反映所有事务的更
新以及在一事务修改数据时其它事务不同时修改这个数据,数据库系
统用锁来控制对数据的并发存取。
二ORACLE的并发处理机制
无需任何说明,ORACLE自动提供行级锁,它允许用户在没有冲突
的情况下更新表中不同的行。
行级锁对联机事务处理非常有用。
1ORACLE锁的类型
在正常情况下,ORACLE会自动锁住需要加锁的资源以保护数据,
这种锁是隐含的,叫隐含锁。
然而,在一些条件下,这些自动的锁在
实际应用时并不能满足需要,必须人工加一些锁。
这些人工加的锁叫
显示锁。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Word 文档 格式 doc 转为 mht