C++操作excel,即使函数设置了不备份,但保存后,excel依然会自动生成备份文件的原因分析,及如何来禁止自动备份

news2024/11/13 7:58:40

开发环境

操作系统:windows 10
编译器:Visual Studio 2010、2015、2017、2022
office 2016、2019、2021
wps 2019、2024

问题描述

通过C++操作excel,保存后,excel会自动生成备份文件。

void CExcelDemoDlg::OnBnClickedButton1()
{
	CApplication app;          //Excel应用程序接口
	CWorkbooks books;         //工作薄集合
	CWorkbook book;          //工作薄
	CWorksheets sheets;         //工作表集合
	CWorksheet sheet;          //工作表
	CRange range;                 //Excel中针对单元格的操作都应先获取其对应的Range对象
	CFont0 font;
	CRange cols;
	CRange iCell;
	LPDISPATCH lpDisp;
	COleVariant vResult;
	COleVariant	covTrue((short)TRUE);
	COleVariant covFalse((short)FALSE);
	COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

	//初始化
	if (!app.CreateDispatch("Excel.Application"))
	{
		this->MessageBox("无法创建Excel应用!");
		return;
	}

	app.put_Visible(FALSE);     //可见
	app.put_UserControl(TRUE); //用户可控制

	//打开XLS文件
	books.AttachDispatch(app.get_Workbooks());
	lpDisp = books.Open("C:\\test\\excel\\test.xlsx",
		covOptional, covOptional, covOptional, covOptional, covOptional,
		covOptional, covOptional, covOptional, covOptional, covOptional,
		covOptional, covOptional, covOptional, covOptional);

	book.AttachDispatch(lpDisp);
	sheets.AttachDispatch(book.get_Worksheets());

	LPDISPATCH lpSheets = sheets.get_Item(_variant_t(1));
	sheet = sheets.Add(covOptional, _variant_t(lpSheets), _variant_t(1), covOptional);
	//sheet.AttachDispatch(lpSheets);
	lpSheets->Release();
	
	range.AttachDispatch(sheet.get_UsedRange());

	sheet.get_Cells();
	range.get_Cells();

 	VARIANT var = range.get_Item(_variant_t(1), _variant_t(1));
	VariantClear(&var);
	

	//book.Save(); 
	book.SaveAs(_variant_t("C:\\test\\excel\\test.xlsx"), vtMissing, vtMissing, vtMissing, vtMissing,
		_variant_t(FALSE), 0, vtMissing, vtMissing, vtMissing, vtMissing, vtMissing, vtMissing);
	book.Close(covOptional, COleVariant("C:\\test\\excel\\test.xlsx"), covOptional);
	books.Close();

	//释放对象(相当重要!)
	range.ReleaseDispatch();
	
	sheet.ReleaseDispatch();
	sheets.ReleaseDispatch();
	
	book.ReleaseDispatch();
	books.ReleaseDispatch();
	//App一定要释放,否则程序结束后还会有一个Excel进程驻留在内存中,而且程序重复运行的时候会出错
	app.Quit();
	app.ReleaseDispatch();
	

	AfxMessageBox("It's test mode2 End!!");
}

在这里插入图片描述

问题分析

1、起因是原本是正常的,之前测试人员也遇到过,但当时定位是excel另存为自动备份的原因。
在这里插入图片描述
2、我重装系统后,安装了office2016、wps 2019,然后无意间发现我也会自动备份了
于是开始着重分析,同样的安装包,同样的操作系统,重装系统居然就会自动备份了,很奇怪,于是,经过如下分析测试:

1、升级office 2016到office 2019,问题依然存在,再升级到office 2021,问题被解决(说明office版本可能有影响)
2、回退office版本到2016,然后卸载wps 2019,问题解决((说明WPS有影响))
3、在office版本为2016的前提下,升级wps 2019至当前最新版本,问题依然存在
4、在office版本为2016,并安装了WPS的前提下,打开wps安装目录,发现安装目录下有两个dll(wpsapi.dll及wpsapiex.dll)名字看着比较有影响,于是依次删除两个dll,发现wpsapiex.dll是有影响的,删除后,调用app.CreateDispatch("Excel.Application")会返回错误。
在这里插入图片描述
5、这就说明注册表出问题了,于是怀疑安装wps后,也可能很鸡贼的注册了一个名叫“Excel.Application”的注册表,于是准备去注册表搜搜
6、win+R打开运行窗口后,输入regedit,点确定
在这里插入图片描述
7、在HKEY_CLASSES_ROOT处右键-查找,在查找目标处输入“Excel.Application”,然后点查找下一个
在这里插入图片描述
8、其中分别在HKEY_CLASSES_ROOT和HKEY_CURRENT_USER里都找到一个“Excel.Application”
在这里插入图片描述
9、展开Excel.Application,点击CLSID,然后双击右侧内容,弹出窗口后,复制数据
在这里插入图片描述
10、在HKEY_CLASSES_ROOT处右键-查找,在查找目标处输入上一步复制的字符“{00024500-0000-0000-C000-000000000046}”,然后点“查找下一个”,在计算机\HKEY_CLASSES_ROOT\CLSID\下找到如下图所示:
在这里插入图片描述
11、展开,然后点击“LocalServer32”,查看右侧内容,正常,无疑问。
在这里插入图片描述
12、按F3继续查找下一个,然后在计算机\HKEY_CLASSES_ROOT\WOW6432Node\CLSID\下也找到一个,展开,然后点击“LocalServer32”,查看右侧内容,发现疑问,居然路径被改成wps的启动路径了!!!!!
在这里插入图片描述

解决方案

直接右键-重命名“LocalServer32”:
在这里插入图片描述
后面再次操作会自动生成这个文件夹,并且会将值改为默认的excel路径。
在这里插入图片描述

备注:这里不能删除这个文件夹,我也没搞清楚,删除后,运行的时候就找不到了,但备份却能自动生成,而且重命名后,后面计算机\HKEY_CURRENT_USER也会被自动修改,如下图。
总之就一句话:重命名就行,不用搞其他的,免得引起其他风险

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Open3D mesh 隐藏点移除

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 3.1原始点云 3.2去除隐藏点后的点云 Open3D点云算法汇总及实战案例汇总的目录地址: Open3D点云算法与点云深度学习案例汇总(长期更新&…

力扣 128. 最长连续序列

题目描述 我的思路 我的思路比较暴力,就是首先将数组从小到大进行排序,然后再依次遍历判断序列是否连续并时时更新连续序列的最长长度。比如示例1:nums [100, 4, 200, 1, 3, 2],第一步先将数组进行排序得到sort_nums [1, 2, 3,…

Android Studio(3) 使用 Kotlin DSL和 Gradle 8.7 打包远程库到 AAR 的自定义方法

背景介绍 在 Gradle 7.3 及更早版本中,通常使用 com.kezong.fat-aar 插件来打包远程库到 AAR 中,随着 Gradle 的不断升级,尤其是到 8.7 版本后,Kotlin DSL开发逐渐成为主流,fat-aar 社区没有更新,插件的兼容性问题逐渐显现。我探索一种新的自定义方法,能够在 Kotlin DS…

js逆向学习

目前本人大三下,想要学习js逆向同学的可以联系我:2697279763qq.com 上面是本人做的一些比较复杂的项目,还有很多简单的项目,这里给出图片。 还有一些简单的js逆向。 教你各种补充环境,各种js算法,教你各种底…

(软工) 四代软件架构

🔢前言 当今软件架构中,拥有四代软件架构。这四个都是基于所在时代,技术,需求等多种因素应运而生的。 在未来是否会有第五代软件架构,无人可知。笔者大胆推测,这第五代很可能与人工智能的大语言模型有关&…

Windows—UDP编程

Client骨架&#xff1a; #include <iostream> #include <WinSock2.h> #pragma comment(lib,"ws2_32.lib")int main() {//启动Winsock DLLWORD wVersionRequested MAKEWORD(2, 2);WSADATA lpWSAData;WSAStartup(wVersionRequested, &lpWSAData);//…

【数据结构】线性表的顺序表示(顺序表的定义和基本操作)

计算机考研408-数据结构笔记本之——第二章 线性表 2.2 线性表的顺序表示&#xff08;顺序表的定义和基本操作&#xff1a;初始化/插入/删除/查找&#xff09; 2.2.1 顺序表的定义 1.定义 顺序表是线性表的顺序存储。 所谓顺序存储&#xff0c;就是把逻辑上相邻的元素存储在物…

预约咨询小程序搭建开发,uniapp前端,PHP语言开发

目录 前言&#xff1a; 一、预约小程序搭建功能介绍 二、示例代码片段 前言&#xff1a; 预约咨询小程序适合需付费咨询和交流的场景&#xff1a;比如讲师,摄影,婚庆&#xff0c;美发,律师,心理等等支持商家入驻支持视频、图文、线下、电话等方式在线支付咨询。 一、预约小程…

代码随想录 刷题记录-14 回溯(3)字符串、子集、排列问题

字符串 1.131.分割回文串 思路 本题这涉及到两个关键问题&#xff1a; 切割问题&#xff0c;有不同的切割方式判断回文 切割问题&#xff0c;也可以抽象为一棵树形结构&#xff0c;如图&#xff1a; 回溯三部曲 递归函数参数 全局变量数组path存放切割后回文的子串&…

《计算机操作系统》(第4版)第5章 虚拟存储器 复习笔记

第5章 虚拟存储器 一 、虚拟存储器概述 1. 常规存储管理方式的特征和局部性原理 (1)特征 ①一次性。 ②驻留性。 (2)局部性原理 局部性原理表现在时间局部性和空间局部性两方面。 2.虚拟存储器的定义和特征 (1)虚拟存储器的定义 虚拟存储器是指具有请求调入功能和置换功能&…

java之表格数据存储

java之表格数据存储 摘要表格数据存储javabean 介绍javabean 设计类表格数据存储 摘要 本博客主要讲述java如何存储表格数据。 表格数据存储 在解决实际问题的时候&#xff0c;需要涉及到如何存储表格的数据&#xff0c;这里讲述了一种使用javabean的方法存储表格 javabea…

STM中的I2C

常见的几种通信接口 I2C总线定义 定义 I2C - Inter-Integrated Circuit&#xff1a;两线式 串行总线&#xff1a;说明处理器和外设之间只需两根信号线&#xff0c;分别是SCL时钟控制信号线和SDA数据线 SCL&#xff08;serial clock line&#xff09; 时钟控制信号线&#xff…

makefile文件基本语法

一、makefile文件基本介绍 Makefile 文件是 make 工具使用的配置文件&#xff0c;它定义了如何自动化构建项目的规则和命令。Makefile 文件的主要作用是指定如何编译和链接程序&#xff0c;以及管理文件之间的依赖关系&#xff0c;从而实现高效的构建过程。 1.1 Makefile 的基…

【FreeRTOS】队列实验-分发数据给多个任务(赛车游戏)

目录 0 前言1 队列实验_分发数据给多个任务(赛车游戏)2 赛车游戏2.1 game.c2.2 注册队列2.3显示汽车2.4隐藏汽车2.5 CarTask2.6 car_game2.7 MX_FREERTOS_Init 3 总结 0 前言 学习视频&#xff1a; 【FreeRTOS入门与工程实践 --由浅入深带你学习FreeRTOS&#xff08;FreeRTOS教…

如何用Python实现山东省旅游数据爬虫与K-means满意度分析

&#x1f393; 作者&#xff1a;计算机毕设小月哥 | 软件开发专家 &#x1f5a5;️ 简介&#xff1a;8年计算机软件程序开发经验。精通Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等技术栈。 &#x1f6e0;️ 专业服务 &#x1f6e0;️ 需求定制化开发源码提…

AI一键视频多语言配音/翻译工具:打造无缝多语言视频体验

在全球化的今天,视频内容的传播不再受限于地域和语言。然而,如何高效地将视频内容翻译成多种语言并保持其自然度和流畅性,一直是业界面临的挑战。为了解决这一难题,我们推出了一款智能视频多语言AI配音和翻译工具——Linly Dubbing。该工具基于YouDub-webui的灵感进行了创新…

开源:cuda studio云原生一站机器学习、深度学习、大模型AI平台

文章目录 1、 cuda studio云原生一站机器学习、深度学习、大模型AI平台2、网址 1、 cuda studio云原生一站机器学习、深度学习、大模型AI平台 cube studio开源云原生一站式机器学习/深度学习/大模型AI平台&#xff0c;支持sso登录&#xff0c;多租户&#xff0c;大数据平台对接…

3级线性反馈移位寄存器在C3=1时可有4种线性反馈函数,设其初始状态为(a1,a2,a3)=(1,0,1),求各线性反馈函数的输出序列及周期

标题是题目 题解 1.补充知识 2.分析四种情况&#xff1a; 结合我所给的反馈数公式以及a31&#xff0c;可以得到反馈函数为: fC1*a3⊕C2*a2⊕C3*a1C1*a3⊕C2*a2⊕a1 附&#xff1a;别把初始状态为&#xff08;a1,a2,a3&#xff09;(1,0,1)带入&#xff0c;因为a1,a2,a3的值…

小程序学习day11-生命周期函数、组件所在页面的生命周期、自定义组件的插槽、自定义组件的父子通信

40、自定义组件&#xff08;续&#xff09;&#xff08;续&#xff09; &#xff08;10&#xff09;生命周期函数 1&#xff09;小程序里的全部生命周期函数 ①created&#xff08;在组件刚被创建时执行&#xff09;&#xff08;被创建&#xff0c;但未被放入页面&#xff09…

【AD9361 数字基带】多片基带内FPGA补偿 I/Q Rotation

I/Q 旋转 Rotation 在许多多通道射频系统中&#xff0c;如 AD-FMCOMMS5&#xff0c;甚至在 AD-FMCOMMS2、AD-FMCOMMS3 上&#xff0c;都需要测量或校正两个复数 &#xff08;I/Q&#xff09; RF 信号之间的相位差。 从纯粹的数学描述来看&#xff0c;单个正弦波没有相位&…