VC操作Word书签模板 java操作word模板

VC操作Word书签模板

一 制作模板

1 新建一个文档,设置文档内容。对于循环的部分,建议放到表格内,这样容易定位、选择、复制、粘贴。
2 将鼠标定位到要插入书签的位置,从菜单上,“插入”->“书签”,弹出对话框,输入书签名,点击“添加”按钮。

插入以下书签:order_num,报告日期_,报表模板__,name,age,结论__
其中,报表模板__,用于定位模板表格。可有可无,没有时,默认表格1。


完成后,所有书签的名称和位置如下图所示:


3 保存模板,比如“word书签模板.doc”


二 添加word 类型库

通过类向导MFC ClassWizard,从菜单上View->ClassWizade,打开ClassWizade窗口,选择Add Class->From a typelibrary...,,浏览找到office 2003安装路径下的msword.olb文件,例如:"C:ProgramFilesMicrosoft OfficeOFFICE11MSWORD.OLB",然后选择以下类,这些类形成文件msword.h和msword.cpp,并自动加入到工程中。







其中必须的:
_Application,Documents,_Document ,Selection,
我这里用到的:
Tables,Table,Rows,Row,Columns,Column,Cells,Cell,Bookmarks,Bookmark,Range,
也可能用到的:
Borders,Border,Window,_ParagraphFormat,Shapes,
PageSetup,Shape,InlineShapes,InlineShape,Fields,View,_Font


三 为了操作简单,基于msword.h和 msword.cpp,再次封装成一个类对应wordWork.h 和wordWork.cpp,并加入到工程中。其内容附加到后面附录部分。
另外,由于多个类都有table,row等等,为了区别起见,将类放到命名空间内加以区别,方法如下:

1 头文件msword.h中将类放到命名空间内
namespace ms_word//将整体放入命名空间
{
class _Application : publicCOleDispatchDriver
{
public:
_Application(){}// Calls COleDispatchDriverdefault constructor
.....
};
class Tables : public COleDispatchDriver
{
public:
Tables() {}//Calls COleDispatchDriver default constructor
.....
};

......
}//end namespace ms_word


2 实现文件msword.cpp内引入命名空间
#include "stdafx.h"
#include "msword.h"

using namespace ms_word;//引入命名空间

LPDISPATCH _Application::GetApplication()
{
LPDISPATCH result;
InvokeHelper(0x3e8, DISPATCH_PROPERTYGET,VT_DISPATCH, (void*)&result, NULL);
return result;
}
long Tables::GetCount()
{
long result;
InvokeHelper(0x2, DISPATCH_PROPERTYGET, VT_I4,(void*)&result, NULL);
return result;
}
........

3 在使用的文件内加入头文件,
#include "msword.h"
然后类名加入限定空间,即可加以区别
ms_word::Tables m_tables;


四 编译执行
在你的函数内调用这些方法,编译运行结果如下:

五 主要的代码如下:

1 添加word 类型库 MSWORD.OLB

2 在使用的程序中,加入以下语句
#include "wordWork.h"


char ch[90];
#define say(x) AfxMessageBox(x)

===== 1 主操作代码 ===

void wordTxtBookmark(WordMain wdMain,CString BookMark="",CStringstrText="",bool addLine=false,bool mulitLine=false)
{
if ( BookMark !="" )
{
if (!wdMain.GotoBookmark(BookMark) )return;//没有书签就返回,不要写
}
if ( strText !="" )
{
if (mulitLine)
{//前提条件是,本书签上面有一空行,否则影响上面行的位置
//正序,插入多行
wdMain.MoveUp(1);//移到书签的上面一行
wdMain.EndKey();//移动到上面行的行尾
wdMain.Enter(1);//打回车,加一行,相当于把书签下移一行,以便后面查到书签时已经下移
}
wdMain.GetRange(0, 0, 0,0);//不要选择任何字符,否则会吃掉第一个字符
wdMain.SetTextHAlignment(WD_LEFT);
//wdMain.SetTableBorderLine(WD_EDGE_BOTTOM,WD_LINESTYLE_SINGLE);
wdMain.SetItemText(strText);

}
if (addLine)
{//增加一个空白行,以便与上行分开
wdMain.Enter(1);
}
}

void wordPicText(WordMain wdMain,CString strPic,CStringstrText,bool addLine=true)
{

//picture
BOOL bInsertPic;
wdMain.Enter(1);//加一行
wdMain.MoveUp(1);//再次回到上面,相当于插入一行,否则会向后错,吃掉后面的行

wdMain.SetTextHAlignment(WD_CENTER);//居中
{
bInsertPic =wdMain.InsertPicture(strPic, 404.5, 248.3);
}

//text
if (strText!="")
{
wdMain.Enter(1);
wdMain.GetRange(0, 0, 0,0);//不要选择任何字符,否则会吃掉第一个字符
wdMain.SetTextHAlignment(WD_CENTER);//居中
wdMain.SetItemText(strText);
}
//add line
if (addLine)
{//增加一个空白行,以便与上行分开
wdMain.Enter(1);
wdMain.Enter(1);///与后面的隔开

}


}

void SetNameCellValue(CString list[])
{
COleVariant covTrue((short)TRUE),covFalse((short)FALSE), covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);

WordMain wdMain;CString strGet;
MyFont wdFont;
MyPageSet wdPageSet;
CString doc_template_name,t_mc,docname;

docname.Format("c:\i22i.doc");
doc_template_name.Format("c:\ii.doc" );

wdMain.Open(doc_template_name);
wdMain.PageSet(wdPageSet);


// xlMain.SetVisible(TRUE);

//(一) 这里设置表头的项目,比如报表日期
//特别注意:为了容易起见,命名单元格的规则如下
//1.1 开头处的命名单元格,以1个下划线结束,比如,报告日期_
//1.2 中间循环命名单元格,就是正常的,与数据集的字段名一致为好
//1.3 结尾处的命名单元格,以2个下划线结束,比如,合计__
TRY
{
wordTxtBookmark(wdMain,"报告日期_","当天");

}
CATCH_ALL(e)
{

}
END_CATCH_ALL


VARIANT vtIndex;
Bookmarks bookmarks;
Bookmark bookmark;
//Range name_range;
Rows wdRows;
Row wdRow;
Columns wdCols;
Cells wdCells;
Cell wdCell;
Tables tables;
Table operTable;
Range tmpRange;
Range srcRange,desRange;
Columns columns;
//(二) 根据数据源的个数,设置重复变化的数据行组,
//1 声明与命名单元格相关的变量和数组
int min_Row = 65536, min_Col = 65536, max_Row =0;
CString min_Name = "";
bookmarks=wdMain.m_document.GetBookmarks();
int nameCellCount =bookmarks.GetCount();//wdMain.m_document.GetBookmarks();//获得命名单元格的总数
int* nameCellRow = newint[nameCellCount];//名称单元格所在的行
int* nameCellColumn = newint[nameCellCount];//名称单元格所在的列
CString * nameCellTag = newCString[nameCellCount];//某个命名单元格的常规地址 ,比如 $A$1 --> A
CString * nameCellName = newCString[nameCellCount];//某个命名单元格的自定义名称,比如 工资

CString strName ,str;
int nameCellIdx = 0;

//读取不为空的区域的信息,包括已经使用的行数、列数、起始行从1开始、起始列从1开始
long lStartRow,lStartCol, lRowNum,lColNum;

int hang_shu = lRowNum;
int lie_shu =lColNum;
int used_first_col = lStartCol;
int used_last_col = lStartCol+lColNum-1;

int row1,col1,row2;

//2 寻找所有命名的单元格,并找到行号最小者,以便在它之前插入循环行
for (int k = 0; k < nameCellCount; k++)
{
vtIndex.vt = VT_I4;
vtIndex.lVal = k+1;//注意,从1开始,不是0
bookmark=bookmarks.Item(&vtIndex);

strName=bookmark.GetName();//.GetNameLocal();
str =strName.Mid(strName.GetLength()-1,1);
if (str == "_")
{
continue;//如果第一个字符为下划线,则认为是固定命名单元格,不是命名的循环单元格
}
TRY
{

tmpRange=bookmark.GetRange();
//获得书签在表格中的行列号
wdCells=tmpRange.GetCells();
wdCell=wdCells.Item(1);

row1=wdCell.GetRowIndex();
col1=wdCell.GetColumnIndex();


nameCellColumn[nameCellIdx]= col1;
nameCellRow[nameCellIdx]= row1;
nameCellName[nameCellIdx]= strName;

nameCellTag[nameCellIdx]= " ";//strName.Mid(1,strName.Find("$",1)-1);//$A$1--> A

if (min_Row> nameCellRow[nameCellIdx])
{
min_Row= nameCellRow[nameCellIdx];//最小的行号
min_Col= nameCellColumn[nameCellIdx];
min_Name= nameCellName[nameCellIdx];

}
if (max_Row< nameCellRow[nameCellIdx]) max_Row = nameCellRow[nameCellIdx];;//最大行号
nameCellIdx++;//真实的循环的命名单元格序号
}
CATCH_ALL(e)
{

}
END_CATCH_ALL

}
nameCellCount =nameCellIdx;//实际要处理的循环的命名单元格数目
int loopRow = max_Row - min_Row + 1;//一次循环的函数

//3 也可以使用 //foreach ( Word.Bookmark bk inwh.wordDoc.Bookmarks)MessageBox.Show(bk.Name);

// 方法1 通常使用第一个表来作为模板表
tables = wdMain.m_document.GetTables();
operTable =tables.Item(1);
// 方法2 使用一个书签来标志模板表
TRY
{//使用一个特殊的标签 table_bookmark_template_
wdMain.GotoBookmark("报表模板__");//
tables=wdMain.m_selection.GetTables();
operTable =tables.Item(1);//tmpRange.Tables[1];//得到该书签所在的表,以它为报表的循环模板
}
CATCH_ALL(e)
{

}
END_CATCH_ALL


int template_start = 0;
int template_end = 0;
columns=operTable.GetColumns();
inttable_columns=columns.GetCount();//Columns.Count;//本表格的烈数

wdCell= operTable.Cell(min_Row, 1);
tmpRange = wdCell.GetRange();
template_start=tmpRange.GetStart();//循环行组的第一行,第一个单元格,到文档开头的距离


wdCell= operTable.Cell(max_Row+1,1);//Cell(max_Row, table_columns) 将少一列
tmpRange = wdCell.GetRange();
template_end=tmpRange.GetStart();//循环行组的最后行,最后一个单元格,到文档开头的距离

wdCell= operTable.Cell(1, 1);
tmpRange = wdCell.GetRange();
srcRange = tmpRange;//operTable.Cell(1,1).Range;
desRange = tmpRange;//operTable.Cell(1,1).Range;




//3 也可以使用 foreach ( Excel.Namenn inxlMain.m_application.ActiveWorkbook.Names)MessageBox.Show(nn.Name);
int iidex=0;

//4 根据数据集的实际数据行数,查找命名单元格,循环插入数据
int cur_row = min_Row;
for (int dt_row_idx = 0; dt_row_idx < 2;dt_row_idx++)//dt.Rows.Count
{//循环实际的数据行数2,修改为实际的变量

//4.1 找到行号最小的命名单元格,以它来定位
wdMain.GotoBookmark(min_Name);//
tmpRange=wdMain.m_selection.GetRange();

//4.2//插入行重复摸板行组的行,使得所有命名单元格都向后移,以便下次循环查找定位时使用
for (int j = 0; j < loopRow;j++)
{//插入需要重复循环的摸板行数loopRow
//range2=name_range.GetEntireRow();
//range2.Insert(COleVariant((long) 1),COleVariant((long)true));
}
//4.3 定位到摸板行组
wdMain.GotoBookmark(min_Name);//
tmpRange=wdMain.m_selection.GetRange();

wdCells=tmpRange.GetCells();
wdCell=wdCells.Item(1);
row1=wdCell.GetRowIndex();
//col1=cell.GetColumnIndex();
row2 = row1 + loopRow - 1;//摸板行组的最后一行

wdCell= operTable.Cell(row1,1);
tmpRange =wdCell.GetRange();
template_start=tmpRange.GetStart();//循环行组的第一行,第一个单元格,到文档开头的距离

//template_end =operTable.Cell(row2, table_columns).Range.Start;//这样少一列
wdCell= operTable.Cell(row2+1,1);//到下一行,第一个单元格
tmpRange =wdCell.GetRange();
template_end=tmpRange.GetStart();//循环行组的第一行,第一个单元格,到文档开头的距离


//4.4复制模板整体多行组,固定的摸板的格式和相关的文字说明,也可一个一个单元格复制
srcRange.SetRange(template_start,template_end);//整体多行组复制摸板行组
srcRange.Copy();


//4.5 定位到新加入行的第一个单元格内
//row1 = row1 -loopRow;//向上回退到新加入的行组
//row2 = row2 - loopRow;

//4.6粘贴整体多行组,固定的摸板的格式和相关的文字说明
//desRange =operTable.Rows[row1].Range;//整体多行组粘贴摸板行组
wdRows =operTable.GetRows();//.Rows[row1].Range;//整体多行组粘贴摸板行组
wdRow=wdRows.Item(row1);
desRange =wdRow.GetRange();
desRange.Paste();


VC操作Word书签模板 java操作word模板
//方法2一行一行复制粘贴,代码很少
//for (int j = 0; j <loopRow; j++)
//{//插入需要重复循环的行数loopRow的空行,一行一行的复制粘贴
////复制模板行
//wdRows =operTable.GetRows();
//wdRow=wdRows.Item(cur_row+ j + j);// 所以,粘贴几行,就要多加几行,j+j
//srcRange =wdRow.GetRange();
//srcRange.Copy();

////粘贴到目标行
//wdRows =operTable.GetRows();
//wdRow=wdRows.Item(cur_row+ j );//因为,新粘贴的行 在原来模板行的上面
//desRange =wdRow.GetRange();
//desRange.Paste();
//}
//cur_row += loopRow;

//4.7 动态的数值加入
for (int name_cell_idx = 0;name_cell_idx < nameCellCount; name_cell_idx++)
{//循环命名单元格数量
str.Format("%s%d",nameCellTag[name_cell_idx],nameCellRow[name_cell_idx]);//为了简单这里用其列名和行号作为内容
if(nameCellName[name_cell_idx] == "order_num")
{
str.Format("%d",dt_row_idx + 1);
}
else
{
str=list[iidex++];
//str=dt.Rows[dt_row_idx][nameCellName[name_cell_idx]].ToString();
//这里的数据,来自实际的数据集??????????????????????????????

}
wdCell=operTable.Cell(nameCellRow[name_cell_idx],nameCellColumn[name_cell_idx]);//.Range.Text = str;
tmpRange=wdCell.GetRange();
tmpRange.SetText(str);

nameCellRow[name_cell_idx]+= loopRow;//行号增加重复行的个数loopRow,准备下个循环,定位行使用
}

}

// 5 删除重复的摸板行,不再需要

wdMain.GotoBookmark(min_Name);//
tmpRange=wdMain.m_selection.GetRange();

wdCells=tmpRange.GetCells();
wdCell=wdCells.Item(1);
row1=wdCell.GetRowIndex();
row2 = row1 + loopRow - 1; //摸板行组的最后一行
//方法1 一行一行地删除
//for (int dd = 0; dd < loopRow; dd++)
//{
//wdMain.DeleteRows();
//}

//方法2 多行组一次删除
wdCell= operTable.Cell(row1, 1);
tmpRange = wdCell.GetRange();
template_start=tmpRange.GetStart();//循环行组的第一行,第一个单元格,到文档开头的距离
//template_end = operTable.Cell(row2,table_columns).Range.Start;//这样少一列
wdCell= operTable.Cell(row2+1,1);//到下一行,第一个单元格
tmpRange = wdCell.GetRange();
template_end=tmpRange.GetStart();//循环行组的第一行,第一个单元格,到文档开头的距离

srcRange.SetRange(template_start,template_end);//整体多行组复制摸板行组
srcRange.Cut();
//(三) 清除剪贴板,避免Excel关闭工作簿的时候出现提示
//1 删除剪切板的内容,防止退出提示
//xlMain.m_application.CutCopyMode =flase;//Excel.XlCutCopyMode.xlCut;//删除剪切板的内容,防止退出提示
//2直接用range("A1").copy就行,不必把剪贴板都清空,这会影响其他进程的工作的
wdCell= operTable.Cell(1, 1);
tmpRange = wdCell.GetRange();
tmpRange.Copy();


//(四) 结尾方面的工作
TRY
{
wordTxtBookmark(wdMain,"结论__","成功完成");
}
CATCH_ALL(e)
{

}
END_CATCH_ALL



//(五) 另存文件

//CString docname;
//docname.Format("%s\%s.xls","c:","12");//g_save_path,end_serial);//路径
wdMain.SaveAs(docname);

//(六) 释放
bookmarks.ReleaseDispatch();
bookmark.ReleaseDispatch();
wdRows.ReleaseDispatch();
wdRow.ReleaseDispatch();
wdCols.ReleaseDispatch();
wdCells.ReleaseDispatch();
wdCell.ReleaseDispatch();
tables.ReleaseDispatch();
operTable.ReleaseDispatch();
tmpRange.ReleaseDispatch();
srcRange.ReleaseDispatch();
desRange.ReleaseDispatch();
columns.ReleaseDispatch();

delete []nameCellRow;
delete []nameCellColumn;
delete []nameCellTag;
delete []nameCellName;

wdMain.Close();
//say("ok");
return;
}

====2==封装的word操作类=====

1

//文件名称:wordWork.h

#include
#include "msword.h"

//字体颜色
#defineWD_BLACK0
#defineWD_RED255
#defineWD_BLUE16711680

//对齐方式
#defineWD_LEFT0
#defineWD_CENTER1
#defineWD_RIGHT2
#defineWD_JUSTIFY3
#define WD_DISTRIBUTE 4

//边框方位
#defineWD_DIAGONAL_DOWN-7
#defineWD_DIAGONAL_UP-8
#defineWD_EDGE_BOTTOM-3
#defineWD_EDGE_LEFT-2
#defineWD_EDGE_RIGHT-4
#defineWD_EDGE_TOP-1
#defineWD_INSIDE_HORIZONTAL-5
#defineWD_INSIDE_VERTICAL-6

//边框类型
#defineWD_LINESTYLE_NONE0
#defineWD_LINESTYLE_SINGLE1
#defineWD_LINESTYLE_DOT2

typedef struct MyFont
{
//字体名
CString strName;
//字体大小
float fSize;
//字体颜色
long lColor;
//粗体
BOOL bBold;
//斜体
BOOL bItalic;
//下划线
BOOL bUnderLine;
MyFont(){fSize = 12; lColor = WD_BLACK; bBold = FALSE; bItalic =FALSE; bUnderLine = FALSE;}
}MYFONT;


typedef struct MyPageSet
{
//页边距,单位为厘米
//上
float fTopMargin;
//下
float fBottomMargin;
//左
float fLeftMargin;
//右
float fRightMargin;
MyPageSet() {fTopMargin = fBottomMargin =(float)67.0; fLeftMargin = fRightMargin = (float)57.0;}
}MYPAGESET;


class WordMain
{
private:
public:
_Application m_application;
Documents m_documents;
_Document m_document;
Window m_window;
View m_view;
Selection m_selection;
Tables m_tables;

public:
//构造函数
WordMain();
//析构函数
~WordMain();
//关闭Word应用程序
void Close();
//保存
void Save();
//另存为strFileName包含路径名和文件名
BOOL SaveAs(const CString&strFileName);
//打开
BOOL Open();
//打开已存在fileName.doc或.dot文件
BOOL Open(const CString &strFileName);
//根据模板Template.dot新建
BOOL New(const CString&strTemplateName);
//插入表格
void InsertTable(long lRow, long lCol);
//选择区域(光标上下左右移动数量)
void GetRange(long lLeft = 0, long lUp = 0, longlRight = 0, long lDown = 0);
//全选
void GetWholeStory();
//文件路径strFn是否存在,bDir判定是否包含文件名
BOOL IsFileExist(const CString &strFn, BOOLbDir);
//向行首移动光标
void HomeKey();
//向行尾移动光标
void EndKey();
//向上移动光标
void MoveUp(long lCount);
//向下移动光标
void MoveLeft(long lCount);
//向左移动光标
void MoveRight(long lCount);
//向右移动光标
void MoveDown(long lCount);
//BackSpace键删除选中区域,lCount为退格数
void BackSpace(long lCount);
//Delete键删除选中区域
void Delete();
//输入文本
void SetItemText(const CString&strText);
//Enter键:lCount=回车次数
void Enter(long lCount);
//字体设置
void SetFont(const MYFONT &myFont);
//文本对齐方式(即水平对齐方式)
void SetTextHAlignment(long lHAlignment);
//表格内文本垂直对齐方式
void SetCellVAlignment(long lVAlignment);
//插入书签
void InsertBookmark(const CString&strName);
//书签定位
BOOL GotoBookmark(const CString&strBookmarkName);
//得到所有的书签名集合
void nameBookmarks(WordMain wdMain,CString&strSet);
//插入图片
BOOL InsertPicture(const CString&strFileName, float lWidth, float lHeight);
//对文档中的第lIndex个表格写数据,表格的行列为lRow、lCol
void SetTableText(long lIndex, long lRow, longlCol, const CString &strText);
//获得文档中表格数量
long GetTablesCount();
//选中文档中指定的第lIndex个表格
void SelectTable(long lIndex);
//获得光标所在当前页码
long GetPage();
//指定的第lIndex个表格设置标题行换页后重复显示
void SetHeadingFormat(long lIndex, BOOL bShow =FALSE);
//获得表格列数,第lIndex个表格
long GetTableColumCount(long lIndex);
//获得表格行数,第lIndex个表格
long GetTableRowCount(long lIndex);
voidSetTableColumnWidth(float fNewValue);
void SetTableBorderLine(long lPosition, longlBorderLineStyle = WD_LINESTYLE_SINGLE);
void PageSet(const MYPAGESET&pageSet);
void SetTableHAlignment(long lVAlignment);
void UpdateDomain();
void Copy();
void Cut();
void Paste();
void DeleteRows();
void InsertRowsAbove(long lRowCount);
BOOL ShowBookMark(BOOL bShow = FALSE);
};

2

//文件名称:wordWork.cpp

#include "stdafx.h"
#include "wordWork.h"
#include


WordMain::WordMain()
{

}

WordMain::~WordMain()
{

}

void WordMain::Close()
{
m_selection.ReleaseDispatch();
m_window.ReleaseDispatch();
m_document.ReleaseDispatch();
m_documents.ReleaseDispatch();
m_document.Close(&vtMissing, &vtMissing,&vtMissing);
m_application.Quit(&vtMissing,&vtMissing, &vtMissing);
m_application.ReleaseDispatch();
//CoUninitialize();
}

BOOL WordMain::Open()
{
if (FAILED(CoInitialize(NULL)))
{
AfxMessageBox("初始化COM支持库失败!");
return FALSE;
}
if(m_application.m_lpDispatch == NULL)
{
if(!m_application.CreateDispatch("Word.Application", NULL))
{
AfxMessageBox("Word初始化时出错,没有安装Word或安装不正确!",MB_OK | MB_ICONERROR);
returnFALSE;
}
}
LPDISPATCHlpDisp = m_application.GetDocuments();
m_documents.AttachDispatch(lpDisp);
COleVariantcovOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
lpDisp = m_documents.Add(&covOptional,&vtMissing, &vtMissing, &vtMissing);
m_document.AttachDispatch(lpDisp);
lpDisp = m_application.GetActiveWindow();
m_window.AttachDispatch(lpDisp);
lpDisp = m_window.GetSelection();
m_selection.AttachDispatch(lpDisp);
return TRUE;
}

BOOL WordMain::Open(const CString &strFileName)
{
if (FAILED(CoInitialize(NULL)))
{
AfxMessageBox("初始化COM支持库失败!");
return FALSE;
}
if(m_application.m_lpDispatch == NULL)
{
if(!m_application.CreateDispatch("Word.Application", NULL))
{
AfxMessageBox("Word初始化时出错,没有安装Word或安装不正确!",MB_OK | MB_ICONERROR);
returnFALSE;
}
}
LPDISPATCH lpDisp =m_application.GetDocuments();
m_documents.AttachDispatch(lpDisp);
lpDisp =m_documents.Open(&(_variant_t)strFileName, &vtMissing,&vtMissing, &vtMissing,
&vtMissing, &vtMissing,&vtMissing, &vtMissing, &vtMissing,&vtMissing,
&vtMissing, &vtMissing,&vtMissing, &vtMissing, &vtMissing,&vtMissing);
m_document.AttachDispatch(lpDisp);
lpDisp = m_application.GetActiveWindow();
m_window.AttachDispatch(lpDisp);
lpDisp = m_window.GetSelection();
m_selection.AttachDispatch(lpDisp);
return TRUE;
}

BOOL WordMain::New(const CString &strTemplateName)
{
if (FAILED(CoInitialize(NULL)))
{
AfxMessageBox("初始化COM支持库失败!");
return FALSE;
}
if(m_application.m_lpDispatch == NULL)
{
if(!m_application.CreateDispatch("Word.Application", NULL))
{
AfxMessageBox("Word初始化时出错,没有安装Word或安装不正确!",MB_OK | MB_ICONERROR);
returnFALSE;
}
}
LPDISPATCH lpDisp =m_application.GetDocuments();
m_documents.AttachDispatch(lpDisp);
lpDisp =m_documents.Add(&(_variant_t)strTemplateName, &vtMissing,&vtMissing, &vtMissing);
m_document.AttachDispatch(lpDisp);
lpDisp = m_application.GetActiveWindow();
m_window.AttachDispatch(lpDisp);
lpDisp = m_window.GetSelection();
m_selection.AttachDispatch(lpDisp);
return TRUE;
}

BOOL WordMain::SaveAs(const CString &strFileName)
{
if(IsFileExist(strFileName, FALSE))
{
CString str, str1;
long i =strFileName.ReverseFind('\');
assert(i != -1);
long j =strFileName.ReverseFind('.');
assert(j != -1);
str = strFileName.Mid(i + 1, j- i - 1);
str1 = strFileName.Mid(i +1);
HWND hWnd = ::FindWindow(0, str+ " - Microsoft Word");
HWND hWnd1 = ::FindWindow(0,str1 + " - Microsoft Word");
if (hWnd != NULL || hWnd1 !=NULL)
{
returnFALSE;

}

while(!DeleteFile(strFileName))
{
Sleep(1);
}
}
m_document.SaveAs(&_variant_t(strFileName),&vtMissing, &vtMissing, &vtMissing, &vtMissing,&vtMissing, &vtMissing,
&vtMissing, &vtMissing,&vtMissing, &vtMissing, &vtMissing, &vtMissing,&vtMissing, &vtMissing, &vtMissing);
return TRUE;
}

void WordMain::Save()
{
m_document.Save();
}

BOOL WordMain::IsFileExist(const CString &strFn, BOOLbDir)
{
HANDLEhandle;
LPWIN32_FIND_DATA lpFindFileData = newWIN32_FIND_DATA;
BOOL bFound = FALSE;
if (lpFindFileData)
{
handle = FindFirstFile(strFn,lpFindFileData);
bFound = (handle !=INVALID_HANDLE_VALUE);
if(bFound)
{
if(bDir)
{
bFound= lpFindFileData->dwFileAttributes &FILE_ATTRIBUTE_DIRECTORY;
}
FindClose(handle);
}
delete lpFindFileData;
}
return bFound;
}

void WordMain::InsertTable(long lRow, long lCol)
{

m_tables = m_document.GetTables();
m_tables.Add(m_selection.GetRange(), lRow, lCol,&vtMissing, &vtMissing);//m_selection.GetRange()为光标位置
m_selection.SetStyle(&_variant_t("网格型"));
}

void WordMain::GetRange(long lLeft, long lUp, long lRight, longlDown)
{
long Extend = 1;//选中标志
m_selection.MoveLeft(&vtMissing,&_variant_t(lLeft), &_variant_t(Extend));
m_selection.MoveUp(&vtMissing,&_variant_t(lUp), &_variant_t(Extend));
m_selection.MoveRight(&vtMissing,&_variant_t(lRight), &_variant_t(Extend));
m_selection.MoveDown(&vtMissing,&_variant_t(lDown), &_variant_t(Extend));
}

void WordMain::GetWholeStory()
{
m_selection.WholeStory();
}
void WordMain::HomeKey()
{
m_selection.HomeKey(&vtMissing,&vtMissing);
}
void WordMain::EndKey()
{
m_selection.EndKey(&vtMissing,&vtMissing);
}

void WordMain::MoveUp(long lCount)
{
m_selection.MoveUp(&vtMissing,&_variant_t(lCount), &vtMissing);
}

void WordMain::MoveLeft(long lCount)
{
m_selection.MoveLeft(&vtMissing,&_variant_t(lCount), &vtMissing);
}

void WordMain::MoveRight(long lCount)
{
m_selection.MoveRight(&vtMissing,&_variant_t(lCount), &vtMissing);
}

void WordMain::MoveDown(long lCount)
{
m_selection.MoveDown(&vtMissing,&_variant_t(lCount), &vtMissing);
}

void WordMain::BackSpace(long lCount)
{
for (short i = 0; i
{
m_selection.TypeBackspace();
}
}

void WordMain::Delete()
{
m_selection.Delete(&vtMissing, &vtMissing);
}

void WordMain::SetItemText(const CString &strText)
{
m_selection.TypeText(strText);
}

void WordMain::Enter(long lCount)
{
for (short i = 0; i
{
m_selection.TypeParagraph();
}
}

void WordMain::SetFont(const MYFONT &myFont)
{
_Font font = m_selection.GetFont();
font.SetName(myFont.strName);
font.SetColor(myFont.lColor);
font.SetSize(myFont.fSize);
font.SetBold(myFont.bBold);
font.SetItalic(myFont.bItalic);
font.SetUnderline(myFont.bUnderLine);
font.ReleaseDispatch();
}

void WordMain::SetTextHAlignment(long lHAlignment)
{
_ParagraphFormat paraFormat =m_selection.GetParagraphFormat();
paraFormat.SetAlignment(lHAlignment);
paraFormat.ReleaseDispatch();
}

void WordMain::SetCellVAlignment(long lVAlignment)
{
Cells cells= m_selection.GetCells();
cells.SetVerticalAlignment(lVAlignment);
cells.ReleaseDispatch();
}

void WordMain::InsertBookmark(const CString &strName)
{
Bookmarksbookmarks = m_document.GetBookmarks();
bookmarks.Add(strName,&_variant_t(m_selection.GetRange()));
bookmarks.ReleaseDispatch();
}

BOOL WordMain::GotoBookmark(const CString&strBookmarkName)
{
Bookmarksbookmarks = m_document.GetBookmarks();
if (!bookmarks.Exists(strBookmarkName))
{
return FALSE;
}
short GoToBookmark = -1;
m_selection.GoTo(&_variant_t(GoToBookmark), &vtMissing,&vtMissing, &_variant_t(strBookmarkName));
bookmarks.ReleaseDispatch();
return TRUE;
}
void WordMain::nameBookmarks(WordMain wdMain,CString&strSet)
{
Bookmarksbookmarks=wdMain.m_document.GetBookmarks();
Bookmark bookmark;
int bksCount=bookmarks.GetCount();
CString str;
str="";
VARIANT vtIndex;
for (int k=0;k
{
vtIndex.vt = VT_I4;
vtIndex.lVal = k+1;//注意,从1开始,不是0
bookmark=bookmarks.Item(&vtIndex);
str=bookmark.GetName()+"|";
strSet +=str ;

}//for (for k=0;k

bookmarks.ReleaseDispatch();
bookmark.ReleaseDispatch();
}
BOOL WordMain::InsertPicture(const CString &strFileName, floatlWidth, float lHeight)
{
if(!IsFileExist(strFileName, FALSE))
{

AfxMessageBox(strFileName+ "要插入的图片不存在!");
return FALSE;
}
//Shapesshapes = m_document.GetShapes();
InlineShapesinlineShapes = m_selection.GetInlineShapes();
inlineShapes.AddPicture(strFileName,&vtMissing, &vtMissing, &vtMissing);
GetRange(1, 0, 0, 0);
inlineShapes =m_selection.GetInlineShapes();
InlineShape inlineShape =inlineShapes.Item(1);
inlineShape.SetWidth(lWidth);
inlineShape.SetHeight(lHeight);
MoveRight(1);
inlineShape.ReleaseDispatch();
inlineShapes.ReleaseDispatch();
return TRUE;
}

void WordMain::SetTableText(long lIndex, long lRow, long lCol,const CString &strText)
{
Tablestables = m_document.GetTables();
if (lIndex > tables.GetCount())
{
AfxMessageBox("试图将数据写入不存在的表格!");
return;
}
Table table = tables.Item(lIndex);
Cell cell = table.Cell(lRow,lCol);
cell.Select();
m_selection.SetText(strText);
cell.ReleaseDispatch();
table.ReleaseDispatch();
tables.ReleaseDispatch();
}

long WordMain::GetTablesCount()
{
Tablestables = m_document.GetTables();
long lTalbesCount = tables.GetCount();
tables.ReleaseDispatch();
return lTalbesCount;
}

void WordMain::SelectTable(long lIndex)
{
Tablestables = m_document.GetTables();
Table table = tables.Item(lIndex);
table.Select();
table.ReleaseDispatch();
tables.ReleaseDispatch();
}

long WordMain::GetPage()
{
VARIANT vt =m_selection.GetInformation(1);

return vt.lVal;
}

void WordMain::SetHeadingFormat(long lIndex, BOOL bShow)
{
if (bShow)
{
Tables tables =m_document.GetTables();
Table table =tables.Item(lIndex);
Cell cell = table.Cell(1,GetTableColumCount(lIndex));
Row row =cell.GetRow();
row.SetHeadingFormat(9999998);
row.ReleaseDispatch();
cell.ReleaseDispatch();
table.ReleaseDispatch();
tables.ReleaseDispatch();
}
}

long WordMain::GetTableColumCount(long lIndex)
{
Tables tables = m_document.GetTables();
Table table = tables.Item(lIndex);
Columns columns = table.GetColumns();
long lColumsCount = columns.GetCount();
columns.ReleaseDispatch();
table.ReleaseDispatch();
tables.ReleaseDispatch();
return lColumsCount;
}

long WordMain::GetTableRowCount(long lIndex)
{
Tables tables = m_document.GetTables();
Table table = tables.Item(lIndex);
Rows rows = table.GetRows();
long lRowCount = rows.GetCount();
rows.ReleaseDispatch();
table.ReleaseDispatch();
tables.ReleaseDispatch();
return lRowCount;
}

void WordMain::SetTableColumnWidth(float fNewValue)
{
Columns columns = m_selection.GetColumns();
columns.SetPreferredWidthType(3);
columns.SetPreferredWidth(fNewValue);
columns.ReleaseDispatch();
}

void WordMain::SetTableBorderLine(long lPosition, longlBorderLineStyle)
{
Borders borders = m_selection.GetBorders();
Border border = borders.Item(lPosition);
border.SetLineStyle(lBorderLineStyle);
border.ReleaseDispatch();
borders.ReleaseDispatch();
}


void WordMain::PageSet(const MYPAGESET &pageSet)
{
PageSetuppgSetup = m_document.GetPageSetup();
pgSetup.SetTopMargin(pageSet.fTopMargin);
pgSetup.SetBottomMargin(pageSet.fBottomMargin);
pgSetup.SetLeftMargin(pageSet.fLeftMargin);
pgSetup.SetRightMargin(pageSet.fRightMargin);
pgSetup.ReleaseDispatch();
}

void WordMain::SetTableHAlignment(long lVAlignment)
{
Tables tables = m_selection.GetTables();
Table table = tables.Item(1);
Rows rows = table.GetRows();
rows.SetAlignment(lVAlignment);
rows.ReleaseDispatch();
table.ReleaseDispatch();
tables.ReleaseDispatch();
}

void WordMain::UpdateDomain()
{
m_selection.WholeStory();
Fields fields = m_selection.GetFields();
fields.Update();
}

void WordMain::Cut()
{
m_selection.Cut();
}

void WordMain::Copy()
{
m_selection.Copy();
}

void WordMain::Paste()
{
m_selection.Paste();
}

void WordMain::DeleteRows()
{
Rows rows = m_selection.GetRows();
rows.Delete();
rows.ReleaseDispatch();
}

void WordMain::InsertRowsAbove(long lRowCount)
{
m_selection.InsertRowsAbove(&_variant_t(long(lRowCount)));
}

BOOL WordMain::ShowBookMark(BOOL bShow)
{
m_view = m_window.GetView();
m_view.SetShowBookmarks (bShow);
m_view.ReleaseDispatch();
return TRUE;
}

  

爱华网本文地址 » http://www.aihuau.com/a/25101012/128603.html

更多阅读

excel2003表格的基本操作 word表格的基本操作

excel2003表格的基本操作——简介 Microsoft Excel是微软公司的办公软件Microsoft office的组件之一,是由Microsoft为Windows和Apple Macintosh操作系统的电脑而编写和运行的一款试算表软件。Excel 是微软办公套装软件的一个重要的组

如何制作excel表格 word表格的基本操作

如何制作excel表格——简介 本教程为Excel入门教程,详细介绍一般excel表格的制作过程。制作表格前需要你在心里先构思下表格的大致布局和样式,以便实际操作的顺利完成。如何制作excel表格——方法/步骤如何制作excel表格 1、.新建一

excle表格制作教程 word表格的基本操作

excle表格制作教程——简介本教程为Excel入门教程,详细介绍一般excel表格的制作过程。制作表格前需要你在心里先构思下表格的大致布局和样式,以便实际操作的顺利完成。 excle表格制作教程——方法/步骤excle表格制作教程 1、

iPadmini的基本操作技巧 word的基本操作与技巧

当实现了iPadmini能登录使用虚拟桌面和无线投影这两个开展移动教学的基本条件后(参“iPad mini应用——我的办公,我的教学”),将试验的重点转向为解决教学实战中的操作问题了,即在利用移动设备实际开课时,由于操作方式的改变而造成的操作

声明:《VC操作Word书签模板 java操作word模板》为网友绝怼宠尔灬分享!如侵犯到您的合法权益请联系我们删除