点击此处直接获取应用
点击此处观看操作视频
遇到问题
工作日常中,经常需要去处理一些琐碎的任务,比如公司让你统计每个人的基本信息,你把excel模板发邮件给了各位同事,同事填好后都发送了给你,那么你将会面临灾难性统计工作:
此时的你将会怎么处理呢?你会把文件挨个打开,然后复制其基本信息,再逐个汇总到一起?如此重复的操作不仅使人感到枯燥,最重要的是耽误摸鱼的时间了。
那么有什么好的方法能快速处理这个问题呢?
解决方案
首先分析下每个excel中的结构,一般可分为表头和内容两个部分,我们在合并时只需要保留表头,再逐个追加各自的内容即可。
也就是说我们需要处理的就是“保留公共部分(表头),合并差异部分(内容)”,再凝练一下就是按行取并集。
我使用工科神器Matlab进行处理,在Matlab中有着这样一个函数能够直接处理并集:
A = [2 2 2; 0 0 1];
B = [1 2 3; 2 2 2; 2 2 2];
C = union(A,B.'rows');
返回结果为:
C =
0 0 1
1 2 3
2 2 2
但是此函数只能处理矩阵,对于像excel这种存在着文本、数字复合类型的文件来说,不能够直接用此方法处理,所以可以考虑构造一个映射表,将所有excel文件中单元格出现的内容映射到一个数字矩阵中,再对数字矩阵做并集处理,将得到的数字矩阵根据映射表反解回excel表格中,即可得到合并好的excel表格啦。
拿小红和小橙举例:
根据函数CreatNumMat与CheakRepetition构造一个映射表:
function NumMat = CreatNumMat(FileA)
global DataBase;
global IndexSum;
%数字映射 进行数字编码
NumMat = [];
[rowFileSum,colFileSum] = size(FileA);
for RowFile = 1:rowFileSum
for ColFile = 1:colFileSum
%如若存在数值型 转换为字符串类型
if isfloat(FileA{RowFile,ColFile})
FileA{RowFile,ColFile} = num2str(FileA{RowFile,ColFile});
end
%遍历数据库 进行无重储存
if IndexSum == 1
DataBase{IndexSum} = FileA{RowFile,ColFile};
IndexSum = IndexSum+1;
else
if ~CheakRepetition(DataBase,IndexSum,FileA{RowFile,ColFile})
DataBase{IndexSum} = FileA{RowFile,ColFile};
IndexSum = IndexSum+1;
end
end
%构建映射表 与文件元胞数组一一对应
for Index = 1:IndexSum-1
if strcmp(DataBase{Index},FileA{RowFile,ColFile})
NumMat(RowFile,ColFile) = Index;
end
end
end
end
end
function Res = CheakRepetition(DataBase,LengthDataBase,FileCell)
Res = 0;
for IndexDataBase = 1:LengthDataBase-1
if strcmp(DataBase{IndexDataBase},FileCell)
Res = 1;
return
end
end
end
映射表如下:
根据此映射表将小红与小橙的信息解算为数字矩阵:
小红:
小橙:
将小红与小橙进行并集计算:
再将此数字矩阵进行反解为excel表格:
创建应用
为了让大家能够痛快摸鱼,本着辛苦我一人,幸福千万家的原则,给大家制作了一个方便使用的GUI应用:
点击数据导入按键即可选择excel文件,可进行多个文件选择,在是否选中可以将需要执行汇总的表格文件进行勾选,点击执行汇总可弹出一个excel文件,且文件中已经汇总好信息。