MFC中操作Word文档

        首先我们需要导入word类库(电脑上需要安装了word),左击项目,点击类向导,添加类(C)选择类型库中的MFC类。本文章案例可点击下载。

         然后选择文件,位置选择从office安装目录中找到MSWORD.OLB文件,然后点击>>添加所有类。

         添加完成后,点击完成。

         可以发现word库已经被添加进来了,如下图:

         然后导入如下头文件,并且注释掉以下头文件(.h文件)的里面import导入的内容:

#include "CApplication0.h"   
#include "CDocuments0.h"    
#include "CDocument1.h"    
#include "CSelection0.h"     
#include "CRange0.h"      
#include "CBookmark1.h"    
#include "CBookmarks0.h" 
#include "CnlineShape.h" 
#include "CnlineShapes.h" 
需要注释的代码段

         然后,自己新建一个模板文档(.dot,或者随便新建一个word然后另存为dot,如下下图),在对应位置插入书签,因为这个是后面程序插入数据通过书签确定插入位置。

         最后提供一个简单插入数据的代码示例:

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(_T("C:\\Users\\Admin\\Desktop\\tmp.dot"));

	CApplication0 wordApp;
	CDocuments0 docs;
	CDocument1 docx;
	CBookmarks0 bookmarks;
	CBookmark1 bookmark;
	CRange0 range;
	CnlineShapes pInShapes;

	if (!wordApp.CreateDispatch(_T("Word.Application")))
	{
		AfxMessageBox(_T("本机没有安装word产品!"));
		return;
	}

	wordApp.put_Visible(FALSE);
	CString wordVersion = wordApp.get_Version();
	docs = wordApp.get_Documents();
	docx = docs.Add(dot, covOptional, covOptional, covOptional);
	bookmarks = docx.get_Bookmarks();

	CSelection0 sel = wordApp.get_Selection();//获取文档的selection
	pInShapes = sel.get_InlineShapes();

	//获取系统时间
	CString currentTime = CTime::GetCurrentTime().Format("%Y%m%d");

	//通过书签写入数据到word模板中
	bookmark = bookmarks.Item(&_variant_t(_T("title")));
	range = bookmark.get_Range();
	range.put_Text(currentTime);
	bookmark = bookmarks.Item(&_variant_t(_T("data1")));
	range = bookmark.get_Range();
	range.put_Text(_T("aaaaa"));
	bookmark = bookmarks.Item(&_variant_t(_T("data2")));
	range = bookmark.get_Range();
	range.put_Text(_T("bbbbb"));
	bookmark = bookmarks.Item(&_variant_t(_T("data3")));
	range = bookmark.get_Range();
	range.put_Text(_T("ccccc"));

	CString strSavePath = _T("C:\\Users\\Admin\\Desktop\\");
	strSavePath += (CString("word") + currentTime + CString(".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);
	pInShapes.ReleaseDispatch();
	sel.ReleaseDispatch();
	range.ReleaseDispatch();
	bookmarks.ReleaseDispatch();
	wordApp.ReleaseDispatch();
	AfxMessageBox(strSavePath + "生成成功!");

        运行后生成word,打开内容如下:

  • 1
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
串口是一种文本通信协议,它的传输速度比较慢,不适合传输大量的二进制数据,比如图片。但是,如果你要传输一些小图片,或者将一张大图片分成几个小块传输,那么串口也是可以实现的。 下面是一个简单的例子,它可以将 BMP 格式的图片分成若干个小块,并通过串口传输。这个例子使用了 MFC 的 CSerialPort 类来实现串口通信,使用了上面提到的将 BMP 文件转换为字节流的方法。注释已经加在了代码,希望能帮助你理解: ```cpp // 定义 BMP 文件头结构体 #pragma pack(push, 1) // 禁用字节对齐 struct BMPFileHeader { WORD bfType; // 文件类型,必须是 0x4D42 DWORD bfSize; // 文件大小,单位是字节 WORD bfReserved1; // 保留字段1,必须是 0 WORD bfReserved2; // 保留字段2,必须是 0 DWORD bfOffBits; // 从文件头到像素数据的偏移量,单位是字节 }; #pragma pack(pop) // 恢复字节对齐 // 定义 BMP 信息头结构体 #pragma pack(push, 1) struct BMPInfoHeader { DWORD biSize; // 信息头的大小,必须是 40 LONG biWidth; // 图像的宽度,单位是像素 LONG biHeight; // 图像的高度,单位是像素 WORD biPlanes; // 图像的位面数,必须是 1 WORD biBitCount; // 每个像素的位数,必须是 1、4、8、16、24 或 32 DWORD biCompression; // 压缩类型,可选值为 0、1、2、3、4 或 5 DWORD biSizeImage; // 像素数据的大小,单位是字节 LONG biXPelsPerMeter; // 水平分辨率,单位是像素每米 LONG biYPelsPerMeter; // 垂直分辨率,单位是像素每米 DWORD biClrUsed; // 使用的颜色数,如果为 0,则使用所有颜色 DWORD biClrImportant; // 重要的颜色数,如果为 0,则都重要 }; #pragma pack(pop) // 将 BMP 文件转换为字节流 BOOL BMPToBytes(const CString& filePath, BYTE*& bytes, DWORD& size) { // 加载 BMP 文件 CImage image; HRESULT hr = image.Load(filePath); if (FAILED(hr)) { return FALSE; } // 获取 BMP 文件头和信息头 BMPFileHeader fileHeader; BMPInfoHeader infoHeader; image.GetBMPHeader(fileHeader, infoHeader); // 计算像素数据的大小 DWORD imageDataSize = infoHeader.biSizeImage; if (imageDataSize == 0) { imageDataSize = infoHeader.biWidth * infoHeader.biHeight * (infoHeader.biBitCount / 8); } // 计算文件大小 DWORD fileSize = sizeof(BMPFileHeader) + sizeof(BMPInfoHeader) + imageDataSize; // 创建字节数组 bytes = new BYTE[fileSize]; // 将 BMP 文件头和信息头写入字节数组 memcpy(bytes, &fileHeader, sizeof(BMPFileHeader)); memcpy(bytes + sizeof(BMPFileHeader), &infoHeader, sizeof(BMPInfoHeader)); // 将像素数据写入字节数组 hr = image.GetBits(bytes + sizeof(BMPFileHeader) + sizeof(BMPInfoHeader), imageDataSize); if (FAILED(hr)) { delete[] bytes; bytes = nullptr; size = 0; return FALSE; } // 返回字节数组和大小 size = fileSize; return TRUE; } // 将 BMP 图片分成若干个小块,并通过串口传输 void SendImage(CSerialPort& serialPort, const CString& filePath, int blockSize) { // 将 BMP 文件转换为字节流 BYTE* imageData = nullptr; DWORD imageSize = 0; if (!BMPToBytes(filePath, imageData, imageSize)) { // 处理错误 return; } // 计算块数和最后一块的大小 int blockCount = (imageSize + blockSize - 1) / blockSize; int lastBlockSize = imageSize % blockSize; // 发送块数和最后一块的大小 serialPort.Write(&blockCount, sizeof(blockCount)); serialPort.Write(&lastBlockSize, sizeof(lastBlockSize)); // 逐个发送块 BYTE* ptr = imageData; for (int i = 0; i < blockCount; i++) { // 计算当前块的大小 int currentBlockSize = (i == blockCount - 1) ? lastBlockSize : blockSize; // 发送当前块的大小 serialPort.Write(&currentBlockSize, sizeof(currentBlockSize)); // 发送当前块的数据 serialPort.Write(ptr, currentBlockSize); // 将指针移到下一个块 ptr += currentBlockSize; } // 释放内存 delete[] imageData; } ``` 这个例子,我们使用 `BMPToBytes` 函数将 BMP 文件转换为字节数组,并使用 `CSerialPort::Write` 方法将字节数组发送到串口。由于串口通信速度较慢,我们将 BMP 图片分成若干个小块来发送。在发送之前,我们先计算出块数和最后一块的大小,并将它们先发送给接收端。然后,逐个发送每个块的数据。由于每个块的大小可能不一样,所以我们需要先发送当前块的大小,接收端在接收时也需要知道当前块的大小,以便正确地拼接数据。 请注意,这个例子使用了一个固定的块大小,你可以根据实际情况来调整块大小。另外,为了简单起见,这个例子只考虑了 BMP 格式的图片。如果你要处理其他格式的图片,代码会有所不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值