久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4465|回復: 0
打印 上一主題 下一主題
收起左側

VC2010操作Word2010詳細資料

[復制鏈接]
跳轉到指定樓層
樓主
ID:397085 發表于 2018-9-12 16:39 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

環境:win7+vs2010+office2010/2013

  • 創建MFC工程,非Unicode
  • 添加Word的類庫

添加所有的接口,可以作為一個文件夾,以后再使用只要加入該文件夾就可以了。

由于函數命名沖突,需要在生成的頭文件中做相應處理,即:

//#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

其他相關內容,百度或谷歌,網上挺多的。

VC 2010操作Word2010.docx

244.56 KB, 下載次數: 3, 下載積分: 黑幣 -5

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品福利在线 | 亚洲一区二区欧美 | 三级黄视频在线观看 | 中文精品久久 | 女女百合av大片一区二区三区九县 | 日韩av免费在线观看 | 久久精品日产第一区二区三区 | 男人av在线播放 | 国产精品成人品 | 中文字幕精品一区二区三区精品 | 国产在线观看一区二区 | 日韩av手机在线观看 | 日本久久综合 | 一本大道久久a久久精二百 国产成人免费在线 | 精品久久久久久一区二区 | 久久午夜精品福利一区二区 | 日韩精品一区二区三区 | 91色在线视频 | 欧美在线观看一区 | 天天干天天玩天天操 | 中文字幕在线中文 | 精品国产乱码久久久久久闺蜜 | 精品亚洲国产成av人片传媒 | 国产成人精品一区二区三区网站观看 | 色吧综合 | 一区二区三区在线免费 | www.av在线| 成人免费一区二区三区视频网站 | 国产精品揄拍一区二区 | 99热国产精品| 亚洲午夜电影 | 久久亚洲国产精品 | 99中文字幕 | 欧美成人a∨高清免费观看 欧美日韩中 | 国产精品一区久久久 | 久久精品99 | 在线看成人av | 精品日韩一区二区 | 午夜精品久久久久久久星辰影院 | 成人免费视频在线观看 | 成人免费在线小视频 |