需求

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

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

c#实现数据集合转换为csv文本的更多相关文章

  1. java 读取CSV数据并写入txt文本

    java 读取CSV数据并写入txt文本 package com.vfsd; import java.io.BufferedWriter; import java.io.File; import ja ...

  2. linq之将IEnumerable<T>类型的集合转换为DataTable类型 (转载)

    在考虑将表格数据导出成excel的时候,网上搜的时候找到一个特别合适的公共方法,可以将query查询出来的集合转换为datatable 需引用using System.Reflection; publ ...

  3. linq根据传入数据集合查询对应子级数据

    工作中经常用到的linq根据传入数据集合查询对应子级数据,整理共享,希望大家都能用得上,代码中doublesArray 为父节点对应ID数据集合,再根据ID数据集合查询全部子级数据. //获取缓存数据 ...

  4. Oracle数据表转换为Shapefile(一)

    严格来说,文章标题中的“转换”并不完全合适.本文的主要内容是基于Oracle数据表的数据来生产出Shapefile文件.进行该工作的一个前提条件是:Oracle数据表中包含坐标数值字段,一般来说就是x ...

  5. linq依据传入数据集合查询相应子级数据

    工作中经经常使用到的linq依据传入数据集合查询相应子级数据,整理共享,希望大家都能用得上,代码中doublesArray 为父节点相应ID数据集合,再依据ID数据集合查询所有子级数据. //获取缓存 ...

  6. python脚本-excel批量转换为csv文件

    pandas和SQL数据分析实战视频教程 https://study.163.com/course/courseMain.htm?courseId=1006383008&share=2& ...

  7. 如何将EDI报文转换为CSV格式文件?

    如果您对EDI项目实施有一定的了解,想必您一定知道,在正式开始EDI项目实施之前,都会有EDI顾问与您接洽,沟通EDI项目需求.其中,会包含EDI通信双方使用哪种传输协议,传输的报文是符合什么标准的, ...

  8. C# .csv文件转为Excel格式;Excel格式转换为.csv

    using System; using System.Diagnostics; using System.IO; using System.Reflection; using System.Windo ...

  9. Immutable.js – JavaScript 不可变数据集合

    不可变数据是指一旦创建就不能被修改的数据,使得应用开发更简单,允许使用函数式编程技术,比如惰性评估.Immutable JS 提供一个惰性 Sequence,允许高效的队列方法链,类似 map 和 f ...

随机推荐

  1. 菜鸟从零学编程(八)——将MyEclipse项目导入到Eclipse

    最近由于种种原因,需要将以前用MyEclipse写的项目迁移到Eclipse中.但是当我将之前的项目import到Eclipse中后,发现根本不能运行.经过一番寻觅,终于让我找到了一种解决的办法.一起 ...

  2. (字符串的处理4.7.16)POJ 1159 Palindrome(让一个字符串变成回文串需要插入多少个字符...先逆序,在减去公共子序列的最大长度即可)

    /* * POJ_1159.cpp * * Created on: 2013年10月29日 * Author: Administrator */ #include <iostream> # ...

  3. PCA MATLAB

    之前princomp函数还可以正常使用,但是今天突然不能使了!总是显示错误使用 pca输入参数太多. 出错 princomp (line 29)    [varargout{1:nargout}]=p ...

  4. 项目源码--Android视频MV类网站客户端

    下载源码 技术要点: 1.视频MV类网站客户端框架 2.底部TAB功能模块 3.用户管理模块 4.结合优质动画技术,良好的用户体验 5.用户设置模块 6.sqlite数据库灵活的应用 7.源码带有非常 ...

  5. org.apache.hadoop.conf-Configurable

    从包名可以看出这个包里面都是配置相关的类:从类名上可以看出这是一个接口,或者说配置类接口.内容很少. package org.apache.hadoop.conf; /** Something tha ...

  6. WPF 之 后台设置Image的Souce

    后台动态设置Image的Souce. 方法一: BitmapImage imgSource = new BitmapImage(new Uri("location",UriKind ...

  7. WPF 之 自定义窗体标题栏

    在WPF中自定义窗体标题栏,首先需要将窗体的WindowStyle属性设置为None,隐藏掉WPF窗体的自带标题栏.然后可以在窗体内部自定义一个标题栏. 例如,标题栏如下: <WrapPanel ...

  8. Socket 之 同步以及异步通信

    用netstat侦听下端口状态 同步通信: 预定义结构体,同步通信没有多线程异步委托回调,所以无需预定义结构体 客户端Client: class Program { static void Main( ...

  9. 互联网时代的社会语言学:基于SNS的文本数据挖掘

    今年上半年,我在人人网实习了一段时间,期间得到了很多宝贵的数据,并做了一些还算有意义的事情,在这里和大家一块儿分享.感谢人人网提供的数据 与工作环境,感谢赵继承博士.詹卫东老师的支持和建议.在这项工作 ...

  10. 搭建本地Git服务器6步走

    1. 在服务器上安装git和ssh 2. 在服务器上新建一个用户,比如就叫git sudo adduser git 3. 在服务器上新建一个目录来放置git仓库 mkdir gitrepo git i ...