最近完成了一个使用VC++ 操作word生成扫描报告的功能,在这里将过程记录下来,开发环境为visual studio 2008

导入接口

首先在创建的MFC项目中引入word相关组件
右键点击 项目 --> 添加 --> 新类,在弹出的对话框中选择Typelib中的MFC类。

然后在弹出的对话框中选择文件,从文件中导入MSWORD.OLB组件。

这个文件的路径一般在C:\Program Files (x86)\Microsoft Office\Office14 中,注意:最后一层可能不一定是Office14,这个看机器中安装的office 版本。
选择之后会要求我们决定导入那些接口,为了方便我们导入所有接口。

导入之后可以看到项目中省成本了很多代码文件,这些就是系统生成的操作Word的相关类。

这里编译可能会报错,error C2786: “BOOL (HDC,int,int,int,int)”: __uuidof 的操作数无效
解决方法:
修改对应头文件

#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")

再次编译,错误消失

常见接口介绍

要了解一些常见的类,我们首先需要明白这些接口的层次结构:

Application(WORD 为例,只列出一部分)Documents(所有的文档)Document(一个文档)......Templates(所有模板)Template(一个模板)......Windows(所有窗口)WindowSelectionViewSelection(编辑对象)FontStyleRange

这些组件其实是采用远程调用的方式调用word进程来完成相关操作。

  • Application:相当于一个word进程,每次操作之前都需要一个application对象,这个对象用于创建一个word进程。
  • Documents:相当于word中打开的所有文档,如果用过word编辑多个文件,那么这个概念应该很好理解
  • Templates:是一个模板对象,至于word模板,不了解的请自行百度
  • Windows:word进程中的窗口
  • Selection:编辑对象。也就是我们要写入word文档中的内容。一般包括文本、样式、图形等等对象。

回忆一下我们手动编写word的情景,其实使用这些接口是很简单的。我们在使用word编辑的时候首先会打开word程序,这里对应在代码里面就是创建一个Application对象。然后我们会用word程序打开一个文档或者新建一个文档。这里对应着创建Documents对象并从中引用一个Document对象表示一个具体的文档。当然这个Document对象可以是新建的也可以是打开一个现有的。接着就是进行相关操作了,比如插入图片、插入表格、编写段落文本等等了。这些都对应着创建类似于Font、Style、TypeText对象,然后将这些对象进行添加的操作了。
说了这么多。这些接口这么多,我怎么知道哪个接口对应哪个对象呢,而且这些参数怎么传递呢?其实这个问题很好解决。我们可以手工进行相关操作,然后用宏记录下来,最后我们再将宏中的VB代码转化为VC代码即可。

相关操作

为了方便在项目中使用,这里创建一个类用于封装Word的相关操作

class CCreateWordReport
{private:CApplication m_wdApp;CDocuments m_wdDocs;CDocument0 m_wdDoc;CSelection m_wdSel; CRange     m_wdRange;CnlineShapes m_wdInlineShapes;CnlineShape m_wdInlineShape;
public:CCreateWordReport();virtual ~CCreateWordReport();public://操作//**********************创建新文档*******************************************BOOL CreateApp();                    //创建一个新的WORD应用程序BOOL CreateDocuments();                //创建一个新的Word文档集合BOOL CreateDocument();                //创建一个新的Word文档BOOL Create();                        //创建新的WORD应用程序并创建一个新的文档void ShowApp();                        //显示WORD文档void HideApp();                        //隐藏word文档//**********************打开文档*********************************************BOOL OpenDocument(CString fileName);//打开已经存在的文档。BOOL Open(CString fileName);        //创建新的WORD应用程序并打开一个已经存在的文档。BOOL SetActiveDocument(short i);    //设置当前激活的文档。//**********************保存文档*********************************************BOOL SaveDocument();                //文档是以打开形式,保存。BOOL SaveDocumentAs(CString fileName);//文档以创建形式,保存。BOOL CloseDocument();void CloseApp(); //**********************文本书写操作*****************************************void WriteText(CString szText);        //当前光标处写文本void WriteNewLineText(CString szText, int nLineCount = 1); //换N行写字void WriteEndLine(CString szText);    //文档结尾处写文本void WholeStory();                    //全选文档内容void Copy();                        //复制文本内容到剪贴板void InsertFile(CString fileName);    //将本地的文件全部内容写入到当前文档的光标处。void InsertTable(int nRow, int nColumn, CTable0& wdTable);//**********************图片插入操作*****************************************void InsertShapes(CString fileName);//在当前光标的位置插入图片//**********************超链接插入操作*****************************************void InsertHyperlink(CString fileLink);//超级链接地址,可以是相对路径。//***********************表格操作表格操作**********************************BOOL InsertTableToMarkBook(const CString csMarkName, int nRow, int nColumn, CTable0& wdTable); //表格行数与列数BOOL WriteDataToTable(CTable0& wdTable, int nRow, int nColumn, const CString &csData); //往表格中写入输入
};
BOOL CCreateWordReport::CreateApp()
{if (FALSE == m_wdApp.CreateDispatch("word.application")){AfxMessageBox("Application创建失败,请确保安装了word 2000或以上版本!", MB_OK|MB_ICONWARNING);return FALSE;}return TRUE;
}BOOL CCreateWordReport::CreateDocuments()
{if (FALSE == CreateApp()) {return FALSE;}m_wdDocs = m_wdApp.get_Documents();if (!m_wdDocs.m_lpDispatch) {AfxMessageBox("Documents创建失败!", MB_OK|MB_ICONWARNING);return FALSE;}return TRUE;
}BOOL CCreateWordReport::CreateDocument()
{if (!m_wdDocs.m_lpDispatch) {AfxMessageBox("Documents为空!", MB_OK|MB_ICONWARNING);return FALSE;}COleVariant varTrue(short(1),VT_BOOL),vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);CComVariant Template(_T(""));    //没有使用WORD的文档模板CComVariant NewTemplate(false),DocumentType(0),Visible;m_wdDocs.Add(&Template,&NewTemplate,&DocumentType,&Visible);    //得到document变量m_wdDoc = m_wdApp.get_ActiveDocument();if (!m_wdDoc.m_lpDispatch) {AfxMessageBox("Document获取失败!", MB_OK|MB_ICONWARNING);return FALSE;}//得到selection变量m_wdSel = m_wdApp.get_Selection();if (!m_wdSel.m_lpDispatch) {AfxMessageBox("Select获取失败!", MB_OK|MB_ICONWARNING);return FALSE;}//得到Range变量m_wdRange = m_wdDoc.Range(vOptional,vOptional);if(!m_wdRange.m_lpDispatch){AfxMessageBox("Range获取失败!", MB_OK|MB_ICONWARNING);return FALSE;}return TRUE;
}BOOL CCreateWordReport::Create()
{if (FALSE == CreateDocuments()) {return FALSE;}return CreateDocument();
}BOOL CCreateWordReport::OpenDocument(CString fileName)
{if (!m_wdDocs.m_lpDispatch) {AfxMessageBox("Documents为空!", MB_OK|MB_ICONWARNING);return FALSE;}COleVariant vTrue((short)TRUE),    vFalse((short)FALSE),vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR),vZ((short)0);COleVariant     vFileName(_T(fileName));//得到document变量m_wdDoc = m_wdDocs.Open(vFileName,        // FileNamevTrue,            // Confirm Conversion.vFalse,            // ReadOnly.vFalse,            // AddToRecentFiles.vOptional,        // PasswordDocument.vOptional,        // PasswordTemplate.vOptional,        // Revert.vOptional,        // WritePasswordDocument.vOptional,        // WritePasswordTemplate.vOptional,        // Format. // Last argument for Word 97vOptional,        // Encoding // New for Word 2000/2002vOptional,        // Visible/*如下4个是word2003需要的参数。本版本是word2000。*/vOptional,    // OpenAndRepairvZ,            // DocumentDirection wdDocumentDirection LeftToRightvOptional,    // NoEncodingDialogvOptional);if (!m_wdDoc.m_lpDispatch){AfxMessageBox("Document获取失败!", MB_OK|MB_ICONWARNING);return FALSE;}//得到selection变量m_wdSel = m_wdApp.get_Selection();if (!m_wdSel.m_lpDispatch) {AfxMessageBox("Select获取失败!", MB_OK|MB_ICONWARNING);return FALSE;}//得到全部DOC的Range变量m_wdRange = m_wdDoc.Range(vOptional,vOptional);if(!m_wdRange.m_lpDispatch){AfxMessageBox("Range获取失败!", MB_OK|MB_ICONWARNING);return FALSE;}return TRUE;
}BOOL CCreateWordReport::Open(CString fileName)
{if (FALSE == CreateDocuments()) {return FALSE;}return OpenDocument(fileName);
}BOOL CCreateWordReport::SetActiveDocument(short i)
{COleVariant     vIndex(_T(i)),vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);m_wdDoc.AttachDispatch(m_wdDocs.Item(vIndex));m_wdDoc.Activate();if (!m_wdDoc.m_lpDispatch) {AfxMessageBox("Document获取失败!", MB_OK|MB_ICONWARNING);return FALSE;}//得到selection变量m_wdSel = m_wdApp.get_Selection();if (!m_wdSel.m_lpDispatch) {AfxMessageBox("Select获取失败!", MB_OK|MB_ICONWARNING);return FALSE;}//得到全部DOC的Range变量m_wdRange = m_wdDoc.Range(vOptional,vOptional);if(!m_wdRange.m_lpDispatch){AfxMessageBox("Range获取失败!", MB_OK|MB_ICONWARNING);return FALSE;}
//  HideApp();return TRUE;
}BOOL CCreateWordReport::SaveDocument()
{if (!m_wdDoc.m_lpDispatch) {AfxMessageBox("Document获取失败!", MB_OK|MB_ICONWARNING);return FALSE;}m_wdDoc.Save();return TRUE;
}BOOL CCreateWordReport::SaveDocumentAs(CString fileName)
{if (!m_wdDoc.m_lpDispatch) {AfxMessageBox("Document获取失败!", MB_OK|MB_ICONWARNING);return FALSE;}COleVariant covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);COleVariant varZero((short)0); COleVariant varTrue(short(1),VT_BOOL); COleVariant varFalse(short(0),VT_BOOL); COleVariant vFileName(_T(fileName));m_wdDoc.SaveAs(vFileName,covOptional, covOptional, covOptional, covOptional,covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional,covOptional);return    TRUE;
}BOOL CCreateWordReport::CloseDocument()
{COleVariant vTrue((short)TRUE),    vFalse((short)FALSE),vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);m_wdDoc.Close(vFalse,    // SaveChanges.vTrue,            // OriginalFormat.vFalse            // RouteDocument.);m_wdDoc.AttachDispatch(m_wdApp.get_ActiveDocument());if (!m_wdDoc.m_lpDispatch) {AfxMessageBox("Document获取失败!", MB_OK|MB_ICONWARNING);return FALSE;}//得到selection变量m_wdSel = m_wdApp.get_Selection();if (!m_wdSel.m_lpDispatch) {AfxMessageBox("Select获取失败!", MB_OK|MB_ICONWARNING);return FALSE;}//得到全部DOC的Range变量m_wdRange = m_wdDoc.Range(vOptional,vOptional);if(!m_wdRange.m_lpDispatch){AfxMessageBox("Range获取失败!", MB_OK|MB_ICONWARNING);return FALSE;}return TRUE;
}void CCreateWordReport::CloseApp()
{COleVariant vTrue((short)TRUE),    vFalse((short)FALSE),vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);m_wdDoc.Save();m_wdApp.Quit(vFalse,    // SaveChanges.vTrue,            // OriginalFormat.vFalse            // RouteDocument.);//释放内存申请资源m_wdInlineShape.ReleaseDispatch();m_wdInlineShapes.ReleaseDispatch();//m_wdTb.ReleaseDispatch();m_wdRange.ReleaseDispatch();m_wdSel.ReleaseDispatch();//m_wdFt.ReleaseDispatch();m_wdDoc.ReleaseDispatch();m_wdDocs.ReleaseDispatch();m_wdApp.ReleaseDispatch();
}void CCreateWordReport::WriteText(CString szText)
{m_wdSel.TypeText(szText);
}void CCreateWordReport::WriteNewLineText(CString szText, int nLineCount /* = 1 */)
{int i;if (nLineCount <= 0){nLineCount = 0;}for (i = 0; i < nLineCount; i++){m_wdSel.TypeParagraph();}WriteText(szText);
}void CCreateWordReport::WriteEndLine(CString szText)
{m_wdRange.InsertAfter(szText);
}void CCreateWordReport::WholeStory()
{m_wdRange.WholeStory();
}void CCreateWordReport::Copy()
{m_wdRange.CopyAsPicture();
}void CCreateWordReport::InsertFile(CString fileName)
{COleVariant     vFileName(fileName),vTrue((short)TRUE),vFalse((short)FALSE),vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR),vNull(_T(""));/*void InsertFile(LPCTSTR FileName, VARIANT* Range, VARIANT* ConfirmConversions, VARIANT* Link, VARIANT* Attachment);*/m_wdSel.InsertFile(fileName,vNull,vFalse,vFalse,vFalse);
}void CCreateWordReport::InsertShapes(CString fileName)
{COleVariant vTrue((short)TRUE),    vFalse((short)FALSE),vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);m_wdInlineShapes=m_wdSel.get_InlineShapes();m_wdInlineShape=m_wdInlineShapes.AddPicture(fileName,vFalse,vTrue,vOptional);
}void CCreateWordReport::InsertHyperlink(CString fileLink)
{COleVariant     vAddress(_T(fileLink)),vSubAddress(_T(""));CRange aRange = m_wdSel.get_Range();CHyperlinks vHyperlinks(aRange.get_Hyperlinks());vHyperlinks.Add(aRange,            //Object,必需。转换为超链接的文本或图形。vAddress,         //Variant 类型,可选。指定的链接的地址。此地址可以是电子邮件地址、Internet 地址或文件名。请注意,Microsoft Word 不检查该地址的正确性。vSubAddress,     //Variant 类型,可选。目标文件内的位置名,如书签、已命名的区域或幻灯片编号。vAddress,         //Variant 类型,可选。当鼠标指针放在指定的超链接上时显示的可用作“屏幕提示”的文本。默认值为 Address。vAddress,         //Variant 类型,可选。指定的超链接的显示文本。此参数的值将取代由 Anchor 指定的文本或图形。vSubAddress        //Variant 类型,可选。要在其中打开指定的超链接的框架或窗口的名字。); aRange.ReleaseDispatch();vHyperlinks.ReleaseDispatch();
}

这样我们就封装好了一些基本的操作,其实这些操作都是我自己根据网上的资料以及VB宏转化而来得到的代码。

特殊操作

在这里主要介绍一些比较骚的操作,这也是这篇文章主要有用的内容,前面基本操作网上都有源代码直接拿来用就OK了,这里的骚操作是我在项目中使用的主要操作,应该有应用价值。先请各位仔细想想,如果我们要根据前面的代码,从0开始完全用代码生成一个完整的报表是不是很累,而且一般报表都会包含一些通用的废话,这些话基本不会变化。如果将这些写到代码里面,如果后面这些话变了,我们就要修改并重新编译,是不是很麻烦。所以这里介绍的第一个操作就是利用模板和书签在合适的位置插入内容。

书签的使用

首先我们在Word中的适当位置创建一个标签,至于如何创建标签,请自行百度。然后在代码中的思路就是在文档中查找我们的标签,再获取光标的位置,最后就是在该位置处添加相应的内容了,这里我们举一个在光标位置插入文本的例子:

void CCreateWordReport::WriteTextToBookMark(const CString& csMarkName, const CString& szText)
{CBookmarks bks = m_wdDoc.get_Bookmarks(); //获取文档中的所有书签CBookmark0 bk;COleVariant bk_name(csMarkName); bk = bks.Item(&bk_name); //查询对应名称的书签CRange  hRange = bk.get_Range(); //获取书签位置if (hRange != NULL){hRange.put_Text(szText); //在该位置处插入文本}//最后不要忘记清理相关资源hRange.ReleaseDispatch();bk.ReleaseDispatch();bks.ReleaseDispatch();
}

表格的使用

在word报表中表格应该是一个重头戏,表格中常用的接口如下:

  • CTables0: 表格集合
  • CTable0: 某个具体的表格,一般通过CTables来创建CTable
  • CColumn: 表格列对象
  • CRow:表格行对象
  • CCel:表格单元格对象

创建表格一般的操作如下:

void CCreateWordReport::InsertTable(int nRow, int nColumn, CTable0& wdTable)
{VARIANT vtDefault;COleVariant vtAuto;vtDefault.vt = VT_INT;vtDefault.intVal = 1;vtAuto.vt = VT_INT;vtAuto.intVal = 0;CTables0 wordtables = m_wdDoc.get_Tables();wdTable =    wordtables.Add(m_wdSel.get_Range(), nRow, nColumn, &vtDefault, &vtAuto);wordtables.ReleaseDispatch();
}

往表格中写入内容的操作如下:

BOOL CCreateWordReport::WriteDataToTable(CTable0& wdTable, int nRow, int nColumn, const CString &csData)
{ CCell cell = wdTable.Cell(nRow, nColumn);cell.Select(); //将光标移动到单元格m_wdSel.TypeText(csData);cell.ReleaseDispatch();return TRUE;
}

合并单元格的操作如下:

CTable0 wdTable;
InsertTable(5, 3, wdTable); //创建一个5行3列的表格
CCell cell = wdTable.Cell(1, 1); //获得第一行第一列的单元格
//设置第二列列宽
CColumns0 columns = wdTable.get_Columns();
CColumn col;
col.AttachDispatch(columns.Item(2));
col.SetWidth(40, 1);cell.Merge(wdTable.Cell(5, 1)); //合并单元格,一直合并到第5行的第1列。
cell.SetWidth(30, 1);
cell.ReleaseDispatch();

合并单元格用的是Merge函数,该函数的参数是一个单元格对象,表示合并结束的单元格。这里合并类似于我们画矩形时提供的左上角坐标和右下角坐标

移动光标跳出表格

当时由于需要连续的生成多个表格,当时我将前一个表格的数据填完,光标位于最后一个单元格里面,这个时候如果再插入的时候会在这个单元格里面插入表格,这个时候需要我手动向下移动光标,让光标移除到表格外。移动光标的代码如下:

m_wdSel.MoveDown(&COleVariant((short)wdLine), &COleVariant((short)1), &COleVariant((short)wdNULL));

这里wdLine 是word相关接口定义的,表示希望以何种单位来移动,这里我是以行为单位。后面的1表示移动1行。

但是我发现在面临换页的时候一次移动根本移动不出来,这个时候我又添加了一行这样的代码移动两行。但是问题又出现了,这一系列表格后面跟着另一个大标题,多移动几次之后可能会造成它移动到大标题的位置,而破坏我原来定义的模板,这个时候该怎么办呢?我采取的办法是,判断当前光标是否在表格中,如果是则移动一行,知道出了表格。这里的代码如下:

//移动光标,直到跳出表格外
while (TRUE)
{m_wdSel.MoveDown(&COleVariant((short)wdLine), &COleVariant((short)1), &COleVariant((short)wdNULL));m_wdSel.Collapse(&COleVariant((short)wdCollapseStart));if (!m_wdSel.get_Information((long)wdWithInTable).boolVal){break;}
}

样式的使用

在使用样式的时候当然也可以用代码来定义,但是我们可以采取另一种方式,我们可以事先在模板文件中创建一系列样式,然后在需要的时候直接定义段落或者文本的样式即可

m_wdSel.put_Style(COleVariant("二级标题")); //在当前光标处的样式定义为二级标题样式,这里的二级标题样式是我们在word中事先定义好的
m_wdSel.TypeText(csTitle); //在当前位置输出文本
m_wdSel.TypeParagraph(); //插入段落,这里主要为了换行,这个时候光标也会跟着动
m_wdSel.put_Style(COleVariant("正文")); //定义此处样式为正文样式
m_wdSel.TypeText(csText;

插入图表

我自己尝试用word生成的图表样式还可以,但是用代码插入的时候,样式就特别丑,这里没有办法,我采用GDI+绘制了一个饼图,然后将图片插入word中。

BOOL CCreateWordReport::DrawVulInforPic(const CString& csMarkName, int nVulCnt, int nVulCris, int nHigh, int nMid, int nLow, int nPossible)
{CBookmarks bks = m_wdDoc.get_Bookmarks();COleVariant bk_name(csMarkName);CBookmark0 bk = bks.Item(&bk_name);bk.Select();CnlineShapes isps = m_wdSel.get_InlineShapes();COleVariant vFalse((short)FALSE);COleVariant vNull("");COleVariant vOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);//创建一个与桌面环境兼容的内存DCHWND hWnd = GetDesktopWindow();HDC hDc = GetDC(hWnd);HDC hMemDc = CreateCompatibleDC(hDc);HBITMAP hMemBmp = CreateCompatibleBitmap(hDc, PICTURE_WIDTH + GLOBAL_MARGIN, PICTURE_LENGTH + 2 * GLOBAL_MARGIN + LENGED_BORDER_LENGTH);SelectObject(hMemDc, hMemBmp);//绘制并保存图表DrawPie(hMemDc, nVulCnt, nVulCris, nHigh, nMid, nLow, nPossible);COleVariant vTrue((short)TRUE);CnlineShape isp=isps.AddPicture("D:\\Program\\WordReport\\WordReport\\test.png",vFalse,vTrue,vOptional);  //以图片的方式插入图表//设置图片的大小isp.put_Height(141);isp.put_Width(423);bks.ReleaseDispatch();bk.ReleaseDispatch();isps.ReleaseDispatch();isp.ReleaseDispatch();DeleteObject(hMemDc);DeleteDC(hMemDc);ReleaseDC(hWnd, hDc);return TRUE;
}

最后,各个接口的参数可以参考下面的链接:
.net Word office组件接口文档


VC+++ 操作word相关推荐

  1. VC操作word绘制表格

    VC操作word绘制表格时,需要选择绘制好的整个表格框居中显示, 1,如何选中整个表格框,表格的对象table,然后居中 2.表格的个性化设置,表格项内再次设计一个m*n的表格框            ...

  2. VC++ 操作 word

    摘要: 使用VC编程来操纵Office.你可以实现诸如:Word文件打印.传送数据到Word文档.发送E-MAIL.自动产生表格.Excel数据统计.圆饼图,直方图显示.自动报表生成.播放幻灯.doc ...

  3. VC++ 操作Word

    摘要: 使用VC编程来操纵Office.你可以实现诸如:Word文件打印.传送数据到Word文档.发送E-MAIL.自动产生表格.Excel数据统计.圆饼图,直方图显示.自动报表生成.播放幻灯.doc ...

  4. VC操作word和excel文件,查询与读写[依赖office环境]

    2016-07-26 10:15AM 田海涛>>记录>>合肥工业大学 由于孟师兄的碗扣式支架建模系统需求,须在程序中加入office相关处理,具体为读取excel文件与生成wo ...

  5. VC 操作word部分代码(利用剪切板取得Word中的图片,ClipBoard, Addpicture)

    在32位WIN7 VS2012环境下测试通过,在64位WIN7 VS2013环境下GlobalLock和GlobalSize函数返回NULL,具体参见注释 // 读取给定文件名的Doc文档中的数据 B ...

  6. 随笔之:VC操作Word系列(四)

    上一回讲了如何合并单元格,这次来说说如何填充单元格以及如何对合并后的单元格的内容让他居中显示这样能够看得舒服一点:).代码如下所示: void CWordTestDlg::TestWord4() { ...

  7. VC 操作Word, Excel 出现服务器正在运行中 Ole Server Busy对话框的原因分析和解决建议

    问题描述: 最近帮朋友弄个程序,处理Office Excel表.该Excel表加了密码,并且含有很多数据,当在VC中通过 Excel Ole对象打开该Excel文档时候,出现 "服务器正在运 ...

  8. c++ 操作Word

    摘要: 使用VC编程来操纵Office.你可以实现诸如:Word文件打印.传送数据到Word文档.发送E-MAIL.自动产生表格.Excel数据统计.圆饼图,直方图显示.自动报表生成.播放幻灯.doc ...

  9. VC操作Excel2003,Word2003的两种方式

    开发工具:vs2008+sp1 office:2003及一上版本(开发引入office11,实际使用软件office14) 在工作中很多次遇到需要操作office文件的内容,上网搜索查询资料,查到的大 ...

最新文章

  1. 如何获取shell脚本中某条语句的执行时间
  2. 开源 java CMS - FreeCMS2.3员
  3. python不同曲线设置标签_【图像分类】基于Pascal VOC2012增强数据的多标签图像分类实战...
  4. C++基础与深度解析第六章:函数
  5. 校友录管理系统设计c语言,校友录管理系统分析设计分析.doc
  6. Failed installing ‘Tomcat8‘ service?
  7. Matlab App Designer自学笔记(三):利息计算器案例
  8. 云片网短信模版自定义变量的替换内容
  9. 电脑装windows和安卓双系统引导_Remix mini安卓电脑,玩的不只是Windows那张皮
  10. 手机点餐系统概述_廖师兄 微信点餐系统 springcloud学习笔记
  11. linux-CentOS-rpm、yum、源码安装
  12. 《统计学习方法》学习笔记(4)--k近邻法及常用的距离(or 相似度)度量
  13. 基于J2EE人事考勤管理系统设计与实现(论文+项目源码) 运行环境: idea ,maven,mysql
  14. Home键和返回键的区别
  15. 机器学习中的数学(上)
  16. 跨境电商东南亚平台Shopee、Lazada到底怎么样?如何高效补单?
  17. system.exe,alien32.exe,ftsKetNt.7ps,SysKetNt.Sys, iexpe.exe等1
  18. 浅析:S2B2C模式
  19. Linux之shell脚本循环语句for while until
  20. 3 海康视觉平台VisionMaster 上手系列:通讯

热门文章

  1. Vue Input 失去焦点 @blur事件 获得焦点 ref
  2. 【我的ASM学习进阶之旅】ASM 实现 Hook Lambda 和方法引用
  3. Python学习笔记—第二章—IPython
  4. 这些是不是程序员爱不释手的10款神级工具【萝卜青菜各有所爱】
  5. 受控组件和非受控组件的区别
  6. css基础伪类选择器与选择器权重以及盒子模型的用法演示
  7. 人工智能 人工智能一种_人工超级智能的最疯狂后果
  8. 单精度浮点数的数学计算
  9. 0715Python总结-文件相关操作,扩展模式及相关函数
  10. STM32学习记录0011——AD转换