描述:
我根据MSDN上的方法可以创建一个DOC文档并用Selection的TypeText添加文字,我现在要网DOC文档中添加一张3行2列的表并向表填内容该怎么做呢?然后我还想在表的末尾增加新行以添写更多的数据,请问又怎么操作呢?MSDN上好象说用Range,但我太菜,不知道VC++中怎么用,请各位给个code sample并注解下,谢了。
解决方案1:
在word中先操作一遍需要的动作,录制一个宏出来,然后看着vba源码修改,这样快些
解决方案2: 看看下面这段代码,记信先引入Word类型库的,步骤VC->ClassWizard->autumation->AddClass->FormLibrary然后就是具体在的Word的Word*.olb查找一下,在From library中选中,产生一堆类。点中第一个,然后按Shift点中最后一个,所有类都产生了(一堆啊!!),在使用的地方包含Word*.h文件,具体的文件名,看Word的版本,我也是学来的啊,不过我已经用好了!!下面代码是我在自己写的程序上经过删改过的,看一下有什么不明白的可以发短信息,如果我有空的话就给回!!!
char szFilter[] = "Microsoft Word Document(.doc)|*.doc||";
CString defaultName = "结果数据";
CString extStr = "*.doc";
CFileDialog wordSaveDlg(FALSE, extStr, defaultName, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter);
if(wordSaveDlg.DoModal()==IDOK)
{
CString sFile = wordSaveDlg.GetPathName();
COleVariant vTrue((short)TRUE),
vFalse((short)FALSE),
vOpt((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
//Start a new instance of Microsoft Word
_Application oWordApp;
if (!oWordApp.CreateDispatch("Word.Application", NULL))
{
AfxMessageBox("CreateDispatch failed.",
MB_OK | MB_SETFOREGROUND);
return;
}
try
{
//Create a new document
Documents oDocs;
_Document oDoc;
oDocs = oWordApp.GetDocuments();
oDoc = oDocs.Add(vOpt, vOpt,vOpt,vOpt);
PageSetup mPageSetup;
mPageSetup = oDoc.GetPageSetup();
mPageSetup.SetOrientation(1);
//Add text to the document
Selection oSel;
oSel = oWordApp.GetSelection();
// oSel.TypeText("one");
// oSel.TypeParagraph();
///-----------------------------------------------------------------------------------------
//输出文本.begin.
Paragraphs paragraphs1; //代表文档中所有段
Paragraph paragraph1; //代表文档中某一段
paragraphs1=oDoc.GetParagraphs();
// paragraph1=paragraphs1.GetFirst(); //得到第一段,也可以用GetItem(n)来得到第n段
paragraph1=paragraphs1.GetFirst();
Range r1=paragraph1.GetRange(); //选中第一段
//下边是你所说的,用_Font类,先得到现在的字体信息,在此基础上改变就行了
_Font of />
// ofont.SetName("华文行楷");
ofont.SetSize((short)20);
paragraph1.SetAlignment(1); //使一段(Paragraph)居中显示
r1.SetText("结果数据表\n");
//输出文本.end.
///-----------------------------------------------------------------------------------------
//Save the document
// _Document oActiveDoc;
// oActiveDoc = oWordApp.GetActiveDocument();//使用文档保存文件一法
oWordApp.SetVisible(FALSE);
//加入表格begin.
Tables tbs;
Table tb;
Cell cell;
Range range;
//让range选中要插入表格的地方
COleVariant vm1((short)TRUE),vm2((short)TRUE);
oDoc.Activate();
tbs=oDoc.GetTables();
//
VARIANT vt;
vt.vt=VT_ERROR;
vt.scode=DISP_E_PARAMNOTFOUND;
tagVARIANT tvt1;
tvt1 = vtMissing;
paragraph1 = paragraphs1.GetLast();
range = paragraph1.GetRange();
_Font ofont2 = range.GetFont();
ofont2.SetSize((short)10);
//使用Grid控件导出更为合理一些,还是使用结果数据呢?
//标题信息数据放到对话框架类里存储了,调整信息可以放到配置(.INI)文件中进行管理 tb = tbs.Add(range, 8, 8,&tvt1,&tvt1);//, &vt, &vt);//第二、第三个参数:8,8,表示建立8×8表格//在Word2000下为四个参数,在其他的根据情况了。
Cell oCell;
oCell = tb.Cell(0, 0);//选择第一行,第一列所在的单元格
range = oCell.GetRange();
CString str;
for(int i = 0;i<8;i++)
{
for(int j = 0; j< 8;j++)
{
str.Format("%d,%d",i,j);
cell=tb.Cell(i,j);
range=cell.GetRange();
range.SetText(str);
}
//加入表格end.
oDoc.SaveAs(COleVariant(sFile),
COleVariant((short)0),
vFalse, COleVariant(""), vTrue, COleVariant(""),
vFalse, vFalse, vFalse, vFalse, vFalse);
}
catch(COleException *e)
{
LPVOID lpMsg;
::FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS, NULL, e->m_sc,
MAKELANGID(LANG_NEUTRAL,
SUBLANG_DEFAULT),(LPTSTR) &lpMsg,
0, NULL);
::MessageBox(NULL, (LPCTSTR)lpMsg, "COM Error",
MB_OK | MB_SETFOREGROUND);
::LocalFree( lpMsg );
}
catch(COleDispatchException *e)
{
char msg[512];
sprintf(msg, "Run-time error '%d':\n\n%s",
e->m_scError & 0x0000FFFF, e->m_strDescription);
::MessageBox(NULL, msg, "Server Error",
MB_OK | MB_SETFOREGROUND);
}
//Quit the application
oWordApp.Quit(vFalse, vOpt, vOpt);
MessageBox("导出Word文件完成!","系统提示",MB_OK | MB_ICONINFORMATION);
}
CComQIPtr<MSWord::_Document> m_Doc;
m_Doc=App->GetActiveDocument();
CComQIPtr<MSWord::Shapes> oShapes;
oShapes = m_Doc->GetShapes();
CComQIPtr<MSWord::Shape> oShape;
oShape=oShapes->AddOLEControl():
AddOLEControl()里的具体参数按照你的要求