You are on page 1of 33

Java Microsoft Office

:Java

Java Visual
BasicDelphi Java
Java
Java Java ?
Java (
)
Java Windows Registry Java
Microsoft WORD Java

JNI(Java Native Interface)

Java Windows Registry


(adapter) Java Windows
Registry Win32 API :
Java(Java)

Windows Registry

(Java)

JNI

(C++) Win32 API

Java Microsoft WORD

? : WORD WORD
WORD ? OLE
Automation :

Java(Java) WORD
------------------
------------------
------------------
------------------
------------------
------------------
(Java)

JNI

WORD Container
(C++)
Component
OLE
Automation

Java Microsoft
Office
Design Pattern

:
:
Microsoft Office
Microsoft WORD
(:Borland C++Builder Quick Report)
Microsoft WORD
:

Java :
String context[] = { "test: SCJP" , "company:" , "user:" } ;
Java
@test SCJP
@company
@user:
@:
(escape character)
C++ OLE Automation
Java JNI

:
1. Java
2. C++
3. Visual Basic for Application(VBA)

JNI(Java Native Interface)


Java C++
JNI

Java JNIJava

Java
Java


Java (JRE) Java (JRE)

Java Java

Java Java
JNI Java
Java Java

Java Java
Security Manager Policy File
JNI Java
Java (
Java )
Java Security

:
Java Java
Java C++
Java :
Java(Java)

(Java)

(C++)

: Java
(void)
:
JavatoWord.java
/*************************************************************
Java2Word.java
JNI
2002 Jan by
moli@pchome.com.tw
**************************************************************/
package com.sun.edu ;
public class JavatoWord {
/*

context ==>
count = context.length
*/
public native void NativeToWord(String[] context,int count) ;
/*
Java

*/
public boolean ToWord(String[] context)
{
try
{
NativeToWord(context,context.length) ;
return true ;
}catch(Exception e)
{
return false ;
}
}

static
{
// WORD DLL(),
// Transfer.dll, DLL
System.loadLibrary("Transfer") ;
}
}
:
1. NativeToWord native
: Java

2.
JavatoWord.class (class loader)
Transfer.dll
Java

JavatoWord com.sun.edu package
com\sun\edu\
package

Java
Java(Java)

(Java)

test.java
/*********************************************************
test.java
JNI
2002 Jan by
moli@pchome.com.tw
**********************************************************/
import com.sun.edu.* ;
class test
{

//
public static void main(String args[])
{
// JNI
JavatoWord my = new JavatoWord() ;

String context[] =
{ "test: SCJP" , "company:" , "user:" } ;

//
if(my.ToWord(context))
{
System.out.println("") ;
}else
{
System.out.println(",") ;
}
}//end of main
}//end of class

C/C++
:
javah -classpath . com.sun.edu.JavatoWord

javah.exe
com_sun_edu_JavatoWord.h C++:
com_sun_edu_JavatoWord.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_sun_edu_JavatoWord */
#ifndef _Included_com_sun_edu_JavatoWord
#define _Included_com_sun_edu_JavatoWord
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_sun_edu_JavatoWord
* Method: NativeToWord
* Signature: ([Ljava/lang/String;I)V
*/
JNIEXPORT void JNICALL Java_com_sun_edu_JavatoWord_NativeToWord
(JNIEnv *, jobject, jobjectArray, jint);

#ifdef __cplusplus
}
#endif
#endif

Borland C++Builder:
DLL Wizard OK

OK

Save All :

Transfer:
Transfer Transfer.cpp:

Transfer.bpr:
Project | Options :

Project Options Directories and Conditionals


JNI
<jdk >\include <jdk >\include\win32:

(: JDK d:\jdk1.3.1 JDK


)

com_sun_edu_JavatoWord.h
:

Transfer.cpp :
Transfer.cpp
#include <vcl.h>
#include <windows.h>
#include "com_sun_edu_JavatoWord.h"
#pragma hdrstop

#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}

JNIEXPORT void JNICALL Java_com_sun_edu_JavatoWord_NativeToWord


(JNIEnv *env, jobject obj, jobjectArray context, jint count)
{
//
TOpenDialog* templatefile = new TOpenDialog(NULL) ;
templatefile->Title = "" ;
templatefile->Filter = "Word files (*.doc)|*.doc" ;
AnsiString filename ;
if(templatefile->Execute())
{
filename = templatefile->FileName ;
}
//
if(!FileExists(filename))
{
ShowMessage(",") ;
delete templatefile ;
return ;
}
delete templatefile ;
ShowMessage("" + filename) ;
}
Project | Make Transfer
(.dll ) DOS :
java cp . Djava.library.path=.\Transfer test
:

DOS :

Java C++
:
Transfer.cpp
#include <vcl.h>
#include <windows.h>
#include <iostream.h>
#include "com_sun_edu_JavatoWord.h"
#pragma hdrstop

#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}

JNIEXPORT void JNICALL Java_com_sun_edu_JavatoWord_NativeToWord


(JNIEnv *env, jobject obj, jobjectArray context, jint count)
{
//
TOpenDialog* templatefile = new TOpenDialog(NULL) ;
templatefile->Title = "" ;
templatefile->Filter = "Word files (*.doc)|*.doc" ;
AnsiString filename ;
if(templatefile->Execute())
{
filename = templatefile->FileName ;
}
//
if(!FileExists(filename))
{
ShowMessage(",") ;
delete templatefile ;
return ;
}
delete templatefile ;
ShowMessage("" + filename) ;

cout << " " << count << " " << endl;
for(int i = 0 ; i < count ; i++)
{
// context
jstring jsdata =
(jstring)(*env).GetObjectArrayElement(context,i) ;
wchar_t* csdata =
(wchar_t*)(*env).GetStringChars(jsdata,NULL) ;
int size = (*env).GetStringLength(jsdata) ;
WideString wtmp = WideString(csdata,size) ;
ShowMessage(wtmp) ;
}
}
Project | Make Transfer
(.dll ) DOS :
java cp . Djava.library.path=.\Transfer test
:

()
DOS :

Java C++

: Visual Basic for

Application
Java C++ C++
VBA(Visual Basic for Application Microsoft Office
) OLE AutomationVBA
? :
1.
WORD :
2.
Microsoft WORD ||

:

test :
Microsoft WORD
VBA
Microsoft WORD |

/:
/:

Microsoft WORD ||

:

3.
Microsoft WORD ||:

test :
VBA :
test VBA
Sub test()
'
' test
' 2001/12/28 moli
'
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "@company"
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchByte = True
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
End Sub
WORD VBA
:
test1 VBA
Sub test1()
'
' test1
' 2001/12/28 moli
'
ChangeFileOpenDirectory "E:\Java2Word\"
Documents.Open FileName:="test.doc", ConfirmConversions:=False, ReadOnly:= _
False, AddToRecentFiles:=False, PasswordDocument:="", PasswordTemplate:= _
"", Revert:=False, WritePasswordDocument:="", WritePasswordTemplate:="", _
Format:=wdOpenFormatAuto
End Sub
C++

:

C++ Builder Transfer.bpr
Transfer.cpp :
:
COM (OLE Automation )
:OleServer.hpputilcls.hcomobj.hpp
Microsoft WORD 2000
vcl\word_2k.h( C++Builder Office
Transfer.cpp
C++Builder
Professional Enterprise ) Transfer.cpp :
Transfer.cpp
#include <vcl.h>
#include <OleServer.hpp>
#include <windows.h>
#include "com_sun_edu_JavatoWord.h"
#include <utilcls.h>
#include <comobj.hpp>
#include <iostream.h>
#include <vcl\word_2k.h>
#pragma hdrstop

#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}

JNIEXPORT void JNICALL Java_com_sun_edu_JavatoWord_NativeToWord


(JNIEnv *env, jobject obj, jobjectArray context, jint count)
{
......
}

: COM API
COM CoInitialize(NULL)
CoUninitialize():
Transfer.cpp

......

JNIEXPORT void JNICALL Java_com_sun_edu_JavatoWord_NativeToWord


(JNIEnv *env, jobject obj, jobjectArray context, jint count)
{
//
TOpenDialog* templatefile = new TOpenDialog(NULL) ;
templatefile->Title = "" ;
templatefile->Filter = "Word files (*.doc)|*.doc" ;
AnsiString filename ;
if(templatefile->Execute())
{
filename = templatefile->FileName ;
}
//
if(!FileExists(filename))
{
ShowMessage(",") ;
delete templatefile ;
return ;
}
delete templatefile ;

CoInitialize(NULL) ;
try
{

}catch(Exception& e)
{
ShowMessage(e.Message) ;
CoUninitialize() ;
return ;
}
CoUninitialize() ;
}

: WORD WORD
test1 WORD
WORD :

Documents Open
Transfer.cpp :
Transfer.cpp

......

JNIEXPORT void JNICALL Java_com_sun_edu_JavatoWord_NativeToWord


(JNIEnv *env, jobject obj, jobjectArray context, jint count)
{
//
TOpenDialog* templatefile = new TOpenDialog(NULL) ;
templatefile->Title = "" ;
templatefile->Filter = "Word files (*.doc)|*.doc" ;
AnsiString filename ;
if(templatefile->Execute())
{
filename = templatefile->FileName ;
}
//
if(!FileExists(filename))
{
ShowMessage(",") ;
delete templatefile ;
return ;
}
delete templatefile ;

CoInitialize(NULL) ;
try
{
Variant Wordobj ;
Variant Docsobj ;
// Word
Wordobj = CreateOleObject("Word.Application") ;
cout << " Word " <<endl ;
Wordobj.OlePropertySet("Visible",true) ;

// user
Docsobj = Wordobj.OlePropertyGet("Documents") ;
Docsobj.OleFunction("Open",filename) ;
}catch(Exception& e)
{
ShowMessage(e.Message) ;
CoUninitialize() ;
return ;
}
CoUninitialize() ;

}
Project | Make Transfer
(.dll ) DOS :
java cp . Djava.library.path=.\Transfer test

WORD
Word.Application
Microsoft WORD C/C++ OLE
Automation WORD
Microsoft EXCEL Excel.Application
Word.Application WORD
OlePropertySet
Application ( Application
Word.Application) Visible true Visible WORD
Visual Basic :

( Microsoft WORD Visual Basic Microsoft )


test1 Documents
Open Microsoft WORD
Documents Application
( Microsoft WORD Visual Basic Microsoft )
Application Documents
Open Open
Microsoft WORD Visual Basic
:
test WORD
:
Selection Application
:

( Microsoft WORD Visual Basic Microsoft )


Microsoft WORD Visual Basic
Selection Selection
Find Find ClearFormatting Execute
Find Find
Replacement ClearFormatting
:
Transfer.cpp

......

JNIEXPORT void JNICALL Java_com_sun_edu_JavatoWord_NativeToWord


(JNIEnv *env, jobject obj, jobjectArray context, jint count)
{
//
TOpenDialog* templatefile = new TOpenDialog(NULL) ;
templatefile->Title = "" ;
templatefile->Filter = "Word files (*.doc)|*.doc" ;
AnsiString filename ;
if(templatefile->Execute())
{
filename = templatefile->FileName ;
}
//
if(!FileExists(filename))
{
ShowMessage(",") ;
delete templatefile ;
return ;
}
delete templatefile ;
CoInitialize(NULL) ;
try
{
Variant Wordobj ;
Variant Docsobj ;
// Word
Wordobj = CreateOleObject("Word.Application") ;
cout << " Word " <<endl ;
Wordobj.OlePropertySet("Visible",true) ;
// user
Docsobj = Wordobj.OlePropertyGet("Documents") ;
Docsobj.OleFunction("Open",filename) ;

Variant ActDoc ;
Variant Selection ;
Variant Find ;
Variant Replacement ;
// document
ActDoc = Wordobj.OlePropertyGet("ActiveDocument") ;
// Selection.Find.Replacement
Selection = Wordobj.OlePropertyGet("Selection") ;
Find = Selection.OlePropertyGet("Find") ;
Replacement = Find.OlePropertyGet("Replacement") ;
// Java ,
for(int i = 0 ; i < count ; i++)
{
// context
jstring jsdata =
(jstring)(*env).GetObjectArrayElement(context,i) ;
wchar_t* csdata =
(wchar_t*)(*env).GetStringChars(jsdata,NULL) ;
int size = (*env).GetStringLength(jsdata) ;
WideString wtmp = WideString(csdata,size) ;
int start = wtmp.Pos(":") ;
WideString text = wtmp.SubString(1,start-1) ;
text = "@" + text ;
WideString rtext =
wtmp.SubString(start+1,wtmp.Length() - start) ;

//
Find.OleFunction("ClearFormatting") ;
Replacement.OleFunction("ClearFormatting") ;
Find.OleFunction("Execute",text,true,false,false,
false,false,true,wdFindContinue,false,rtext,wdReplaceAll) ;
}
}catch(Exception& e)
{
ShowMessage(e.Message) ;
CoUninitialize() ;
return ;
}
CoUninitialize() ;
}
Project | Make Transfer
(.dll ) DOS :
java cp . Djava.library.path=.\Transfer test

Microsoft Office
Microsoft Office
Microsoft Office
Excel
JNI Java

Microsoft Office
( Microsoft Office Microsoft Visio
Microsoft Internet Explorer AutoCAD VBA
)

Java Native Interface

Java BCB 4.0 CPU


:
(: http://www.javatwo.net/experts/moli/publish/article/TC/
BCB_CPU_Detector.htm)
NO.8 1999 11~12
Essential Jni : Java Native Interface
: Rob Gordon, Robert Gordon, Alan McClellan
http://www.amazon.com/exec/obidos/ASIN/0136798950/o/
qid=990362161/sr=8-1/ref=aps_sr_b_1_1/002-7278315-6856028
The Java Native Interface : Programmer's Guide and Specification
: Sheng Liang

http://www.amazon.com/exec/obidos/ASIN/0201325772/o/
qid=990362161/sr=8-2/ref=aps_sr_b_1_2/002-7278315-6856028

You might also like