• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

c#实现数据集合转换为csv文本

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

需求

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


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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#中操作数据库技术之ExecuteNonQuery用法发布时间:2022-07-13
下一篇:
C#while循环发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap