instruct Word and Excel to open and close documents
- Open Word document
$file:=Folder(fk resources folder).file("テスト.docx")
$params:=New object
$params.app:="word"
$params.path:=$file.platformPath //if omitted, save in temporary folder (mac)
$params.command:="open"
$status:=office automation ($params)
- Save and close Word document
$file:=Folder(fk resources folder).file("テスト.docx")
$params:=New object
$params.app:="word"
$params.command:="close"
$params.name:=$file.name+$file.extension //specify the name, not a path
$status:=office automation ($params)
- Open Excel document
$file:=Folder(fk resources folder).file("テスト.xlsx")
$params:=New object
$params.app:="excel"
$params.path:=$file.platformPath //if omitted, save in temporary folder (mac)
$params.command:="open"
$status:=office automation ($params)
- Save and close Excel document
$file:=Folder(fk resources folder).file("テスト.xlsx")
$params:=New object
$params.app:="excel"
$params.command:="close"
$params.name:=$file.name+$file.extension //specify the name, not a path
$status:=office automation ($params)
- create header file from app
sdef Word.app > word.sdef
sdp --basename Word -fh Word.sdef Word.h
How to use a type library for Office Automation from Visual C++.NET
-
create new MFC Application project
-
add > class > MFC class from Typelib
-
from Word 16.0
- Appliction (rename:
WordAppliction
) - Document (rename:
WordDocument
)
- Appliction (rename:
-
from Excel 16.0
- Appliction (rename:
ExcelAppliction
) - Workbook (rename:
ExcelWorkbook
)
- Appliction (rename:
-
release
- additional dependencies:
uafxcw.lib;Libcmt.lib
- ignore specific default libraries:
uafxcw.lib;Libcmt.lib
- additional dependencies:
-
debug
- additional dependencies:
uafxcwd.lib;Libcmtd.lib
- ignore specific default libraries:
uafxcwd.lib;Libcmtd.lib
- additional dependencies:
-
other
uxtheme.lib;windowscodecs.lib
remove
#import "C:\\Program Files (x86)\\Microsoft Office\\Root\\Office16\\EXCEL.EXE" no_namespace
#import "C:\\Program Files (x86)\\Microsoft Office\\Root\\Office16\\MSWORD.OLB" no_namespace
remove
#include "windows.h"
On windows, CreateDispatch
creates a new dispatch. need to search for running instances first.
COleException e;
WordApplication wdApp;
bool isAvailable = false;
CLSID clsid;
CLSIDFromProgID(L"Word.Application", &clsid);
IUnknown *pUnknown;
HRESULT hr = GetActiveObject(clsid, NULL, (IUnknown**)&pUnknown);
if (SUCCEEDED(hr)) {
//there is a running instance
// Get IDispatch interface for Automation...
IDispatch *pDispatch;
hr = pUnknown->QueryInterface(IID_IDispatch, (void **)&pDispatch);
if (SUCCEEDED(hr)) {
wdApp.AttachDispatch(pDispatch, TRUE);
isAvailable = true;
}
}
else {
if (wdApp.CreateDispatch(L"Word.Application", &e)) {
isAvailable = true;
}
}
On Mac, the name of a Word document is its file name.
On Windows, it is localised serial, e.g. "文書 1". depending on the options passed to Open.
in particular, OpenAndRepair
should be False
to keep the original name and path.