中有冒号 文件路径_用Matlab脚本文件实现Excel文件的合并

caf7015c9b8071f1b38a0194235db035.png

日常吐槽

前段时间跟同事聊天,同事洗脑了一个新的(扎心的)世界观,“人生分三个阶段,20岁时承认父母很平庸,30岁时承认自己很平庸,40岁时承认孩子很平庸”。这是这位同事在孩子学而思考试后的心得体会,他的年龄请对号入座。我正处在承认自己很平庸的路上肆意奔跑。不过,不光是什么年龄都有权对现实说不。(封面一般是我最近喜欢的电影)

8d3f51381675510c1e50f2245a14758c.png

来源

工程师嘛,目的性一般比较强。肯定是看着哪里不爽了,所以想优化方案。

之所以会有实现Excel文件自动合并的想法,是部门一百多人,每次统计个人意愿,体检信息等内容的时候,都是一个Excel模板,大家修改自己的那一行,然后邮件或者丢到网盘里面,最后一个人打开每个文件要ctrl C+ctrl V把大家的内容合并到一起,这种重复工作毫无意义。

分析如何实现

  • 工具:Matlab
  • 实现效果:最好能傻瓜式操作,最好能有交互窗口,进度条等,这样可以提升用户体验。
  • 实现思路:

1、对话框提示用户输入需要合并文件路径

2、对话框提示用户输入要合并的sheet表和范围(比如A1:C3)

3、将路径内的文件和范围写入到存储变量中,这个过程可能文件较多,最好有个进度条

4、对话框提示用户保存的文件路径和文件名

5、将数据依次保存到指定文件中

6、保存完成后弹出对话框提示用户完成合并

另外程序需要处理用户输入的非法值,比如用户在打开对话框中并没有点确定而是点了取消,程序最好能提示报错。

代码实现

clear
clc
%--- 弹出对话框提示用户选择要合并文件的路径Path = uigetdir('','选择要合并文件路径');%使用uigetdir调取路径
%判断用户是选择了路径还是点了取消
if Path == 0msgbox('路径选择无效,请重新运行程序','错误','error');%如果用户点了取消,系统默认会传递给path为0,这时弹出对话框提示选择错误,点击确认程序退出
else%---去除路径内的无效文件FileList = dir(Path);%使用dir获取路径下的文件列表NaN_data_index = find([FileList.bytes]==0);%使用find查找文件列表中空文件FileList(NaN_data_index) = [];%将空文件从文件列表中删除%---读取文件%提示用户输入excel表格sheet位置及内容范围trydlgPrompt= {'请输入要合并的表格位置','请输入要合并的范围'}; %两行提示信息dlgTitle='选择合并内容';%对话框标题dlgDims=[1 20;1 25];%输入文本框的尺寸dlgDefinput={'1','A1:H3'};%默认值sheet_num = inputdlg(dlgPrompt,dlgTitle,dlgDims,dlgDefinput);catchwarndlg('输入错误')end%循环读取文件内容,设置进度条m=0;%初始化,循环用file_path = [];%初始化,后面所有文件的路径放在这里面data_raw{length(FileList),1} = [];%初始化,后面读取的数据放在这里面h_waitbar=waitbar(m/length(FileList),'开始读取');%进度条for m = 1:length(FileList)str_waitbar = ['文件读取中,已完成:',num2str(m/length(FileList)*100),'%'];%进度条提示语句waitbar(m/length(FileList),h_waitbar,str_waitbar);%进度条更新file_path = fullfile(Path,FileList(m).name);%合并路径和文件名,便于后面文件读取[num,text,data] = xlsread(file_path,str2num(sheet_num{1}),sheet_num{2});%读取文件data_raw{m,1} = data;%循环一次,把data赋值一次endclose(h_waitbar);%关闭进度条%---写入文件   try[save_name,save_path] = uiputfile('merge_excel_.xlsx');%提示选择保存的路径和文件名catchwarndlg('输入错误');end%得到用户合并文件的行数position_num=split(sheet_num{2},':');%用冒号分割字符串,分别得到一个起点一个终点,如A1;B12re_pattern='[0-9]*';%正则表达式,把数字全部提出start_num=regexp(position_num{1},re_pattern,'match');%把起点的数字提出来,如1;stop_num=regexp(position_num{2},re_pattern,'match');%把终点的数字提出来,如12;range_sep=str2num(stop_num{1})-str2num(start_num{1})+1;%把字符串转换成数字,相减得间距%写入操作range_init = 1;%初始化range = 'A1';%初始化for n =1:length(FileList)status = xlswrite(fullfile(save_path,save_name),data_raw{n},1,range);%写入文件的sheet表默认是1status_num(n,1) = status;range = sprintf('A%d',range_init+n*range_sep);%移动写入的位置endnum_success=size(status_num);if  num_success(1) == length(FileList)%判断是否已经把全部文件写完str_success = sprintf('合并完成,共合并%d份文件,成功%d 份',length(FileList),sum(status_num));%显示的文本内容msgbox(str_success)end
clear
clc

实现效果

excel 原文件是这样的

072078b1d117312ece8f6d6a92253e76.png

把3行进行合并,合并后效果

8c0ecd7504f99308d8e0feae6d59f5c5.png

代码讲解

其实程序的注释,我已经写的很详细,如果还有不清楚的可以看下matlab帮助。这里就对写程序的时候一些废了点时间的地方说下:

1、我不知道我的文件夹里看着是有3个excel文件,但是dir读取后确实5个,其中2个是空的。

windows的实际显示效果

332b89382e94899bce7cb3cf8edb4374.png

读取后FileList的效果

464a3e058355ef2d79fc23371e334700.png

所以加了一段用文件

%---去除路径内的无效文件
FileList = dir(Path);%使用dir获取路径下的文件列表
NaN_data_index = find([FileList.bytes]==0);%使用find查找文件列表中空文件
FileList(NaN_data_index) = [];%将空文件从文件列表中删除

2、在写入到合并Excel文件的时候需要一个类似指针的东西,不断将写入起点下移,这样避免后面写入文件覆盖前面的。但是下移的量需要用‘A1:H13’这个字符串取得,比如这里13-1=12,这个下移量就是12。在这里我处理的方式是先用冒号将字符串分隔,然后用正则表达式分别取出两个字符串的数字部分,最后实现这两个数字的相减得到下移量。关于正则表达式需要自己查下,还是很有必要了解下的,之所以用正则表达式,而不是硬生生的把前面的A或者H砍掉,是因为用户可能会输入大的行数,比如‘D5:AC123’这时候字母和数字的个数是不定的,无法靠字符串的位来操作。

c565c3e41f6200d4f5441f24f53d37cf.png
%得到用户合并文件的行数position_num=split(sheet_num{2},':');%用冒号分割字符串,分别得到一个起点一个终点,如A1;B12re_pattern='[0-9]*';%正则表达式,把数字全部提出start_num=regexp(position_num{1},re_pattern,'match');%把起点的数字提出来,如1;stop_num=regexp(position_num{2},re_pattern,'match');%把终点的数字提出来,如12;range_sep=str2num(stop_num{1})-str2num(start_num{1})+1;%把字符串转换成数字,相减得间距

不完美

最后想说的是程序是不完美的,为什么暂时先不改了,主要是懒

1、对于用户的异常操作,比如应该输入‘A3:H3’,输入成'A:H',该点确认却点了取消等等(最不可靠的就是人类),虽然程序里尝试了if else和try catch,但不是为每个步骤都写了。

2、把文件全部读取到data,最后再一股脑儿都写入,我觉得效率有点低,大文件的话data会很大,占用过多内存。可以读取一个写入一个,这样data数据量有限。其实也好改只需要把写入的操作放入读取的for循环中。

3、另外写入的操作没有设置进度条。(其实解决了第二个,这个也就不是问题了)。

4、完成这个操作,其实也不算是把合并的工作全部完成,还需要把表头和序号填充好。刚兴趣的自己实践操作下,实现还是很简单的。

5、当然前台小妹一般才不装matlab,为了方便更多人使用,其实可以用matlab生成可执行exe文件,matlab Runtime了解下。网上教程很多,感兴趣的可以看看。

6、其他的欢迎指正探讨。有问题可以发我邮箱 283522085@qq.com

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

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

相关文章

2019计算机国二操作题,2019年3月计算机二级C++操作练习题及答案(十二)

一、程序改错题使用VC6.0打开考生文件夹下的源程序文件1.cpp,该程序运行时有错,请改正其中的错误,使程序正常运行,输出的结果为Constructor,i0,Destructor注意:错误的语句在//******error******…

最简单的一个 STL格式的网格文件

简介 最简单格式的一个STL格式的文件 文件内容 solid filenamestlfacet normal 1 1 1outer loopvertex 0 0 1vertex 0 1 0vertex 1 0 0endloopendfacet endsolid filenamestl 简单描述 solid filenamestlfacet normal 1 1 1//面的法向量outer loopvertex 0 0 1 // 顶点1vertex …

ntrip获取源列表_Ntrip协议简介(转)

1 什么是Ntrip?CORS(Continuously Operating Reference Stations)就是网络基准站,通过网络收发GPS差分数据。用户访问CORS后,不用单独架设GPS基准站,即可实现GPS流动站的差分定位。访问CORS系统,就需要网络通讯协议。N…

计算机数据与安全课件,计算机数据及软件的安全.ppt

计算机数据及软件的安全计算机数据及软件的安全一、计算机软件的安全问题 1、软件在计算机安全中的二重性 软件是计算机系统的重要组成部分。和硬件相比,软件是计算机系统的灵魂,用户通过软件才能使用计算机。 (1)计算机软件是系统安全保护的对象和安全控…

spring配置多视图解析器

最近做一个小项目(移动端),自己搭了个简单的SSM框架(spring spring MVC Mybitis),展示层本来选用的是jsp,各方便都已经搭建好,结果发现有些页面需要用到H5的一些功能,所以展示层需…

ios系统gps测试软件,GPS工具箱苹果版

GPS工具箱为用户准备的以手机GPS为基础的多功能位置服务的软件,它包括了很多非常实用的工具,包含线路追踪、测速、位置记录、面积测量等等,是GPS模块的功能发挥的非常充分到位,并且软件支持离线map和KML、KMZ导入导出、GPX文件导出…

建模实训报告总结_计算机三维建模实训报告

计算机三维建模实训报告实验时间:2014-6-23实验地点:明虹楼实验目的:理解三维CAD技术的相关概念和三维CAD的基础知识熟练CAD软件的基本操作,掌握软件的使用方法。能够更直观、更全面地反映设计意图,为将来从事计算机辅…

用统计功能计算机计算js,js实现计算器功能

本文实例为大家分享了js实现计算器功能的具体代码,供大家参考,具体内容如下知识点eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。代码如下js计算器计算器.h1{position: relative;color:blueviolet;font-size:50px;text-align…

方法的覆盖

【转载】类继承时方法覆盖问题。(static方法不能被”覆盖“) (2014-04-03 17:51:17) 转载▼在看TIJ4的144页说: “覆盖”只有在某方法是基类的接口的一部分时才会出现。 即,必须能将一个对象向上转型为他的基本类型并调用相同的方…

mysql 压力测试知乎_MySQL查看SQL语句执行效率和mysql几种性能测试的工具

网络中整理,记录下,朋友们应该用得到!Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看 SQL 语句的执行效 果,可以帮助选择更好的索引和…

恋与制作人 服务器错误,恋与制作人安装失败怎么办_恋与制作人安装失败解决方法_游戏吧...

恋与制作人是一款受到了很多玩家喜爱的游戏,游戏是奇迹暖暖原班人马打造的,但是却有玩家在安装时出现了安装失败的问题。下面游戏吧小编就为各位各位玩家带来了恋与制作人的安装失败解决方法。安装失败解决方法一、 安装软件时提示应用程序未安装或者提示…

create-react-app创建项目后运行npm run eject命令报错解决办法

用create-react-app创建项目,因要配置各种组件,比如babel,antd等, 需要运行npm run eject命令把项目的配置文件暴露出来,但是还是一如既然碰到报错,因为是在本地新创建的文件,没有添加git记录 解决办法&…

创宇技能表_知道创宇研发技能表 一

凡是以 知道创宇研发技能表 为标题的博客,所有内容均来自:知道创宇研发技能表虽然不是黑客,但这表里不少内容还是很有意思的,所以逐步看了整理到博客,感谢总结分享的同学。公司与个人公司是盈利性组织个人和公司必须双…

摩拜前端周刊第16期

Ladies and 乡亲们,摩拜前端周刊起航啦~ 摩拜前端团队会收集每周前端优秀文章,每周五发布至掘金平台,欢迎关注我们~ The higher I got, the more amazed I was by the view. [译] Javascript 中 Array.push 要比 Array…

python selenium自动化面试_18年selenium3+python3+unittest自动化测试教程(上)

第一章 自动化测试课程介绍和课程大纲1、自动化测试课程介绍简介:讲解什么是自动化测试和课程大纲讲解,课程需要的基础和学后的水平python3.7selenium3pycharm第二章自动化测试相关软件安装1、自动测试工具selenium介绍简介:介绍selenium自动化测试工具为…

wps的计算机在哪里设置密码,wps文件怎么设置和取消密码 wps文件密码设置和取消的步骤方法...

在wps制作文件时,有时候我们需要中途离开,但是担心其他用户不小心操作导致文件丢失,那么我们可以设置wps文件密码,这样就可以避免了,那么怎么将wps文件设置密码呢?其实设置方法非常简单,下面教程之家网为大…

this关键字实现串联构造函数调用

在一个类中如果需要实现多个自定义构造函数,通常做法是在构造函数中实现各自的业务逻辑,如果这些业务逻辑的实现并非截然不同的话,显然不符合oop编程思想,极不利于维护,当然,我们也可以通过将相同的逻辑部分封装成一个方法,但还有一种更为合理简单的方法,下面就通过…

python3.6.8卸载_CentOS7下安装python3.6.8的教程详解

由于最近有个任务需要在python环境下跑,项目是python3.6 tensorflow1.3.1.现总结安装环境:卸载Python3.6方法:首先用命令: whereis python 查看所要删除的python3.6文件位置然后用命令: rm -rf 删除安装Python3.6.8方法:一:单独使用Python, …

魔兽世界联盟物价稳定的服务器,一个残酷的真相!在《魔兽世界》怀旧服,女生一般都爱选联盟...

原标题:一个残酷的真相!在《魔兽世界》怀旧服,女生一般都爱选联盟随着《魔兽世界》经典旧世的人气渐涨,暴雪又追加了3组PVP服,让不少没能抢注到心仪昵称的玩家欣喜若狂。这样一来,原本就饱受争议的服务器选…

网格的补洞操作

简介 网格补洞操作&#xff0c;里面有有奖征集答案&#xff0c;欢迎大家踊跃回答。第一个留言为有效留言那个horse.off请到github下载 算法描述 找到网格的所有的边界半边。 for循环选定一个孔洞的关键点 以来点来遍历整个孔洞 补洞 代码 // 网格 补洞的操作#include <iostr…