需求

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. 记录一下Swift3.0的一些代码格式的变化

    一.去重: 1>颜色: UIColor.whiteColor() 被改为 UIColor.white() 2>数组取值: list.objectAtIndex(i) 被改为 list.ob ...

  2. UIButton设置了UIControlStateSelected和UIControlStateHighlighted状态的图片点击会闪烁的解决方案

    [btn setBackgroundImage:img1 forState:UIControlStateSelected|UIControlStateHighlighted]; [btn setIma ...

  3. j疑难杂症:java.lang.VerifyError: class org.hibernate.type.WrappedMaterializedBlobType overrides final method getReturnedClass.()Ljava/lang/Class;

    问题: java.lang.VerifyError: class org.hibernate.type.WrappedMaterializedBlobType overrides final meth ...

  4. ubuntu 11.10 安装apache2 tomcat6

    ubuntu 11.10 安装apache2 tomcat6 导读 Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目 ...

  5. 计算圆周率 Pi (π)值, 精确到小数点后 10000 位 只需要 30 多句代码

    大家都知道π=3.1415926……无穷多位, 历史上很多人都在计算这个数, 一直认为是一个非常复杂的问题.现在有了电脑, 这个问题就简单了.电脑可以利用级数计算出很多高精度的值, 有关级数的问题请参 ...

  6. LeetCode27 Remove Element

    题目: Given an array and a value, remove all instances of that value in place and return the new lengt ...

  7. VS2005 命令窗口的使用

    转自:http://www.cnblogs.com/RobotH/archive/2008/05/29/1209856.html 命令”窗口用于直接在 Visual Studio 集成开发环境 (ID ...

  8. 修改Intellij Idea 创建maven项目默认Java编译版本

    在使用Intellij Idea 创建Maven项目时,默认的Java Language是1.5,虽然可以在Project Structrue中修改,但是每次pom.xml文件有变化时,工程又会重置到 ...

  9. Java基础知识强化之IO流笔记79:NIO之 SocketChannel

    1. Java NIO中的SocketChannel是一个连接到TCP网络套接字的通道.可以通过以下2种方式创建SocketChannel: 打开一个SocketChannel并连接到互联网上的某台服 ...

  10. PHP删除符合条件的整个目录

    <?php /** * @name delFile函数与delDir函数一起使用, 删除符合条件的整个目录 * @param string $path 指定操作路径 * @return null ...