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#相关技术文章


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

  • 相关阅读:
    一步一步学lucene——(第四步:搜索篇)
    如何搭建sshpermissions工程
    如何选择ESB
    一步一步学Mule ESB——(第二篇:Ajax篇)
    一步一步学lucene——(第二步:示例篇)
    一步一步学Mule ESB——(第一篇:基础篇)
    三步学会用spring开发OSGI——(第三步:web篇)
    关于SourceForge不能使用的问题
    一步一步学lucene——(第三步:索引篇)
    常用px,pt,em换算表
  • 原文地址:https://www.cnblogs.com/gods/p/3887668.html
Copyright © 2011-2022 走看看