• 用wpf实现了多个excel文件的合并


    最近公司做了一个微信红包的项目,其中一个主要的工作内容是 将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;

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

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

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

    下载源代码

  • 相关阅读:
    (网络流)ACM Computer Factory --POJ --3436
    (小数化分数)小数化分数2 -- HDU --1717
    (小数化分数)小数化分数2 --HDU --1717
    (网络流 模板 Dinic) Drainage Ditches --POJ --1273
    (网络流 模板 Edmonds-Karp)Drainage Ditches --POJ --1273
    (匹配)Oil Skimming -- hdu --4185
    (匹配 二维建图) Antenna Placement --POJ --3020
    (匹配)Antenna Placement --POJ --3020
    将截断字符串或二进制数据【转】
    C#中Abstract和Virtual 【转】
  • 原文地址:https://www.cnblogs.com/guoyongrong/p/4272293.html
Copyright © 2020-2023  润新知