zoukankan      html  css  js  c++  java
  • c#实现数据集合转换为csv文本

    需求

    1、将一个数据集合导出到一个csv文件中,集合类型可以视为 List<T>,T为任意类型,T包含多个属性,可指定部分属性进行导出

    2、软件中有多种不同类型的数据类型需要进行导出


    需求很简单,简单分析下


    1、csv格式就是文本格式,包含多行数据,每行包含多列文字,文字间已Tab标记分隔(简单,无需过多考虑)

    2、针对数据类型T可以是任意类型,

    3、支持指定属性导出,同一个类型也允许指定不同的属性组分别导出

    4、属性与最终生成的文件中的列 一一对应,每个属性可以设置对应的列名称


    初步构想解决方案

    1、指定需要导出的属性名称,通过反射获取对象的属性值

    2、拼接为csv文本字符串

    3、提供属性名称与列名称的一一对应关系

    4、使用一个简单的导出csv工具类型,仅一个一个静态方法,接受List<T>类型数据集合,以List<Piar>方式传入ColumnName与PropertyName的键值对

    5、写入某指定的csv文件


    实际编码

    开发过程适当合理更改,如将文件写入逻辑移除(文件写入逻辑应在上层进行),保持导出逻辑简单,形成如下代码


    调用方法

    假设类型定义如下

    public class User
    {
    	public string Name { get;set; }
    	public string Info { get;set; }
    }
    
    

    若存在一个用户列表List<User> Users{get;set;}

    则生成csv格式字符串的代码如下

    public string GenerateUserExportText()
    {
        return ExportCsvUtility.GenerateExportText(Usrs, new List<KeyValuePair<string, string>>()
            {
                new KeyValuePair<string, string>("用户名", "Name"),
                new KeyValuePair<string, string>("用户信息", "Info"),
            });
    }



    上层使用的选择保存文件 及 写入文件的方法可以参照我提供的下列代码:

    注意StreamWriter的构造方法中,需传入参数设置Unicode编码,否则Excel打开csv文件会有问题


            private bool TryGetOutFilePath(out string filePath)
            {
                SaveFileDialog saveFileDialog = new SaveFileDialog()
                    {
                        FileName = DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss"),
                        DefaultExt = ".text",
                        Filter = "csv documents (.csv)|*.csv",
                    };
    
                if (saveFileDialog.ShowDialog() == true)
                {
                    filePath = saveFileDialog.FileName;
                    return true;
                }
    
                filePath = string.Empty;
                return false;
            }
    
            private void ExportToFile(string filePath, string fullText)
            {
                try
                {
                    using (FileStream outFileStream = new FileStream(filePath, FileMode.Create, FileAccess.Write))
                    {
                        using (TextWriter textWriter = new StreamWriter(outFileStream, Encoding.Unicode))
                        {
                            textWriter.Write(fullText);
                        }
                    }
                }
                catch (Exception e)
                {
                    ExceptionHandler.HandleException(e);
                }
            }

    后续Ant会带来更多c#相关技术文章


    代码中使用的反射技巧,直接从我的其他项目中抽取了过来,后续可以专门做个介绍

  • 相关阅读:
    Qt计算器开发(三):执行效果及项目总结
    [HNOI2019]校园旅行
    How to fix nuget Unrecognized license type MIT when pack
    How to fix nuget Unrecognized license type MIT when pack
    git 通过 SublimeMerge 处理冲突
    git 通过 SublimeMerge 处理冲突
    git 上传当前分支
    git 上传当前分支
    gif 格式
    gif 格式
  • 原文地址:https://www.cnblogs.com/gods/p/3887668.html
Copyright © 2011-2022 走看看