環境:win7+vs2010+office2010/2013
添加所有的接口,可以作為一個文件夾,以后再使用只要加入該文件夾就可以了。
由于函數命名沖突,需要在生成的頭文件中做相應處理,即:
//#import "C:\\Program Files\\Microsoft Office\\Office14\\MSWORD.OLB" no_namespace
#import "C:\\Program Files\\Microsoft Office\\Office14\\MSWORD.OLB" no_namespace\
raw_interfaces_only \
rename("FindText", "_FindText") \
rename("Rectangle", "_Rectangle") \
rename("ExitWindows", "_ExitWindows")
對于不同版本的office,其默認的類型庫位置如下表所示:
Office 版本 | 路徑 |
Office 2003 | C:\Program Files\Microsoft Office\Office11 |
Office 2007 | C:\Program Files\Microsoft Office\Office12 |
Office 2010 | C:\Program Files\Microsoft Office\Office14 |
Office 2013 | C:\Program Files\Microsoft Office\Office15 |
特別的,word2013在vc2010下必須手動指定類型庫文件位置。
3、在stdafx中添加調用的頭文件
#include "Word2010/CApplication.h" // word程序對象
#include "Word2010/CDocuments.h" // 文檔集對象
#include "Word2010/CDocument0.h" // 單個docx對象
#include "Word2010/CSelection.h" // 該對象代表窗口或窗格中的當前所選內容,使用率最高
#include "Word2010/CCell.h" // 表格單元格
#include "Word2010/CCells.h" // 表格單元格集合
#include "Word2010/CRange.h" // 該對象代表文檔中的一個連續范圍
#include "Word2010/CTable0.h" // 單個表格
#include "Word2010/CTables0.h" // 表格集合
#include "Word2010/CFont0.h" // 字體
#include "Word2010/CParagraphs.h" // 段落集合
#include "Word2010/CParagraphFormat.h" // 段落樣式
#include "Word2010/CParagraph.h" // 單個段落
#include "Word2010/CnlineShape.h" // Inline圖形對象集合
#include "Word2010/CnlineShapes.h" // 單個Inline圖像對象
#include "Word2010/CRow.h" // 單個行
#include "Word2010/CRows.h" // 行集合
#include "Word2010/CFields.h"
#include "Word2010/CPane0.h" // 頁眉等設置
#include "Word2010/CWindow0.h"// 頁眉等設置
#include "Word2010/CView0.h"// 頁眉等設置
#include "Word2010/CPageSetup.h" // 頁面設置
4、注銷每個引入的頭文件的import行
//#import "C:\\Program Files\\Microsoft Office\\Office14\\MSWORD.OLB" no_namespace
不過如果使用wdMove等參數的話,只需要在CApplication.h文件中改為:
//#import "C:\\Program Files\\Microsoft Office\\Office14\\MSWORD.OLB" no_namespace
#import "C:\\Program Files\\Microsoft Office\\Office14\\MSWORD.OLB" no_namespace\
raw_interfaces_only \
rename("FindText", "_FindText") \
rename("Rectangle", "_Rectangle") \
rename("ExitWindows", "_ExitWindows")
否則,如果沒有上面一段,則報錯提示為(即全部頭文件都注銷import的情況下):
但是上述的方法會帶來一個問題,就是當word版本改變時會出現問題,解決辦法就是上述報錯的變量都用其數值代替就不會有問題了(寫代碼時可以加上用以查看wdMove等變量的值),如下面一些:
wdAlignParagraphLeft = 0
wdAlignParagraphCenter = 1
wdAlignParagraphRight = 2
wdAlignParagraphJustify = 3
wdParagraph = 4
wdMove = 0
wdStyleHeading1 = -2
wdStory = 6
頁面縱向wdOrientPortrait=0
頁面橫向wdOrientLandscape=1
enum WdUnits
{
wdCharacter = 1, // 字母
wdWord = 2, // 單詞
wdSentence = 3, // 句子
wdParagraph = 4, // 段落
wdLine = 5, // 行
wdStory = 6, // 所選區域
wdScreen = 7, // 當前屏幕
wdSection = 8, // 部分
wdColumn = 9, // 列
wdRow = 10, // 行
wdWindow = 11, // 窗口
wdCell = 12, // 單元格
wdCharacterFormatting = 13, // 字體格式
wdParagraphFormatting = 14, // 段落格式
wdTable = 15, // 表格
wdItem = 16 // 項目
};
具體可以參考手冊或者通過VBA代碼查看。
5、到CXXXApp.cpp文件中找到InitInstance函數
添加代碼:
// 例如修改為公司或組織名
SetRegistryKey(_T("應用程序向導生成的本地應用程序"));
if ( !AfxOleInit() )
{
AfxMessageBox(_T("無法初始化COM的動態鏈接庫!"));
return FALSE;
}
這一步可以通過在創建MFC工程時,勾選“自動化”。
6、具體代碼
添加按鈕,在按鈕中實現:
void CVCForWordDlg::OnBnClickedButton1() { // TODO: 在此添加控件通知處理程序代碼 COleVariant covZero((short)0), covTrue((short)TRUE), covFalse((short)FALSE), covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR), covDocxType((short)0);
// 定義word變量 CApplication wordApp; // wordApp CDocuments docxs; // docxs CDocument0 docx, docx_active; // docx if ( !wordApp.CreateDispatch(_T("Word.Application")) ) // 實例化wordApp,必須有初始化 { AfxMessageBox(_T("本機沒有安裝word產品!")); return; } else { wordApp.put_Visible(FALSE); // 設置文檔開始不可見
CString wordVersion = wordApp.get_Version(); // 獲得當前word的版本,比如word2010為14.0,2013為15.0
// ****************** 添加一個document ****************** // 得到docxs docxs = wordApp.get_Documents(); // 或者下面一段 // ===================================== //LPDISPATCH disp = wordApp.get_Documents(); //if ( NULL == disp ) // return;// FALSE; //docxs.AttachDispatch(disp); //if ( NULL == docxs.m_lpDispatch ) // return;// FALSE; // =====================================
// 添加一個docx docx = docxs.Add(covOptional, covOptional, covOptional, covOptional); // 未用模板時,或者下面段兩種 // ===================================== // 2,未用模板 //docx.AttachDispatch(docxs.Add(covOptional, covOptional, covOptional, covOptional)); // 3,使用模板 //CComVariant tpl(_T("")), Visble, DocxType(0), NewTemplate(false); //docx = docxs.Add(&tpl,&NewTemplate,&DocxType,&Visble); // ===================================== if ( NULL == docx.m_lpDispatch ) return;
// ****************** 設置頁邊距 ****************** // 放在創建文檔后,需要CPageSetup.h docx_active = wordApp.get_ActiveDocument(); CPageSetup oPageSetup = docx_active.get_PageSetup(); // 設置為頁面方向和頁邊距 if ( oPageSetup.get_Orientation() == 0 ) // 若為縱向則設置為橫向,縱向wdOrientPortrait=0,橫向wdOrientLandscape=1 { oPageSetup.put_Orientation(1); // 橫向 // 設置上下左右變距,單位緹,以下參數設置的頁邊距是“適中” oPageSetup.put_TopMargin( (float) 72); // 適中時72=2.54cm,默認時90=3.17cm;10≈0.35cm oPageSetup.put_BottomMargin( (float) 72); // 適中時72=2.54cm,默認時90=3.17cm;10≈0.35cm oPageSetup.put_LeftMargin( (float) 54); // 適中時54=1.9cm,默認時72=2.54cm oPageSetup.put_RightMargin( (float) 54); // 適中時54=1.9cm,默認時72=2.54cm } //else // 設置為縱向 //{ // oPageSetup.put_Orientation(0); // // 設置上下左右變距,單位緹,以下參數設置的頁邊距是“適中” // oPageSetup.put_TopMargin( (float) 72); // 適中時72=2.54cm,默認或普通時72=2.54cm;10≈0.35cm // oPageSetup.put_BottomMargin( (float) 72); // 適中時72=2.54cm,默認或普通時72=2.54cm;10≈0.35cm // oPageSetup.put_LeftMargin( (float) 54); // 適中時54=1.9cm,默認或普通時90=3.17cm // oPageSetup.put_RightMargin( (float) 54); // 適中時54=1.9cm,默認或普通時90=3.17cm //}
// 聲明一個CSelection對象,并實例化 CSelection wordSelection = wordApp.get_Selection();
// ****************** 設置文檔內容 ****************** wordSelection.TypeText(_T("虛擬試驗仿真報表")); wordSelection.HomeKey(COleVariant((short)5), COleVariant((short)1)); // wdLine=5,返回當前行首,并選擇當前行 wordSelection.put_Style( COleVariant((short)-2) );// 設置為“標題1“樣式,wdStyleHeading1=-2 // 設置選擇區域字體,一定要放在樣式后,否則格式會被樣式的覆蓋 CFont0 font = wordSelection.get_Font(); font.put_Name(_T("微軟雅黑")); font.put_Size(16); // 必須選擇該行才可以修改,即必須有HomeKey那行 // 獲得當前段落,并設置對齊方式 CParagraph lastPara = GetCurParagraph(docx); lastPara.put_Alignment(1); // wdAlignParagraphLeft=0, wdAlignParagraphCenter=1,wdAlignParagraphRight=2 // 結束當前段落編輯,移動光標到段落后 wordSelection.EndOf(COleVariant((short)4), COleVariant((short)0)); // wdParagraph=4,wdMove=0
wordSelection.TypeParagraph(); // 新起一段 COleVariant covTime(_T("yyyy-MM-dd:dddd")); // 時間格式可調整 wordSelection.InsertDateTime(covTime, covFalse, covOptional, covOptional, covOptional); // 插入當前時間 wordSelection.EndOf(COleVariant((short)4), COleVariant((short)0)); //結束當前段落編輯,wdParagraph=4,wdMove=0
// 生成表格 MakeRTITable( docx, wordSelection );
// 以下為為不同段落設置不同字體和對齊方式示例 wordSelection.TypeParagraph(); // 新起一段 wordSelection.TypeText(_T("end of the story!")); wordSelection.HomeKey(COleVariant((short)5), COleVariant((short)1)); // wdLine=5,返回當前行首,并選擇當前行 /*CFont0 */font = wordSelection.get_Font(); font.put_Size(20); // 必須選擇該行才可以修改,即必須有HomeKey那行 /*CParagraph */lastPara = GetCurParagraph(docx); lastPara.put_Alignment(3); // 右對齊 wordSelection.EndOf(COleVariant((short)4), COleVariant((short)0)); //結束當前段落編輯,wdParagraph=4,wdMove=0
wordSelection.TypeParagraph(); // 新起一段 wordSelection.TypeText(_T("Thanks for reading!")); wordSelection.HomeKey(COleVariant((short)5), COleVariant((short)1)); // wdLine=5,返回當前行首,并選擇當前行 /*CFont0 */font = wordSelection.get_Font(); font.put_Size(10); // 必須選擇該行才可以修改,即必須有HomeKey那行 font.put_Name(_T("Times New Roman")); /*CParagraph */lastPara = GetCurParagraph(docx); lastPara.put_Alignment(1); // 居中對齊 wordSelection.EndOf(COleVariant((short)4), COleVariant((short)0)); //結束當前段落編輯,wdParagraph=4,wdMove=0
// 插入分頁符,用于換頁 wordSelection.InsertBreak(covOptional);
// 插入公式,操作域 CFields fields = wordSelection.get_Fields(); COleVariant ofont = _variant_t(_T("Times New Roman")); COleVariant text = _variant_t(_T("EQ \\a \\ar \\co2 \\vs3 \\hs3(Axy,Bxy,A,B)")); // 注意要兩個\\,一個轉義后不對!!! fields.Add( wordSelection.get_Range(), covOptional, text, covFalse ); wordSelection.HomeKey(COleVariant((short)5), COleVariant((short)1)); // wdLine=5,返回當前行首,并選擇當前行 lastPara = GetCurParagraph(docx); lastPara.put_Alignment(0); // 左對齊 wordSelection.EndOf(COleVariant((short)4), COleVariant((short)0)); //結束當前段落編輯,wdParagraph=4,wdMove=0
// 獲取應用當前Debug路徑 char fileName[MAX_PATH]; GetModuleFileName(NULL, fileName, MAX_PATH); char dir[260]; char dirver[100]; _splitpath(fileName, dirver, dir, NULL, NULL); CString strAppPath = dirver; strAppPath += dir; //CString strAppPath = _T("D:\\");
// ****************** 插入圖片示例 ****************** // 需要CWindow0.h, CPane0.h, CView0.h wordSelection.TypeParagraph(); // 另起一段 CString strPicture = strAppPath + _T("\\截圖.jpg"); CnlineShapes nLineShapes = wordSelection.get_InlineShapes(); CnlineShape nLineshape = nLineShapes.AddPicture(strPicture, covFalse, covTrue, covOptional);
// ****************** 設置頁眉頁腳 ****************** CWindow0 oWind = docx.get_ActiveWindow(); CPane0 oPane = oWind.get_ActivePane(); // 一定將CPane改為CPane0或其他 CView0 oView = oPane.get_View(); // =============== 設置頁眉 =============== oView.put_SeekView(9); // wdSeekCurrentPageHeader=9 /*CFont0 */font = wordSelection.get_Font(); // 設置選擇區域字體 font.put_Name(_T("華文楷體")); font.put_Size(16); /*CParagraphFormat */lastPara = wordSelection.get_ParagraphFormat(); // 默認為居中 lastPara.put_Alignment(1); // wdAlignParagraphLeft=0, wdAlignParagraphCenter=1, wdAlignParagraphRight=2 wordSelection.TypeText(_T("網絡大學"));
// =============== 設置頁腳,包括頁碼 =============== oView.put_SeekView(10); // wdSeekCurrentPageFooter=10 /*CFont0 */font = wordSelection.get_Font(); // 設置選擇區域字體,一定要放在樣式后,否則格式會被樣式的覆蓋 font.put_Name(_T("華文楷體")); font.put_Size(16); /*CParagraphFormat */lastPara = wordSelection.get_ParagraphFormat(); // 默認為居中 lastPara.put_Alignment(1); // wdAlignParagraphLeft=0, wdAlignParagraphCenter=1, wdAlignParagraphRight=2 // 添加頁碼 wordSelection.TypeText(_T("第頁 共頁")); wordSelection.MoveLeft( COleVariant((short)1), COleVariant((short)4), &covZero ); /*CFields */fields = wordSelection.get_Fields(); fields.Add( wordSelection.get_Range(), COleVariant((short)33), COleVariant("PAGE "), &covTrue ); // 增加頁碼域,當前頁碼 wordSelection.MoveRight( COleVariant((short)1), COleVariant((short)3), &covZero); fields.Add( wordSelection.get_Range(), COleVariant((short)26), COleVariant("NUMPAGES "), &covTrue ); // 增加頁碼域,總頁數 oView.put_SeekView(0); // 關閉頁眉頁腳,wdSeekMainDocument=0,回到主控文檔
// Word程序可見,顯示報表 //wordApp.put_Visible(TRUE);
// 保存成果 CString strSavePath = strAppPath; strSavePath += _T("\\報表.docx"); docx.SaveAs(COleVariant(strSavePath), covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional,covOptional);
// 退出word應用 docx.Close(covFalse, covOptional, covOptional); wordApp.Quit(covOptional, covOptional, covOptional); wordApp.ReleaseDispatch();
MessageBox(_T("生成成功!")); } } |
表格插入函數MakeRTITable(CDocument0& oDoc, CSelection& selection):
void CVCForWordDlg::MakeRTITable(CDocument0& oDoc, CSelection& selection) { int nRowSize = 10; nRowSize = nRowSize == 0 ? 2 : nRowSize; // 表格至少兩行 // new paragraph selection.TypeParagraph(); // 新起一段
// Add table title selection.TypeParagraph(); // 新起一段 selection.TypeText(RTITableTitle); CParagraph lastPara = GetCurParagraph(oDoc); //lastPara.put_Alignment(wdAlignParagraphCenter); // 下面表格內容也受此控制 //selection.EndOf(COleVariant((short)wdParagraph), COleVariant((short)wdMove)); lastPara.put_Alignment(1); // 下面表格內容也受此控制 selection.EndOf(COleVariant((short)4), COleVariant((short)0));
// Add table CTables0 wordTables = oDoc.get_Tables(); CRange wordRange = selection.get_Range(); COleVariant covTrue((short)TRUE), covFalse((short)FALSE), covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR); CTable0 wordTable = wordTables.Add(wordRange, nRowSize , RTITableColumnSize, covTrue, covFalse); // 添加表格 wordRange = wordTable.get_Range();
// Make header CCell cell; for ( int i=1; i<RTITableColumnSize+1; i++ ) { cell = wordTable.Cell(1, i); // 表格第一行第i列單元格 cell.Select(); selection.TypeText(RTITableFieldArray[i-1]); } //selection.EndOf(COleVariant((short)wdStory), COleVariant((short)wdMove)); // 結束表格編輯 selection.EndOf(COleVariant((short)6), COleVariant((short)0)); // 結束表格編輯
for ( int i=1; i<RTITableColumnSize+1; i++ ) { cell = wordTable.Cell(2, i); // 表格第一行第i列單元格 cell.Select(); selection.TypeText(_T("111.0")); } //selection.EndOf(COleVariant((short)wdStory), COleVariant((short)wdMove)); // 結束表格編輯 selection.EndOf(COleVariant((short)6), COleVariant((short)0)); // 結束表格編輯
// 合并單元格,需要注意的是,合并整行前不能有單元格的合并,否則無法獲取表格的行信息 CRows rows; rows = wordTable.get_Rows(); // 獲取表格的行 CRow row; row = rows.Item(3); // 指向第三行 wordRange = row.get_Range(); CCells cells; cells = wordRange.get_Cells(); // 得到該行所有單元格 cells.Merge(); // 合并第三行為一列 cell = wordTable.Cell( 4, 1 ); cell.Merge( wordTable.Cell( 5, 1 ) ); //合并第一列中的第四行與第五行
// 光標的移動方式.通過Selection類對象的方法對光標進行上下,左右等移動,實現對光標的定位功能 selection.MoveRight( COleVariant((short)1), COleVariant((short)1), COleVariant((short)0) ); // 向右移動鼠標到下一個字符 selection.MoveDown( COleVariant((short)5), covOptional, covOptional ); // 向下移動鼠標到下一行 COleVariant vUnit((short)RTITableColumnSize); // 光標移動方式為行 COleVariant vCount((short)3); selection.Move( &vUnit, &vCount ); // 移動3行 cells.Merge(); // 合并第三行為一列 COleVariant vEnd((short)5); selection.EndKey( &vEnd, &covOptional ); // 將光標移動到行尾 } |
自定義函數GetCurParagraph(CDocument0& curDoc):
CParagraph CVCForWordDlg::GetCurParagraph(CDocument0& curDoc) { CParagraphs paragraphs = curDoc.get_Paragraphs(); CParagraph lastPara = paragraphs.get_Last(); return lastPara; } |
7、生成文檔結果
8、說明
(1)關于設置頁邊距時的參數說明
以緹為單位,一個與屏幕無關的單位,用來保證屏幕應用程序對屏幕元素的定位和比例在所有的顯示系統上的一致性。一緹等價于 1/20 個打印機的磅。一邏輯英寸大約有 1440 緹,一邏輯厘米約 567 緹(打印時的一英寸或一厘米所對應的屏幕上的長度)。
但實際word文檔中顯示和打印效果來看,56.7緹=2cm,10緹=0.35cm。
(2)加載CPane.h文件前,將CPane改為CPane0,否則會出現重定義,還有一個afxpane.h中有CPane類
(3)生成的word文檔,如果頁碼顯示和公式顯示為代碼形式,一個可以直接全選右鍵“切換域代碼”,對于頁碼則選中頁腳同樣操作即可;另一個可以設置word文檔的格式,在文件——選項——高級中去掉“顯示域代碼而非域值”前面的勾即可。
(4)設置頁邊距和頁面方向的時候,還是在創建文檔后設置,否則在后面設置時可以會有一些問題。
(5)通過域代碼來寫簡單公式,域代碼格式可以參考網頁:
http://blog.sina.com.cn/s/blog_6967a9d30100mrbx.html
其他相關內容,百度或谷歌,網上挺多的。
244.56 KB, 下載次數: 3, 下載積分: 黑幣 -5
歡迎光臨 (http://m.zg4o1577.cn/bbs/) | Powered by Discuz! X3.1 |