最近公司做了一个微信红包的项目,其中一个主要的工作内容是 将238万张券导入到微信平台里面,用于微信卡券的领取和核销.
但是提供给我的券都是以一个个的excel文件给到的.然后通过excel文件的导入功能,将所有的券导入到某张表里.
由于有238万张券,所以一共给到的excel文件大概有100多份.如果是一个个的导入的话,实在太麻烦了.所以,想做一个运用,
将多个excel文件的合并成一个文件. 网上百度了一下,也的确有这样的运用软件.但是有些要么不是免费,要么有些免费但功能受限的.
所以决定还是自己手写一个吧.正好最近也学了微软的WPF,就用它来练习一下学习的成果.

1 开发环境
win7
.net framework 4.0
vs2010 sp1

NuGet

2 功能需求
选择某个文件夹,将该文件夹里面的所有的excel文件都获取出来并在画面上显示.
然后用户可以选择其中的某些文件合并成,并且可以取消操作.

3 实现说明
根据需求分析,可以大概知道具有以下的功能点
3-1 选择文件夹
System.Windows.Forms.FolderBrowserDialog fb = new System.Windows.Forms.FolderBrowserDialog();
if (fb.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
  //选择的文件夹路径
  selectedPath = fb.SelectedPath + "/";
}

3-2 递归获取excel文件并且显示在listbox控件上
// 声明excel文件的list
private List<ExcelFile> excelFileList = new List<ExcelFile>();
// 递归获取函数
private void FindFile(string dirPath) //参数dirPath为指定的目录
{
  //在指定目录及子目录下查找文件
  DirectoryInfo Dir=new DirectoryInfo(dirPath);
  try
  {
    foreach(DirectoryInfo d in Dir.GetDirectories())//查找子目录
    {
      FindFile(d.FullName);
    }
    foreach(FileInfo f in Dir.GetFiles("*.xls")) //查找文件
    {
      excelFileList.Add(new ExcelFile { Name = f.Name, Path = f.FullName, IsSelected = true, Status="未处理" });
    }
  }
  catch(Exception e)
  {
    MessageBox.Show(e.Message);
  }
}
// 数据绑定
listBox1.ItemsSource = excelFileList;

3-3 用户可选excel文件
改写了listboxItem的template,将一个checkbox放入其中
<ListBox HorizontalAlignment="Stretch" Margin="12,14,12,0" Name="listBox1" VerticalAlignment="Stretch" HorizontalContentAlignment="Stretch" Grid.Row="2" MinHeight="180" MinWidth="480" VerticalContentAlignment="Stretch">
<ListBox.ItemTemplate>
<DataTemplate>
  <Grid Margin="3">
    <Grid.ColumnDefinitions>
      <ColumnDefinition Width="Auto"></ColumnDefinition>
      <ColumnDefinition Width="Auto"></ColumnDefinition>
      <ColumnDefinition Width="*"></ColumnDefinition>
      <ColumnDefinition Width="Auto"></ColumnDefinition>
    </Grid.ColumnDefinitions>
    <CheckBox Grid.Column="0" Padding="3" VerticalAlignment="Center" IsChecked="{Binding Path=IsSelected,Mode=TwoWay}"></CheckBox>
    <TextBlock Grid.Column="1" Padding="5" VerticalAlignment="Center" Text="{Binding Path=Name}"></TextBlock>
    <TextBlock Grid.Column="2" Padding="6" VerticalAlignment="Center" Text="{Binding Path=Path}"></TextBlock>
    <TextBlock Grid.Column="3" Padding="3" VerticalAlignment="Center" Text="{Binding Path=Status}"></TextBlock>
  </Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>

3-4 合并excel文件,并且能取消合并的操作
由于读取一个个excel文件的内容最后写入到一个文件中的操作,是很花时间的操作.所以是通过多线程的方式来实现.主要是用到了BackgroundWorker组件.
public static bool merge(string selectedPath, List<ExcelFile> excelFileList, System.ComponentModel.BackgroundWorker backgroundWorker)
{
  // Start the search for primes and wait.
  var writer = new StreamWriter(selectedPath + "all.csv", false, System.Text.Encoding.UTF8);
  writer.WriteLine("券码,券密码,活动说明,有效开始日期,有效结束日期,是否已导入,卡券ID,自定义code");

  int i = 0;
  foreach (var f in excelFileList)
  {
    i++;
    if (backgroundWorker.CancellationPending)
    {
      // Return without doing any more work.
      return false;
    }

    if (backgroundWorker.WorkerReportsProgress)
    {
      backgroundWorker.ReportProgress(i);
    }

    if (!f.IsSelected) continue;
    f.Status = "处理中";
    var stream = new FileStream(f.Path, FileMode.Open);
    IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
    excelReader.Read();
    while (excelReader.Read())
    {
      var code = (excelReader.GetString(1).Trim());
      var pwd = (excelReader.GetString(2).Trim());
      var activity = (excelReader.GetString(3).Trim());

      if (!string.IsNullOrEmpty(code))
      {
        var card_id = "pgW8rt3XXByGetZUJVlv1bbLuqdk";
        var card_code = code + pwd;
        writer.WriteLine("{0},{1},{2},2015-02-19 00:00:00,2015-03-31 23:59:59,0,{3},{4}", code, pwd, activity, card_id, card_code);
      }
    }
    excelReader.Close();
    f.Status = "处理完成";
  }
  writer.Flush();
  writer.Close();

  return true;

}
最终实现的软件的主界面如图所示

合并文件的操作画面如图所示

最后,个人觉得页面还是有点丑陋,可以增加一些动画,酷的样式什么的.但是这个不是我擅长的.

下载源代码

用wpf实现了多个excel文件的合并的更多相关文章

  1. 使用Aspose.Cell控件实现多个Excel文件的合并

    之前有写过多篇关于使用Apose.Cell控件制作自定义模板报表和通用的导出Excel表格数据的操作,对这个控件的功能还是比较满意,而且也比较便利.忽然有一天,一个朋友说:你已经有生成基于自定义模板报 ...

  2. python 作业 批量读取excel文件并合并为一张excel

    1 #!/usr/bin/env python 2 # coding: utf-8 3 4 def concat_file(a,b): 5 #如何批量读取并快速合并文件夹中的excel文件 6 imp ...

  3. excel-合并多个Excel文件--VBA合并当前目录下所有Excel工作簿中的所有工作表

    在网上找EXCEL多文件合并的方法,思路: 一.Linux 或者window+cmder,直接用命令行cat合并EXCEL文件,但是,需要安装辅助东西才能直接处理(也许也不可以,但是,可以用文件格式转 ...

  4. 多个excel文件内容合并到一个excel文件的多个sheet的小程序

    # -*- coding:utf-8 -*- import xlrd, xlsxwriter # 待合并excelallxls = ["D:\\excelcs\\***.xlsx" ...

  5. 导入导出Excel文件

    搭建环境 先新建web project ,然后Add Struts Capabilties: 下载导入导出Excel所需的jar包: poi-3.8-20120326.jar包  :  http:// ...

  6. 批处理快速合并多分Excel文件并将指定列的数据去重复

    1.批处理快速合并多个excel文件方法: 新建一个.txt文本文件,就命名为合并.txt吧. 而后开启文件,复制以下代码到文件中: @echo off E: cd xls dir copy *.cs ...

  7. EXCEL自动撤销合并单元格并填充相应内容(转帖)

    若EXCEL工作表有很多合并的单元格,要将所有合并的单元格撤销,并填充撤销合并前显示的内容,这是一项很繁琐且容易出错的工作.但可通过宏程序可轻松准确地搞定,方法如下: 一.实现该功能的Excel宏程序 ...

  8. C# WPF 进度条,根据读取数据显示进度条进度,根据Excel文件读取数据,进度条样式

    后台代码: //导入 private void Border_MouseLeftButtonUp_2(object sender, MouseButtonEventArgs e) { var path ...

  9. C# 7个读写Excel文件的类库

    转载自:http://www.cnblogs.com/wintersun/archive/2013/02/26/2933294.html 有时我们在项目需要操作Excel文件,读或写,导出数据等.   ...

随机推荐

  1. 王灏:光音网络致力打造Wi-Fi大生态圈

    光音网络,做的是本地网络综合服务.在中国,想把互联网做到覆盖延伸范围之外的最后100米,光音网络是当中一家,也是最坚持的一家.为千万家本地生活商户提供帮助,为数亿本地用户提供最佳的本地网络体验,这是光 ...

  2. Pilin —— 一个基于Xmpp openfire smack的即时聊天工具

    https://github.com/whfcomm/Pilin

  3. O(1)调度器的时间计算公式与CFS调度器

    http://blog.csdn.net/dog250/article/details/48750809 O(1): 优先级计算: 进程优先级公式:prio=MAX_RT_PRIO+nice+20其中 ...

  4. [学习笔记]设计模式之Prototype

    写在前面 为方便读者,本文已添加至索引: 设计模式 学习笔记索引 在笔记Builder模式中,我们曾见到了最初用于创建平行世界的函数createWorld,并且它是Mage类的成员函数(毕竟是专属于魔 ...

  5. ios中创建可以拖动的view原理和实现详解

    有时候我们会需要在界面上拖动view;uiview是继承于uiresponder的,所以可以响应触摸相关的事件. 重点是以下一组方法: - (void)touchesBegan:(NSSet *)to ...

  6. wget下载网站整个目录

    wget -r -p -np -k -P ./data/ http://example.com/eg/ 具体参数: -P 表示下载到哪个目录 -r 表示递归下载 -np 表示不下载旁站连接 -k 表示 ...

  7. thinkphp 常见问题

    0.写在最前面的不断更新 (1)trace不起作用 A:必须要输出到模板,才会有trace信息 (2)提示“您浏览的页面暂时发生了错误!请稍后再试-” A:检查控制器(看看能进到控制器没有,设断点输出 ...

  8. .net+easyui系列--搜索框

    <input id="ss" style="width: 320px"> </input> <div id="mm&qu ...

  9. gitlab 配置 ssh && ubuntu

    1,在你的电脑上生成密钥ssh-keygen -t rsa -C "youeamil@explode.com" 2,在 ubuntu系统中 ~/.ssh目录中生成了两个文件id_r ...

  10. OpenXML: Asp.net利用OpenXML 导出Excel.

    http://www.cnblogs.com/skyfei/archive/0001/01/01/Openxml.html