一,项目需求

有一批原始Excel文件,每个文件里都有几千几万条记录,这些记录分别属于80多个机构。

例如:

指标xx.xls,包括:杭州银行,招商银行。。。等记录。

指标yy.xls,包括:上海银行,南京银行。。。等记录。

现在需要把这些机构的数据拆分出来,分别保存到独立的Excel文件里。

例如,将所有表格里的上海银行的资料,都抽取出来,放到一个workbook里,每个sheet分别是:指标xx,指标yy;其他银行类似。

二,难点

如果依靠人工手动去操作,那就麻烦了。假设15个文件,15*80=1200,那拆分数据,就需要手工复制黏贴1200次。有时候文件数量很多,有时候少一些,一般来说需要3.5天以上的时间,也就是28个小时以上。每个季度都会遇到一次这样的场景。(其实对于软件来说,文件多少都没影响,模式是一样的嘛。)

希望能够设计一个软件,在0.5小时内解决该问题。

三,解决办法

(一),方法一

第一步,拆分数据。

将每个原始Excel文件放到一个独立的文件夹里,例如:建立指标xx,指标yy。。等文件夹,每个文件夹里都有对应的一个文件。

编写一段vb代码,在Excel里执行,自动拆分数据,将杭州银行的数据加入一个集合,将上海银行的数据加入一个集合。

将这些集合里对应的记录保存到具体的表格,例如:上海银行.xls,杭州银行.xls,。。等等。

第二步,合并数据。

第一步执行完成,我们会得到这样的文件夹:

指标xx/{杭州银行.xls,上海银行.xls,南京银行.xls}

指标yy/{招商银行.xls,上海银行.xls,网商银行.xls}

。。。。

接着,我们需要合并数据,得到这样的文件夹结构:

上海银行/{指标xx.xls,指标yy.xls}

招商银行/{指标xx.xls,指标yy.xls,指标zz.xls,指标tt.xls。。。。}

。。。等等

第三步,合并到workbook。

将这个文件夹里,所有的Excel文件,都合并到一个Excel里,之前的文件作为sheet。

(二),方法二

不使用vb语言,因为对vb不熟悉;使用c#,直接操作Excel表格,逻辑和上面类似,但是可以稍微简单一些。

四,具体设计

(一),拆分数据程序设计

拆分算法原理如下:

将同一个类型的行,放到一个集合中。

1,在vb中定义一个dictionary,作用类似java中的map。

2,遍历每行的固定cell,判断类型。将相同类型的row,加入到同一个集合。dictionary中的value使用一个集合,union可以用于合并多个cell rang集合。使用union,这是一个突破点,该函数可以合并不同的区域,包括row,range。

3,分别保存到不同的Excel文件。

代码如下:

Sub 保留表头拆分数据为若干新工作簿()Dim arr, d As Object, k, t, i&, lc%, rng As Range, c%c = Application.InputBox("请输入拆分列号", , 4, , , , , 1)If c = 0 Then Exit SubApplication.ScreenUpdating = FalseApplication.DisplayAlerts = Falsearr = [a1].CurrentRegionlc = UBound(arr, 2)Set rng = [a1].Resize(, lc)Set d = CreateObject("scripting.dictionary")For i = 2 To UBound(arr)If Not d.Exists(arr(i, c)) ThenSet d(arr(i, c)) = Cells(i, 1).Resize(1, lc)ElseSet d(arr(i, c)) = Union(d(arr(i, c)), Cells(i, 1).Resize(1, lc))End IfNextk = d.Keyst = d.ItemsFor i = 0 To d.Count - 1With Workbooks.Add(xlWBATWorksheet)rng.Copy .Sheets(1).[a1]t(i).Copy .Sheets(1).[a2].SaveAs Filename:=ThisWorkbook.Path & "\" & k(i) & ".xls".CloseEnd WithNextApplication.DisplayAlerts = TrueApplication.ScreenUpdating = TrueMsgBox "完毕"
End Sub

核心代码是11-17行,这里需要动一些脑子。第二部分,将不同的区域合并。

(二),合并数据程序设计

1,扫描。

遍历整个文件夹,使用一个dictionary,将银行所在的目录保存起来

例如:

上海银行--{指标xx,指标yy}

招商银行--{指标xx,指标yy,指标zz,指标tt。。。}

//扫描方法public void scan(FileSystemInfo info){if (!info.Exists) return;DirectoryInfo dir = info as DirectoryInfo;//不是目录if (dir == null) return;//输出目录listBox1.Items.Add("文件夹: " + dir.FullName + ", 创建时间: " + dir.CreationTime);FileSystemInfo[] files = dir.GetFileSystemInfos();for(int i =0; i< files.Length;i++){FileInfo file = files[i] as FileInfo;//是文件if (file != null){//listBox1.Items.Add("文件: " + file.Name + ", 创建时间: " + file.CreationTime + ", 扩展名: " + file.Extension + ", 上次访问时间: " + file.LastAccessTime);listBox1.Items.Add("文件: " + file.FullName + ", 创建时间: " + file.CreationTime + ", 扩展名: " + file.Extension );// 填充到列表//去除.xls后缀,获取单纯的文件名string bankName = getBankName(file.Name);if (bankFilesMap.ContainsKey(bankName)){List<string> filesList = bankFilesMap[bankName];if (null == filesList){filesList = new List<string>();filesList.Add(file.FullName);bankFilesMap.Add(bankName, filesList);}else{filesList.Add(file.FullName);}}else{List<string> filesList = new List<string>();filesList.Add(file.FullName);bankFilesMap.Add(bankName, filesList);}}else scan(files[i]);}}//end scan

2,复制移动。

遍历字典,根据key,建立相应的目录,然后拷贝文件。

        public void copyMoveFiles( ){string rootDestFolder = System.IO.Path.Combine(destFolderPath, "root");if (!Directory.Exists(rootDestFolder)){   Directory.CreateDirectory(rootDestFolder);}//遍历字典foreach (KeyValuePair<string, List<string>> kvp in bankFilesMap){Console.WriteLine("Key = {0}, Value = {1}", kvp.Key, kvp.Value);string bankName = kvp.Key;List<string> bankFiles = kvp.Value;string destBankDir = System.IO.Path.Combine(rootDestFolder, bankName);if (!Directory.Exists(destBankDir)){Directory.CreateDirectory(destBankDir);}foreach (string bankfile in bankFiles){//获取一个路径后缀string temp = bankfile;string[] parts = temp.Split('\\');Console.WriteLine("file path parts: " + parts);//倒数第二个string olderFolderName = parts[parts.Length - 2];Console.WriteLine("olderFolderName: " + olderFolderName);//增加一个文件后缀string[] oldfFileParts = bankfile.Split('.');string suffix = oldfFileParts[oldfFileParts.Length - 1];string newFileName = olderFolderName + "." + suffix;string destFile = System.IO.Path.Combine(destBankDir, newFileName);System.IO.File.Copy(bankfile, destFile);}}MessageBox.Show("复制文件,移动文件,成功。");}

(三),合并workbook

这是19年8月设计的一个小工具,没想到这次还有用。可见,劳动总是有积累的。

这里的难点是对Excel文件的读取,需要一些基础类库。但是呢,只需要学一次,以后就容易了。

五,实际使用

(一),遇到的问题

1,第三阶段遇到一个问题,使用c#打开Excel的时候,提示:外部表不是预期的格式。需要先打开Excel文件,另存为一下(感觉这里好搞笑。。。)。这问题莫名其妙,也没时间去研究,暂时就先这样好了。

2,并未做完全测试。

(二),实际意义

1,业务人员操作了一下,0.5小时内解决,毫无压力。

28/0.5=56,效率提升50倍。

2,这种重复劳动,盯着屏幕久了,人容易出错的,而且发现不了。但是,程序不会出错。

六,未来展望

1,目前实现了半自动化,希望把项目再优化一下,实现全自动化解决,限时5分钟。

2,做成一个大的工具包,其他一些文件处理的功能也可以放进来,慢慢迭代,慢慢变大。

参考链接:

excel启用宏在哪里

https://jingyan.baidu.com/article/4d58d541542c049dd4e9c0d2.html

重点,vb模块,参考原作者

将excel按照某一列拆分成多个文件

https://blog.csdn.net/ntotl/article/details/79141314

Excel拆分合并数据,使用vb编程,效率提高50倍相关推荐

  1. excel怎么合并数据?

    今天跟大家分享一下excel怎么合并数据? 1.首先打开excel文件 2.接着我们点击如下图选项 3.点击[汇总拆分],选择[合并多表] 4.勾选要处理的工作表 5.接着将[表头行数]设置为2 6. ...

  2. Excel 拆分 分割 数据 (对数据进行分列)

    ■前言 Excel拆分数据,有两种方式 ・对于从外部复制进来的数据  (之前,我只知道这种方式) ・对于Excel中,自身的数据 ■对于从外部复制进来的数据 1.复制文本 2.选择任意一个Excel单 ...

  3. 英伟达新开源GPU加速平台:主打数据科学和机器学习,50倍于CPU

    李根 发自 凹非寺  量子位 报道 | 公众号 QbitAI 如果你是数据工作者,到底对此是爱是恨? 因为这个名为RAPIDS的开源GPU加速平台出现,固有的数据工作,看起来将迎来变革. 有人欢迎,可 ...

  4. excel拆分合并技巧:将工作表合并成总表的方法

    一.各个分表合并到总表--函数流 既然在"拆分"工作表的时候,我们使用了函数的方式,那么就来再感受一下"合并"工作表的函数方式吧!依然使用之前的分表作为我们合并 ...

  5. 表头合并_多个Excel表格合并数据麻烦?试试Power Query轻松帮你解决

    Hi!大家好!欢迎来到小龙自修室! 又到了小龙分享时间!(今天的内容有点多,希望各位看官一定要看到最后!有惊喜) 上一篇文字小龙和大家一起制作了一个限定数据内容录入的电子表格,我的表格我做主! 表格做 ...

  6. 牛逼了!这个私藏的前端 IDE 插件,撸码 6 的飞起,编程效率提高 30 倍!

    平时写代码的时候多少会依赖编辑器里面的代码补全,敲几个字母就能补全一整个词.可是这么多年过去了,为什么代码补全还是像最开始那样,只能限定于一个词,而且毫无意义地按照字典表顺序排列呢? 传统的代码补全, ...

  7. php inpo,优化PHP in_array()函数,效率提高50倍

    /原始程序 function pinyin($str) { //判断是否是 单拼 双拼 三拼 四拼 $pin_arr = array("a", "ai", &q ...

  8. 【excel】合并单元格拆分后每一格都填充为与原来相同内容

    用的比较频繁的一个操作,单元格合并拆分出的单元格自动填充为合并前内容 比较烦合并单元格,记得以前看过一本excel书里把合并单元格列为一大恶习,因为这严重影响数据分析,但那本书没说怎么处理,导致我才学 ...

  9. python处理Excel实现自动化办公教学(数据筛选、公式操作、单元格拆分合并、冻结窗口、图表绘制等)【三】

    相关文章: python处理Excel实现自动化办公教学(含实战)[一] python处理Excel实现自动化办公教学(含实战)[二] python处理Excel实现自动化办公教学(数据筛选.公式操作 ...

最新文章

  1. Redis 分布式锁使用不当,酿成一个重大事故,超卖了100瓶飞天茅台!!!
  2. 《AI系统周刊》第2期:硬件支持的Tensor-train分解与高效数据处理、清华吴文斐研究组获得NSDI最佳论文奖
  3. 在哪里能收到python实例代码-python实现网站微信登录的示例代码
  4. php依次替换src,如何在php中替换img中src内容
  5. 13_短信发送器_问题说明
  6. win oracle 重启命令,Windows下命令行如何启动Oracle10g?
  7. Postgre约束详解
  8. 《RESTful Web Services》第一章 使用统一接口
  9. 矩阵对抗与漏洞补丁201001(第4期)
  10. 柱状图用腻了?玉玦图给你更美的数据呈现
  11. CRM WEB UI 01 BOL向导创建的搜索
  12. aspose 转pdf表格大小乱了_关于Aspose.Words转PDF简体中文排版问题申明
  13. iOS软件开发揭密:iPhoneiPad企业应用和游戏开发(china-pub首发)
  14. nacos2.0 +nginx集群
  15. 安徽新华学院计算机学院官网,安徽新华学院计算机协会第十八届换届大会
  16. PRTR论文代码解读
  17. awesome PHP之依赖注入容器pimple
  18. BugKu 你必须让他停下来
  19. Onvif协议客户端开发(8)--球机云台的控制
  20. 喵星史话(一)——猫的起源

热门文章

  1. CToolBar工具条控制方法
  2. Redis的集群配置
  3. 路劲规划与轨迹跟踪学习4——人工势场法
  4. Linux常用命令——modprobe命令
  5. 烽火ExMobi引领企业移动应用平台浪潮
  6. 一加7充电_一加7T充电、续航能力测评
  7. 闲鱼无法确认收货显示服务器繁忙,闲鱼不确认收货怎么办?解决办法都是这样的...
  8. 《机器学习》 线性模型
  9. SpringBoot2后端项目-验证码图片生成
  10. 用户模块--------用户登录