MFC之word操作

MFC对word操作

背景说明

当对程序的内容进行输出时,比如自定义对象属性描述或者注释(详细设计)生成文档时,如果采用手动输入会比较麻烦,并且当程序变动时,需要再一次修改对应文档,作为程序员做重复性工作非常难受。代码的意义就是为了自动化流程,减少重复性工作。这里以MFC框架下对word进行读写操作为例,其他语言也有类似接口。

MFC与word接口

前期准备工作可以参考MFC程序创建word,创建表格,写入数据。我用的是Office365,编辑器是vs2022。借助模板插入标签的方法来写入(实际上借助标签来定位并插入文字图片)主要是完成了如下工作,

  1. 插入图片及文本
  2. 设定页脚页眉
  3. 插入表格
  4. 设定表格宽度
  5. 设置表格内容和字体
  6. 读取表格内容以及标题

但是暂时没有解决的

  1. 对目录进行更新目录或者域时总是失败
  2. 无法设置表格的标题
  3. 页眉插入图片失败
  4. 页脚设置页面数(比如page 1 of 100)失败,只能显示页面数1,2这种格式

具体使用了接口如下在这里插入图片描述

代码段

需要注意的是,MFC的COM组件操作word的表格或者行数时都是从1开始的,这与我们编写代码从0计算不一样。
头文件

#pragma once
#include "msword/CApplication.h"
#include "msword/CBookmark0.h"
#include "msword/CBookmarks.h"
#include "msword/CCell.h"
#include "msword/CCells.h"
#include "msword/CColumn.h"
#include "msword/CColumns0.h"
#include "msword/CDocument0.h"
#include "msword/CDocuments.h"
#include "msword/CFontWord.h"
#include "msword/CTable0.h"
#include "msword/CTables0.h"
#include "msword/CRange.h"
#include "msword/CSelection.h"
#include "msword/CnlineShape.h"
#include "msword/CHeaderFooter.h"
#include "msword/CHeadersFooters.h"
#include "msword/CPageSetup.h"
#include "msword/CnlineShapes.h"
#include "msword/CShading.h"
#include "msword/CParagraphFormat.h"
#include "msword/CSection.h"
#include "msword/CSections.h"
#include "msword/CPageNumber.h"
#include "msword/CPageNumbers.h"
#include "msword/CParagraph.h"
#include "msword/CParagraphs.h"
#include "msword/CBorder.h"
#include "msword/CBorders.h"
#include "msword/CRows.h"
#include "msword/CRow.h"
#include "msword/CTableOfContents.h"

class WordOperation
{
public:
	CApplication m_wordApp;
	CDocuments m_docs;
	CDocument0 m_docx;
	CBookmarks m_bookmarks;
	CBookmark0 m_bookmark;
	CRange m_range;
	CCell m_cell;
	CTables0 m_Tables;
	CTable0 m_Table;
	CSelection m_sel;
	CFontWord m_Font;
	CRows m_Rows;
	CColumns0 m_Columns;
	//第一个Section对应的页脚
	CHeaderFooter m_footer;
	//第一个Section对应的页眉
	CHeaderFooter m_Header;
	/// <summary>
	/// word中对应的目录
	/// </summary>
	CTableOfContents0 m_tableOfContents;
public:
	WordOperation(CString templateStr);
	~WordOperation();
	/// <summary>
	/// 将文档保存
	/// </summary>
	void SaveFile();
	/// <summary>
	/// 写入文本
	/// </summary>
	/// <param name="Text">要写入的内容</param>
	void WriteText(CString Text);
	/// <summary>
	/// 新建一段内容
	/// </summary>
	/// <param name="nCount">新建行数</param>
	void NewLine(int nCount = 1);
	/// <summary>
	/// 向新建段落写入内容
	/// </summary>
	/// <param name="Text">需要写入的内容</param>
	/// <param name="nCount">新建段落行数</param>
	void WriteTextToNewLine(CString Text, int nCount = 1);
	/// <summary>
	/// 将鼠标移到最后一行
	/// </summary>
	void EndLine();
	/// <summary>
	/// 插入分页符
	/// </summary>
	void InsertPageBreak();
	/// <summary>
	/// 设置字体样式
	/// </summary>
	/// <param name="blod">是否是粗体</param>
	/// <param name="Italic">是否斜体 默认值:非斜体</param>
	/// <param name="UnderLine">是否有下划线 默认值:无下划线</param>
	void SetFont(BOOL blod,BOOL Italic=FALSE,BOOL UnderLine = FALSE);
	/// <summary>
	/// 设置字体
	/// </summary>
	/// <param name="FontName">字体名称</param>
	/// <param name="FontSize">字体大小 默认值:9</param>
	/// <param name="FontColor">设置字体颜色 默认值:0</param>
	/// <param name="FontBackColor">设置字体背景色 默认值:0</param>
	void SetFont(CString FontName, int FontSize = 9, long FontColor = 0, long FontBackColor = 0);
	/// <summary>
	/// 获取当前表格指定行数和列数单元格文本
	/// </summary>
	/// <param name="Row">要获取单元格的行</param>
	/// <param name="column">要获取单元格的列</param>
	/// <returns></returns>
	CString GetCellText(int Row, int column);
	/// <summary>
	/// 设置表格宽度
	/// </summary>
	/// <param name="Column">表示设置对象Table的第Column列</param>
	/// <param name="columnWidth">需要设置的列宽数值:columnWidth</param>
	void SetTableColumnWidth(int Column, float columnWidth);
	/// <summary>
	/// 为文档添加目录
	/// </summary>
	void AddTableOfContents();
	/// <summary>
	/// 设置表格行数的高度
	/// <param name="Row">表示设置对象Table的第Row行</param>
	/// <param name="RowHeigh">行高</param>
	/// </summary>
	void SetTableRowHeigh(int Row, float RowHeigh);
	/// <summary>
	/// 设置表格的对齐方式
	/// </summary>
	/// <param name="Alignment">设置对齐的方式 1:居中对齐 2:右对齐 3:左对齐</param>
	void SetTableAlignment(int Alignment);
	/// <summary>
	/// 创建表格
	/// </summary>
	/// <param name="Row">表格的行数</param>
	/// <param name="Column">表格的列数</param>
	/// <param name="tableName">表格名称</param>
	void CreateTable(int Row, int Column,CString tableName);
	/// <summary>
	/// 将单元格拆分
	/// </summary>
	void SplitTable(int RowSource, int ColumnSource, int RowNum, int ColumnNum);
	/// <summary>
	/// 合并单元格
	/// </summary>
	void MergeTable(int RowSource, int ColumnSource, int RowGoal, int ColumnGoal);
	/// <summary>
	/// 设置表格的单元格字体
	/// </summary>
	/// <param name="Row">单元格所在的行</param>
	/// <param name="Column">单元格所在的列</param>
	/// <param name="FontName">字体名称</param>
	/// <param name="FontSize">字体大小</param>
	/// <param name="FontColor">字体颜色</param>
	/// <param name="FontBackColor">字体背景色</param>
	void SetTableFont(int Row, int Column, CString FontName, int FontSize, long FontColor = 0, long FontBackColor = 0);
	/// <summary>
	/// 将光标移动到标签指定范围
	/// </summary>
	/// <param name="bookmarkText">标签名称</param>
	void SetCurToBookmark(CString bookmarkText);
	/// <summary>
	/// 设置表格的单元格内容
	/// </summary>
	/// <param name="Row">单元格所在的行</param>
	/// <param name="Column">单元格所在的列</param>
	/// <param name="Text">写入单元格内容</param>
	void WriteCellText(int Row, int Column, CString Text);
	/// <summary>
	/// 设置表格背景颜色
	/// </summary>
	/// <param name="Row">单元格所在行</param>
	/// <param name="Column">单元格所在列</param>
	/// <param name="ShadingColor">背景色</param>
	void SetTableShading(int Row, int Column, long ShadingColor = 0);
	/// <summary>
	/// 保存word
	/// </summary>
	/// <param name="FileName">保存路径</param>
	/// <param name="SaveType">保存类型</param>
	/// <returns></returns>
	BOOL SaveAs(CString FileName, int SaveType);
	/// <summary>
	/// 插入指定路径的图片
	/// </summary>
	/// <param name="fileName">图片所在路径</param>
	void InsertShapes(CString fileName);
	/// <summary>
	/// 插入位图图片
	/// </summary>
	/// <param name="pBitmap">位图指针</param>
	void InsertShapes(CBitmap* pBitmap);
	/// <summary>
	/// 设置页眉
	/// </summary>
	/// <param name="HeaderText">页眉内容</param>
	void SetWordPageHeaderContent(CString HeaderText);
	/// <summary>
	/// 设置页脚
	/// </summary>
	/// <param name="FooterText">页脚内容</param>
	void SetWordPageFooterContent(CString FooterText);
	/// <summary>
	/// 获取指定表格前面的内容
	/// </summary>
	/// <param name="index">表格的排序</param>
	/// <returns></returns>
	CString GetTableBeforeName(int index);
	/// <summary>
	/// 获取当前文档中表格的数量
	/// </summary>
	/// <returns>文档中表格的数量</returns>
	int GetTableCount();
	/// <summary>
	/// 获取当前文档中所有表格的行数
	/// </summary>
	/// <returns></returns>
	int GetAllTableRowCount();
	/// <summary>
	/// 获取表格中指定行和列的单元格内容
	/// </summary>
	/// <param name="row">指定行</param>
	/// <param name="column">指定列</param>
	/// <returns>返回指定单元格内容</returns>
	CString GetTableCellText(int row, int column);
	/// <summary>
	/// 获取表格的行数
	/// </summary>
	/// <returns></returns>
	int GetTableColumnsNum();
	/// <summary>
	/// 获取表格的列数目
	/// </summary>
	/// <returns></returns>
	int GetTableRowsNum();
};


cpp文件:

#include "stdafx.h"
#include "WordOperation.h"
#include <comutil.h>
void WordOperation::CreateTable(int row, int column, CString tableName)
{
	CComVariant DefaultBehavior(1), AutoFitBehavior(2);
	if (!m_Tables.m_lpDispatch)
	{
		AfxMessageBox("创建表格对象失败");
		return;
	}
	else
	{
		m_Tables.Add(m_sel.get_Range(), row, column, &DefaultBehavior, &AutoFitBehavior);
		m_Table = m_Tables.Item(m_Tables.get_Count());
		CBorders borders = m_Table.get_Borders();//设置表格边框
		COleVariant covboderSingleLine((short)1), covboderOutSideLine((short)13);
		borders.put_InsideLineStyle(1);//设置内部框线为单线条
		borders.put_OutsideLineStyle(12);//设置外部框线为双线条
		long TableWidth = m_Table.get_PreferredWidth();
		m_Rows = m_Table.get_Rows();
		m_Columns = m_Table.get_Columns();
		SetTableAlignment(1);
		/*LPTSTR lpsz = tableName.GetBuffer();
		m_Table.get_Title();
		m_Table.put_Title(lpsz);//这里会报错,设置标题会莫名奇妙的失败*/
		//tableName.ReleaseBuffer();
		//m_Table.put_PreferredWidth(300);
	}
}
/// <summary>
/// 拆分单元格
/// </summary>
/// <param name="RowSource">需要被拆分单元格的行</param>
/// <param name="ColumnSource">需要被拆分单元格的列</param>
/// <param name="RowNum">拆分的单元格行数</param>
/// <param name="ColumnNum">拆分的单元格列数</param>
void WordOperation::SplitTable(int RowSource, int ColumnSource, int RowNum, int ColumnNum)
{
	COleVariant RowNumVariant((short)RowNum), ColumnNumVariant((short)ColumnNum);
	CCell(m_Table.Cell(RowSource, ColumnSource)).Split(RowNumVariant,ColumnNumVariant);
}
/// <summary>
/// 获取当前表格指定行数和列数单元格文本
/// </summary>
/// <param name="Row">要获取单元格的行</param>
/// <param name="column">要获取单元格的列</param>
/// <returns></returns>
CString WordOperation::GetCellText(int Row, int column)
{
	CCell m_cell = CCell(m_Table.Cell(Row, column)); //如果被合并的单元格无法访问,这里会直接抛出“所要求的集合不存在",并且无法捕获这个异常
	CRange cellRange = CCell(m_Table.Cell(Row, column)).get_Range();
	CString Celltext = cellRange.get_Text();
	int indexR = Celltext.Find("\r");//去除字符串中的\r\n
	Celltext = Celltext.Left(indexR);
	Celltext.TrimLeft();
	Celltext.TrimRight();
	return Celltext;
}
/// <summary>
/// 合并单元格
/// </summary>
/// <param name="RowSource">发起合并单元格的行</param>
/// <param name="ColumnSource">发起合并单元的列</param>
/// <param name="RowGoal">需要被合并单元格的行</param>
/// <param name="ColumnGoal">需要被合并单元格的列</param>
void WordOperation::MergeTable(int RowSource, int ColumnSource, int RowGoal, int ColumnGoal)
{
	CCell(m_Table.Cell(RowSource, ColumnSource)).Merge(m_Table.Cell(RowGoal, ColumnGoal));
	CCell(m_Table.Cell(RowSource, ColumnSource)).put_VerticalAlignment(1);//合并后居中
}
void WordOperation::SetTableFont(int row, int column, CString FontName, int FontSize, long FontColor, long FontBackColor)
{
	CCell ce = m_Table.Cell(row, column);
	ce.Select();
	CFontWord ft = m_sel.get_Font();
	ft.put_Name(FontName);
	ft.put_Size(FontSize);
	ft.put_Color(FontColor);
	CRange r = m_sel.get_Range();
	r.put_HighlightColorIndex(FontBackColor);
}
void WordOperation::SetTableColumnWidth(int column, float columnWidth)
{
	CColumn(m_Columns.Item(column)).put_PreferredWidth(columnWidth);
}
void WordOperation::SetTableAlignment(int Alignment)
{
	CRange curTableRange = m_Table.get_Range();
	CParagraphFormat curTableFormat = curTableRange.get_ParagraphFormat();
	curTableFormat.put_Alignment(Alignment);
	//CColumn(m_Columns.Item(column)).SetWidth();
}
void WordOperation::SetTableRowHeigh(int row, float RowHeigh)
{
	CRow(m_Rows.Item(row)).put_Height(RowHeigh);
}
void WordOperation::WriteCellText(int row, int column, CString Text)
{
	CCell ce = m_Table.Cell(row, column);
	ce.Select();
	m_sel.TypeText(Text);
}
void WordOperation::SetTableShading(int Row, int Column, long ShadingColor)
{
	CCell ce = m_Table.Cell(Row, Column);
	ce.Select();
	CShading s = ce.get_Shading();
	s.put_BackgroundPatternColor(ShadingColor);
}
void WordOperation::SaveFile()
{
	if (!m_docx.m_lpDispatch)
	{
		AfxMessageBox("Documents 对象没有建立 保存失败");
		return;
	}
	else
	{
		m_docx.Save();
		return;
	}
}
void WordOperation::WriteText(CString Text)
{
	m_sel.TypeText(Text);
}
void WordOperation::NewLine(int nCount)
{
	if (nCount <= 0)
	{
		nCount = 0;
	}
	else
	{
		for (int i = 0; i < nCount; i++)
		{
			m_sel.TypeParagraph();//新建一段
		}
	}
}
void WordOperation::WriteTextToNewLine(CString text, int nCount)
{
	NewLine(nCount);
	WriteText(text);
}
void WordOperation::AddTableOfContents()
{
	
}
void WordOperation::SetCurToBookmark(CString bookmarkText)
{
	m_bookmark = m_bookmarks.Item(&_variant_t(bookmarkText));
	m_range = m_bookmark.get_Range();
	long start = m_range.get_Start();
	long end = m_range.get_End();
	m_sel.SetRange(start, end);
}
void WordOperation::EndLine()
{
	m_sel = m_wordApp.get_Selection();
	m_sel.EndKey(COleVariant((short)6), COleVariant((short)0));
}
void WordOperation::InsertPageBreak()
{
	m_sel = m_wordApp.get_Selection();
	m_sel.InsertBreak(COleVariant((long)7));
}
void WordOperation::SetFont(BOOL Bold, BOOL Italic, BOOL underLine)
{
	if (!m_sel.m_lpDispatch)
	{
		AfxMessageBox("编辑对象失败,导致字体不能设置");
		return;
	}
	else
	{
		m_sel.put_Text("F");
		m_Font = m_sel.get_Font();//获得字体编辑对象		
		m_Font.put_Bold(Bold);		
		m_Font.put_Italic(Italic);
		m_Font.put_Underline(underLine);
		m_sel.put_Font(m_Font);
	}
}
void WordOperation::SetFont(CString FontName, int FontSize, long FontColor, long FontBackColor)
{
	if (!m_sel.m_lpDispatch)
	{
		AfxMessageBox("Select 为空,字体设置失败!");
		return;
	}
	m_sel.put_Text("a");
	m_Font = m_sel.get_Font();
	m_Font.put_Name(FontName);
	m_Font.put_Size(FontSize);
	m_Font.put_Color(FontColor);
	m_Font.put_ColorIndex(FontBackColor);
	m_sel.put_Font(m_Font);
}
void WordOperation::InsertShapes(CString imagePath)
{
	COleVariant vTrue((short)TRUE), vFalse((short)FALSE), vOpt((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
	CnlineShapes m_iShapes = m_sel.get_InlineShapes();
	CnlineShape m_ishape = m_iShapes.AddPicture(imagePath,vFalse,vTrue,vOpt);

}
void WordOperation::InsertShapes(CBitmap* pBitmap)
{
	if (OpenClipboard(NULL))
	{
		EmptyClipboard();
		SetClipboardData(CF_BITMAP, pBitmap->m_hObject);
		CloseClipboard();
		m_sel.Paste();
	}

}
BOOL WordOperation::SaveAs(CString FileName, int SaveType)
{
	CComVariant vTrue(TRUE);
	CComVariant vFalse(FALSE);
	CComVariant vOpt;
	CComVariant cFileName(FileName);
	CComVariant FileFormat(SaveType);
	COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
	COleVariant covFalse((short)FALSE);
	if (!m_docx.m_lpDispatch)
	{
		AfxMessageBox("Document 对象没有建立 另存为失败");
		return FALSE;
	}
	else
	{
		//保存之前更新一下目录
		//m_tableOfContents.UpdatePageNumbers(); 这个总是提示参数数目不对,不知道哪里的问题
		m_docx.SaveAs(COleVariant(FileName),covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional);
		//m_docx.Close(covFalse, covOptional, covOptional);
		AfxMessageBox(_T("生成 ") + FileName + _T(" 成功"));
	}
	return TRUE;
}
void WordOperation::SetWordPageHeaderContent(CString HeaderText)
{
	CRange headRange = m_Header.get_Range();
	headRange.put_Text(HeaderText);
}
void WordOperation::SetWordPageFooterContent(CString FooterText)
{
	CRange footRangeEcFir = m_footer.get_Range();
	footRangeEcFir.put_Text(FooterText);
	CPageNumbers m_pageNumbers = m_footer.get_PageNumbers();
	COleVariant covAlignCenter((short)1), covAlignInside((short)3), covAlignNumberLeft((short)0), covAlginOutSide((short)4), covAlignRight((short)2), covFalse((short)FALSE);
	m_pageNumbers.Add(covAlignRight, covFalse);
}
int WordOperation::GetTableRowsNum()
{
	m_Rows = m_Table.get_Rows();
	return m_Rows.get_Count();
}
int WordOperation::GetTableColumnsNum()
{
	m_Columns = m_Table.get_Columns();
	return m_Columns.get_Count();
}
CString WordOperation::GetTableCellText(int row, int column)
{
	m_cell = m_Table.Cell(row, column);
	CRange cellRange = m_cell.get_Range();
	return cellRange.get_Text();
}
int WordOperation::GetTableCount()
{
	return m_Tables.get_Count();
}
int WordOperation::GetAllTableRowCount()
{
	int RowCount = 0;
	for (int tableIndex = 1; tableIndex < GetTableCount(); tableIndex++)
	{
		CTable0 tempTable = m_Tables.Item(tableIndex);
		if (!tempTable.m_lpDispatch)
		{
			CRows tablesRows = tempTable.get_Rows();
			RowCount += tablesRows.get_Count();
		}
	}
	return RowCount;
}
/// <summary>
/// 根据当前表格搜索前方标题,一直找到内容为止,这里的内容就认为是表的标题
/// </summary>
/// <param name="index">表格的排序</param>
/// <returns>表格标题</returns>
CString WordOperation::GetTableBeforeName(int index)
{
	CString tableName = "";
	m_Table = m_Tables.Item(index);
	CRange tableRange = m_Table.get_Range();
	CParagraphs tableParagraphs = tableRange.get_Paragraphs();
	CParagraph tableFirstPara = tableParagraphs.get_First();
	int startIndex = 1;
	while (tableName.IsEmpty() || tableName == "\r" || tableName == "\t\r" || tableName == " \r")
	{
		COleVariant covCount((short)startIndex);
		CParagraph tableBeforePara = tableFirstPara.Previous(covCount);
		CRange previousTextRange = tableBeforePara.get_Range();
		tableName = previousTextRange.get_Text();
		tableName.Trim();
		startIndex++;
	}
	/*int tableStart = tableRange.get_Start();
	int tableEnd = tableRange.get_End();
	CParagraphs paragraphs = m_docx.get_Paragraphs();
	int paragraphCount = paragraphs.get_Count();*/
	/*for (int iPara = 1; iPara < paragraphCount; iPara++)
	{
		CParagraph para = paragraphs.Item(iPara);
		CRange para_Range = para.get_Range();
		int para_RangeStart = para_Range.get_Start();
		int para_RangeEnd = para_Range.get_End();
		if (para_RangeStart >= tableStart)
		{
			break;
		}
		CString paraRangeText = para_Range.get_Text();
		if (paraRangeText != "\r" && paraRangeText != "\t\r" && paraRangeText != " \r")
		{
			tableName = paraRangeText;
		}
	}*/
	return tableName;
}
WordOperation::WordOperation(CString templateStr)
{
	COleVariant covZero((short)0), covTrue((short)TRUE), covFalse((short)FALSE), covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR), covDocxType((short)0), start_line, end_line, dot(templateStr);
	if (!m_wordApp.CreateDispatch(_T("Word.Application")))
	{
		AfxMessageBox(_T("本机没有安装word产品!"));
		return;
	}

	m_wordApp.put_Visible(FALSE);
	CString wordVersion = m_wordApp.get_Version();
	m_docs = m_wordApp.get_Documents();
	if (!m_docs.m_lpDispatch)
	{
		AfxMessageBox("Documents创建失败!", MB_OK | MB_ICONWARNING);
		return;
	}
	m_docx = m_docs.Add(dot, covOptional, covOptional, covOptional);
	if (!m_docx.m_lpDispatch)
	{
		AfxMessageBox("Document获取失败", MB_OK | MB_ICONWARNING);
		return;
	}
	m_bookmarks = m_docx.get_Bookmarks();
	m_Tables = m_docx.get_Tables();
	m_sel = m_wordApp.get_Selection();
	if (!m_sel.m_lpDispatch)
	{
		AfxMessageBox("Selection获取失败");
	}
	CSections m_wordSections = m_docx.get_Sections();
	CSection m_wordSection = m_wordSections.get_First();
	CHeadersFooters m_wordSecHeaderFooters = m_wordSection.get_Headers();
	CHeadersFooters m_wordFooters = m_wordSection.get_Footers();
	m_footer = m_wordFooters.Item(1);
	m_Header = m_wordSecHeaderFooters.Item(1);
	m_tableOfContents = m_docx.get_TablesOfContents();
	if (!m_tableOfContents.m_lpDispatch)
	{
		AfxMessageBox("目录获取失败");
	}
	else
	{
		/*m_tableOfContents.get_Application();
		long lowLevel = m_tableOfContents.get_LowerHeadingLevel();
		long uperLevel = m_tableOfContents.get_UpperHeadingLevel();
		CRange m_tableOfConRange = m_tableOfContents.get_Range();
		m_sel.SetRange(m_tableOfConRange.get_Start(),m_tableOfConRange.get_End());
		m_tableOfContents.UpdatePageNumbers(); // 无法定位到具体的目录,这个只能手动更新了*/
	}
	//CHeaderFooter m_footObj = m_wordSecHeaderFooters.Item(2);
	//BOOL m_isFootObjHeader = m_footObj.get_IsHeader();
	//CRange headRange = m_Header.get_Range();
	//CRange footRange = m_footObj.get_Range();
	//CRange footRangeEcFir = m_footer.get_Range();
	//BOOL m_bisHeader = m_Header.get_IsHeader();
	//BOOL m_bIsHeader = m_footer.get_IsHeader();
	/*int index = m_Headfoot.get_Index();
	LPDISPATCH pageNums = m_Headfoot.get_PageNumbers();
	LPDISPATCH parent = m_Headfoot.get_Parent();
	LPDISPATCH tm = m_Headfoot.get_Shapes();*/
	//CString strHeader = headRange.get_Text();
	//CString strFooter = footRange.get_Text();
	//CString strFootRange = footRangeEcFir.get_Text();
	//footRangeEcFir.put_Text("测试页脚部分");
	/*int curPageNum = m_sel.get_Information(3).bVal;
	CString curPageStr = "";
	curPageStr.Format("%d", curPageNum);
	footRangeEcFir.InsertAfter("Page");*/
	//footRangeEcFir.get_Fields(COleVariant((long)wdFieldFormText))
	//footRangeEcFir.InsertAfter(curPageStr);
	//headRange.put_Start(0);
	/*CRange headLogoRange=headRange.get_ShapeRange();
	COleVariant vTrue((short)TRUE), vFalse((short)FALSE), vOpt((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
	CnlineShapes m_iShapes = headRange.get_InlineShapes();
	int numShapes = m_iShapes.get_Count();
	CnlineShape shape_Insert = m_iShapes.Item(1);
	CRange shape_Range = shape_Insert.get_Range();
	m_sel.SetRange(shape_Range.get_Start(), shape_Range.get_End());
	CnlineShape m_ishape = m_iShapes.AddPicture(_T("C:\\Users\\yhwan\\Pictures\\logo\\RSIC.png"), vFalse, vTrue, vOpt);
	m_ishape.put_Width(100);
	m_ishape.put_Height(36);*/
	//headRange.put_Text("测试页眉");
	/*headRange.InsertBefore("测试头部前插入");
	headRange.InsertAfter("测试头部后插");*/
	//footRange.put_Text("页脚测试");
}

WordOperation::~WordOperation()
{
	COleVariant covZero((short)0), covTrue((short)TRUE), covFalse((short)FALSE), covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR), covDocxType((short)0), start_line, end_line;
	m_docx.Close(covFalse, covOptional, covOptional);
	//m_docx.Close(covFalse, covOptional, covOptional);
	m_wordApp.Quit(covOptional, covOptional, covOptional);
	m_range.ReleaseDispatch();
	m_Tables.ReleaseDispatch();
	m_bookmarks.ReleaseDispatch();
	m_sel.ReleaseDispatch();
	m_wordApp.ReleaseDispatch();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/871994.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ASP.NET Core 入门教程一 创建最小 API

构建最小 API&#xff0c;以创建具有最小依赖项的 HTTP API。 它们非常适合需要在 ASP.NET Core 中仅包括最少文件、功能和依赖项的微服务和应用。 本教程介绍使用 ASP.NET Core 生成最小 API 的基础知识。 启动 Visual Studio 2022 并选择“创建新项目”。 在“创建新项目”…

移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——6.vector(模拟实现)

1.存储结构 namespace zone {template<class T> //需要模板class vector{public:private:iterator _start;iterator _finish;iterator _endofstorage;}; } 可见&#xff0c;vector内核是由三个指针实现的 2.默认成员函数 2.1.构造函数 1.初始化列表 vector() :_star…

linux 磁盘满了,程序运行失败,如何处理?df -h

场景&#xff1a;紧急呼救&#xff0c;上传图片失败了。我一脸懵&#xff0c;服务器这是又咋地了&#xff0c;别邪乎姐姐&#xff0c;姐姐胆子小啊。 一、寻找问题原因 1、OSS出问题了&#xff1f; 然后我尝试了 IOS 的APP是没问题的&#xff0c;Android提示上传失败&#xf…

IIS发布打包后文件

1.打开IIS软件 2 添加网站&#xff0c; 自定义网站名称-选择要放置的资源路径-选择IP地址 3.打开放置的资源目录放置打包后文件 4.选择浏览 搜索不到IIS可进行一下操作 控制面板-程序和功能-启用或关闭windows功能-勾选IIS

Linux之数字证书

新书速览|Ubuntu Linux运维从零开始学_ubuntu linux运维从零开始学 pdf 下载-CSDN博客 《Ubuntu Linux运维从零开始学&#xff08;Linux技术丛书&#xff09;》(肖志健)【摘要 书评 试读】- 京东图书 (jd.com) 随着网络环境的恶化&#xff0c;人们已经逐渐抛弃网络上面的明文…

【python】灰色预测 GM(1,1) 模型

文章目录 前言python代码 前言 用 python 复刻上一篇博客的 Matlab 代码。 【学习笔记】灰色预测 GM(1,1) 模型 —— Matlab python代码 # %% import numpy as np import statsmodels.api as sm import matplotlib.pyplot as plt from matplotlib.pylab import mplmpl.rcPa…

江协科技STM32学习- P4 新建工程

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

模拟笔试 - 卡码网周赛第三十一期(23年百度笔试真题)

难度适中&#xff0c;动态规划出现的比例还是比较高的&#xff0c;要好好掌握&#xff0c;二分查找的点也是比较灵活的。&#xff08;A卷和B卷第一道题是一样的&#xff09; 题目一&#xff1a;讨厌鬼的组合帖子 思路&#xff1a;这个题算是一个还不错的题&#xff1b; 本质就…

C语言每日好题(3)

有任何不懂的问题可以评论区留言&#xff0c;能力范围内都会一一回答 #define _CRT_SECURE_NO_WARNING #include <stdio.h> #include <string.h> int main(void) {if ((strlen("abc") - strlen("abcdef")) > 0)printf(">\n")…

【图文并茂】ant design pro 如何优雅地把删除和批量删除功能合并到一起,并抽出来成为组件

如上图所示&#xff0c;其实批量删除和删除应该算是一个功能 只是删除一个或多个的区别 那么接口应该用的同一个 删除一个的时候呢&#xff0c;就传 一个对象_id 过去 删除多个的时候&#xff0c;就传 多个 对象 _id 的数组过去 后端 const deleteMultipleRoles handleAs…

软件测试-测试分类

测试分类 按照测试目标测试 界面测试 页面内展示的所有内容/元素都需要测试 参考UI图找不同 功能测试 ​ 如何设计功能测试用例&#xff1f; 参考产品规格说明书进行用例的编写&#xff0c;具体的测试用例需要使用黑盒设计测 试用例的方法&#xff0c;如等价类、边界值、…

嵌入式学习——(Linux高级编程——线程控制)

线程的互斥 一、互斥的重要性 在多线程编程中&#xff0c;互斥机制至关重要。当多个线程同时访问临界资源时&#xff0c;如果没有有效的互斥控制&#xff0c;可能会导致数据不一致、资源竞争等问题。通过互斥锁&#xff0c;可以确保在任何时刻只有一个线程能够访问临界资源&am…

PHPShort轻量级网址缩短程序源码开心版,内含汉化包

需要网址缩短并且想获得更多有关链接点击率和流量的数据分析&#xff0c;那么 PHPShort 可能是一个非常好的选择。PHPShort 是一款高级的 URL 缩短器平台&#xff0c;可以帮助你轻松地缩短链接&#xff0c;并根据受众群体的位置或平台来定位受众。 该程序基于 Laravel 框架编写…

python构建一个web程序

from flask import Flaskapp Flask(__name__)app.route(/) def hello_world():return 欢迎来到我的Python Web程序!if __name__ __main__:app.run(debugTrue)1、安装flask D:\Users\USER\PycharmProjects\pythonProject1\p01>pip install flask WARNING: Ignoring invalid…

多线程中常见问题

1、为什么不建议使用Executors来创建线程池&#xff1f; 除开有可能造成的OOM外&#xff0c;使用Executors来创建线程池也不能自定义线程的名字&#xff0c;不利于排查问题&#xff0c;所以建议是直接使用ThreadPoolExecutor来定义线程池&#xff0c;这样可以灵活控制 2、线程…

2 种方式申请免费 SSL 证书,阿里云 Certbot

如何使用免费的 SSL 证书&#xff0c;有时在项目中需要使用免费的 SSL 证书&#xff0c;Aliyun 提供免费证书&#xff0c;三个月有效期&#xff0c;可以直接在aliyun 申请&#xff0c;搜索 SSL 证书&#xff0c;选择测试证书。 Aliyun 证书需要每三月来来换一次&#xff0c;页…

线程优先级调度

Windows优先级调度算法 系统维护了一个全局的处理器数组KiProcessorBlock&#xff0c;其中每个元素对应于一个处理器的KPRCB对象。其次&#xff0c;另有一个全局变量KiIdleSummary记录了哪些处理器当前是空闲的。所谓一个处理器是空闲的&#xff0c;是指该处理器正在执行空闲循…

根据状态的不同,显示不同的背景颜色

文章目录 前言HTML模板部分JavaScript部分注意&#xff1a;主要差异影响如何处理示例 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 实现效果&#xff1a; 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 根据给定的状态…

内网安全:跨域攻击

目录 获取域信息 利用域信任密钥获取目标域 利用krbtgt哈希值获取目标域 内网中的域林&#xff1a; 很多大型企业都拥有自己的内网&#xff0c;一般通过域林进行共享资源。根据不同职能区分的部门&#xff0c;从逻辑上以 主域和子域进行区分&#xff0c;以方便统一管理。在…

基于x86 平台opencv的图像采集和seetaface6的图像质量评估功能

目录 一、概述二、环境要求2.1 硬件环境2.2 软件环境三、开发流程3.1 编写测试3.2 配置资源文件3.2 验证功能一、概述 本文档是针对x86 平台opencv的图像采集和seetaface6的图像质量评估功能,opencv通过摄像头采集视频图像,将采集的视频图像送给seetaface6的图像质量评估模块…