当前位置: 首页 > 编程日记 > 正文

WPF及Silverlight中将DataGrid数据导出

这段源码是我在项目中实际应用的源码,没有经过删减及处理。

如果你认为有用可以摘去作为自己的导出类中的一个小工具使用。

/// <summary>
    
/// 数据源导出辅助类
    
/// </summary>
    
/// <remarks>
    
/// Author:         sucsy
    
/// Create date:    2011-6-17
    
/// Description:    提供基于数据源(公共枚举器类型)的数据导出辅助功能
    
/// </remarks>
    public class DataSourceExportHelper
    {
        /// <summary>
        
/// 导出到文本
        
/// </summary>
        
/// <param name="dataSource">数据源</param>
        
/// <param name="splitString">分隔符</param>
        
/// <param name="columns">导出的列(为null时表示全部导出)</param>
        
/// <returns>文本数据</returns>
        public static string Export2Text(IEnumerable dataSource,string splitString,DataGridColumn[] columns,bool isVisiableColumn)
        {
            //定义结果存放对象
            StringBuilder sbResult = new StringBuilder();

            string[] columnHeaders = GetSelectedColumns(columns);

            //处理DataTable作为数据源的数据导出操作
            if (dataSource is System.Data.DataView)
            {
                System.Data.DataView dataView = (System.Data.DataView)dataSource;

                //加载数据标题
                foreach (DataColumn objHeaderpi in dataView.Table.Columns)
                {
                    if (columns == null || columnHeaders.Contains(objHeaderpi.ColumnName))
                        sbResult.Append(objHeaderpi.ColumnName + splitString);
                }

                sbResult.AppendLine();

                foreach (System.Data.DataRowView dr in dataView)
                {
                    foreach (DataColumn objHeaderpi in dataView.Table.Columns)
                    {
                        if (columns == null || columnHeaders.Contains(objHeaderpi.ColumnName))
                            sbResult.Append(dr[objHeaderpi.ColumnName].ToString() + splitString);
                    }
                    sbResult.AppendLine();
                }
            }
            else
            {               
                foreach (DataGridColumn dgcol in columns)
                    sbResult.Append(dgcol.Header.ToString() + splitString);

                sbResult.AppendLine();

                foreach (object data in dataSource)
                {
                    foreach (DataGridColumn col in columns)
                    {
                        string strValue = "";
                        Binding objBinding = null;
                        if (col is DataGridBoundColumn)
                            objBinding = (Binding)(col as DataGridBoundColumn).Binding;

                        if (col is DataGridTemplateColumn)
                        {
                            DependencyObject objDO = (col as DataGridTemplateColumn).CellTemplate.LoadContent();
                            FrameworkElement oFE = (FrameworkElement)objDO;
                            FieldInfo oFI = oFE.GetType().GetField("TextProperty");
                            if (oFI != null)
                            {
                                if (oFI.GetValue(null) != null)
                                {
                                    if (oFE.GetBindingExpression((DependencyProperty)oFI.GetValue(null)) != null)
                                        objBinding = oFE.GetBindingExpression((DependencyProperty)oFI.GetValue(null)).ParentBinding;
                                }
                            }
                        }
                        if (objBinding != null)
                        {
                            if (objBinding.Path.Path != "")
                            {
                                string[] dataTree = objBinding.Path.Path.Split(".".ToArray(), StringSplitOptions.RemoveEmptyEntries);
                                object parentData = data;
                                for (int treeIndex = 0; treeIndex < dataTree.Length; treeIndex++)
                                {
                                    PropertyInfo pData = parentData.GetType().GetProperty(dataTree[treeIndex]);

                                    parentData = pData.GetValue(parentData, null);
                                }

                                if (parentData != null) strValue = parentData.ToString();
                                
                            }
                            if (objBinding.Converter != null)
                            {
                                if (strValue != "")
                                    strValue = objBinding.Converter.Convert(strValue, typeof(string), objBinding.ConverterParameter, objBinding.ConverterCulture).ToString();
                                else
                                    strValue = objBinding.Converter.Convert(data, typeof(string), objBinding.ConverterParameter, objBinding.ConverterCulture).ToString();
                            }
                        }                       
                        sbResult.Append(strValue.Replace(',''') + splitString);
                    }
                    sbResult.AppendLine();
                }

            }

            return sbResult.ToString();
        }
        public static string[] GetSelectedColumns(DataGridColumn[] columns)
        {
            List<string> columnsHeader = new List<string>();
            foreach (DataGridColumn column in columns)
            {
                if (column.Visibility == System.Windows.Visibility.Visible)
                    columnsHeader.Add(column.Header.ToString());
            }

            return columnsHeader.ToArray();
        }



        /// <summary>
        
/// 导出为平面文本
        
/// </summary>
        
/// <param name="dataSource">数据源</param>
        
/// <param name="columns">选择要导出的列</param>
        
/// <returns>平面文本</returns>
        public static string Export2FlotText(IEnumerable dataSource,DataGridColumn[] columns,bool isVisiableColumn)
        {
            return Export2Text(dataSource, "\t", columns, isVisiableColumn);
        }

        /// <summary>
        
/// 导出为平面文本
        
/// </summary>
        
/// <param name="dataSource">数据源</param>
        
/// <param name="columns">选择要导出的列</param>
        
/// <returns>平面文本</returns>
        public static string Export2FlotCSV(IEnumerable dataSource,DataGridColumn[] columns,bool isVisiableColumn)
        {
            return Export2Text(dataSource, ",", columns, isVisiableColumn);
        }
    }

希望这段代码能够对你有用。

sucsy 2011-9-23

南京酷得软件

转载于:https://www.cnblogs.com/sucsy/archive/2011/09/23/2186242.html

相关文章:

首发 | 驭势科技推出“东风网络”:如何找到速度-精度的最优解?| 技术头条...

点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」全日程揭晓&#xff0c;请扫码咨询 ↑↑↑作者 | 驭势科技给定目标硬件&#xff0c;如何确定最优的速度-精度折衷边界&#xff1f;换言之&#xff1a;给定推断延时的限制&#xff0c;模型能达到的最高精度是多少&#xff1f…

【AI】caffe使用步骤(一):将标注数据生成lmdb或leveldb

1、简述 caffe使用工具 convert_imageset 将标注数据转换成lmdb或leveldb格式&#xff0c;convert_imageset 使用方法可以参考脚本examples/imagenet/create_imagenet.sh。 convert_imageset 在./build/tools/中。 2、convert_imageset命令行参数 ./build/tools/convert_ima…

日本的GMO增加了比特币现金,和另外3种用于贷款项目的加密货币

2019独角兽企业重金招聘Python工程师标准>>> 日本的加密货币交易所 GMO正在不断地向其贷款项目中增加更多的货币&#xff0c;这使得它的客户可以将加密货币借给公司。最初&#xff0c;该项目是为BTC启动的&#xff0c;但现在GMO已经走得更远&#xff0c;并添加了比特…

功能演示:戴尔PowerConnect 8024交换机VLAN的创建与删除

戴尔PowerConnect 8024是一款带24个10 Gb以太网10GBASE-T端口的高密度10 Gb以太网交换机&#xff0c;专为具有高吞吐量和高可用性需求的数据中心、聚合和统一结构部署而设计。 这些高密度10 Gb交换机可用于汇聚型以太网环境&#xff0c;支持密集型虚拟化、iSCSI存储和10 Gb流量…

【AI】caffe使用步骤(二):设计网络模型prototxt

【一】以 lenet_train_test.prototxt 为例 name: "LeNet" layer {name: "mnist"type: "Data"top: "data"top: "label"include {phase: TRAIN}transform_param {scale: 0.00390625}data_param {source: "examples/mnis…

南大和中大“合体”拯救手残党:基于GAN的PI-REC重构网络,“老婆”画作有救了 | 技术头条...

点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」全日程揭晓&#xff0c;请扫码咨询 ↑↑↑编译 | 一一出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;对于喜欢画画的你来说&#xff0c;总是画得七零八落&#xff0c;不堪入目&#xff0c;但现在&#xff0c;有一…

区块链技术应用领域和优势

区块链的应用正成为很多人关注的领域 &#xff0c;有很多的新应用正在逐步的实施当中&#xff0c;各种的区块链应用也是让众人惊喜不断&#xff0c; 随着区块链技术的发展 &#xff0c;各行各业在应用中所获取的成效也是越来越大&#xff0c; 这大大激发了人们对于区块链技术的…

Kataspace:用HTML5和WebGL创建基于浏览器的虚拟世界

源自斯坦福的创业公司Katalabs发布了一个用于创建基于浏览器的虚拟世界的开源框架。名叫KataSpace的软件&#xff0c;利用了新兴的HTML5技术&#xff0c;以及WebGL和WebSockets&#xff0c;允许用户无需安装任何插件&#xff0c;直接在浏览器的3D环境中展开互动。Katalabs已经推…

十问陆奇:努力、能力和机遇,谁能帮你跑赢未来?

点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」全日程揭晓&#xff0c;请扫码咨询 ↑↑↑作者 | 陆奇转载自36氪陆奇说&#xff1a;在创业者从0到1的过程中&#xff0c;我们看到的主要挑战有以下几个方面&#xff1a;对需求的理解和判断不够&#xff0c;与目标用户/客户的…

【AI】caffe使用步骤(三):编写求解文件solver.prototxt

【一】参考博客 caffe solver 配置详解&#xff1a;http://www.mamicode.com/info-detail-2620709.html Caffe学习系列(7)&#xff1a;solver及其配置&#xff1a;https://www.cnblogs.com/denny402/p/5074049.html 【二】solver求解文件详解 1、solver求解文件例子如下 ne…

MySQL 8.0 Invisible Indexes 和 RDS 5.6 Invisible Indexes介绍

mysql 在8.0的时候支持了不可见索引,称为隐式索引 索引默认是可以的&#xff0c;控制索引的可见性可以使用Invisible,visible关键字作为create table&#xff0c;create index,alter table 来进行定义。RDS 5.6 Invisible Indexes 也是最近刚刚上线的功能。新购买实例目前已经支…

大有可为的“正则表达式”(二)

5.3. 基本和扩展正则表达式Unix支持两种的正则表达式的版本&#xff1a;&#xff08;1&#xff09;现代版本&#xff1a;扩展正则表达式&#xff08;extended regular expression&#xff0c;ERE&#xff09;&#xff0c;属于IEEE1003.2标准&#xff0c;拥有比BRE更多的功能。…

【AI】caffe使用步骤(四):训练和预测

一、训练 1、直接训练 ./build/tools/caffe train --solverexamples/mnist/lenet_solver.prototxt ./build/tools/caffe train --solverexamples/mnist/lenet_solver.prototxt -gpu all //使用全部的gpu来训练2、采用微调funing-tuning训练法 ./build/tools/caffe train --s…

Github免费中文书《Go入门指南》,带你从零学Go | 极客头条

点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」全日程揭晓&#xff0c;请扫码咨询 ↑↑↑作者 | 无闻整理 | Jane出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;【导语】Go&#xff08;也称 Golang&#xff09;是 Google 开发的一种静态强类型、编…

sql语句中having的作用是?

HAVING对由sum或其它集合函数运算结果的输出进行限制。比如&#xff0c;我们可能只希望看到Store_Information数据表中销售总额超过1500美圆的商店的信息&#xff0c;这时我们就需要使用HAVING从句。语法格式为&#xff1a; SELECT "column_name1", SUM("column…

微软重新释出MS10-015 解决蓝屏问题

微软于周二&#xff08;3/2&#xff09;重新释出MS10-015修补程序。由于先前使用者安装该程序时&#xff0c;若电脑中含有Alureon rootkit就会出现更新错误&#xff0c;因而微软也提醒使用者先行杀毒&#xff0c;并避免安装后可能造成的蓝屏画面。 MS10-015是微软在今年2月用来…

share_ptr_c++11

C智能指针 shared_ptr shared_ptr 是一个标准的共享所有权的智能指针, 允许多个指针指向同一个对象. 定义在 memory 文件中(非memory.h), 命名空间为 std. std::shared_ptr<int> sp1 std::make_shared<int>(10);std::shared_ptr<std::string> sp2 std::…

【Python】ubuntu14安装pycaffe环境:python2.7及依赖库

1、问题描述 ubuntu14自带的python2.7版本是python2.7.5&#xff0c;安装pycaffe环境时&#xff0c;出现错误&#xff0c;提示版本低。在bing上搜索源码安装python2.7.16的步骤&#xff0c;后续使用时&#xff0c;又报错&#xff0c;缺少SLL模块&#xff1a; Cant connect to…

周志华、张潼亲自辅导AI课程,DeeCamp 2019正式启动

4 月 8 日&#xff0c;创新工场对外宣布 DeeCamp 2019 人工智能训练营正式启动。 据介绍&#xff0c;DeeCamp 2019 将于 7 月 15 日至 8 月 23 日在北京、上海、南京、广州四地同时举办。今年招生规模也将扩大&#xff0c;计划招收 600 名大学生&#xff0c;进行为期 5 周的理…

No.2 条件

2019独角兽企业重金招聘Python工程师标准>>> clojure中不仅有if 还有when 还有什么when-do when-first when-let 一堆 首先介绍if (defn if? [x](if (pos? x)x(- x))) 这事一个取绝对值的方法,方法名改了下,pos? 是判断是否为正数 参数只能为数字 能看明白吧…

如何用Python和BERT做中文文本二元分类?| 程序员硬核评测

点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」全日程揭晓&#xff0c;请扫码咨询 ↑↑↑作者 | 王树义来源 | 王树芝兰&#xff08;ID:nkwangshuyi&#xff09;兴奋去年&#xff0c; Google 的 BERT 模型一发布出来&#xff0c;我就很兴奋。因为我当时正在用 fast.ai 的…

【C++】Google Protocol Buffer(protobuf)详解(二)

代码走读&#xff1a;caffe中protobuf的详细使用过程 【一】proto文件&#xff0c;以caffe.proto中BlobShape为例 syntax "proto2"; //指明protobuf版本&#xff0c;默认是v2&#xff0c;其它版本&#xff1a;"proto3"package caffe; // 最终生成c代码…

Linux使用

软件操作 软件包管理 yum安装 yum install ...卸载 yum remove ...搜索 yum serach ...清理缓存 yum clean packages列出已安装 yum list软件包信息 yum info ...硬件资源信息 内存free -m 硬盘df -h 负载&#xff08;w或top&#xff09;w 12:53:49 up 2:33, 3 users, load ave…

通过进程ID获得该进程主窗口的句柄

一个进程可以拥有很多主窗口&#xff0c;也可以不拥有主窗口&#xff0c;所以这样的函数是不存在的&#xff0c;所幸的是&#xff0c;相反的函数是有的。所以我们可以调用EnumWindows来判断所有的窗口是否属于这个进程。 typedef struct tagWNDINFO{  DWORD dwProcessId;  …

【AI】caffe源码分析(一)

【一】caffe依赖开源库 【C】google gflags详解 【C】google glog详解 【C】Google Protocol Buffer&#xff08;protobuf&#xff09;详解&#xff08;一&#xff09; 【C】Google Protocol Buffer&#xff08;protobuf&#xff09;详解&#xff08;二&#xff09; 【C】goog…

专访博世王红星:大数据和AI将是中国制造业升级新动力

数据分析挖掘与工业大数据是智能制造与工业互联网的核心&#xff0c;其本质是通过促进数据的自动流动与智能决策去解决控制和业务问题&#xff0c;有效减少决策过程所带来的不确定性&#xff0c;并尽量克服人工决策的缺点&#xff0c;从而推动智能制造进程与智能工厂的建设&…

C进阶 - 内存四驱模型

一.内存四驱模型 不知我们是否有读过 《深入理解 java 虚拟机》这本书&#xff0c;强烈推荐读一下。在 java 中我们将运行时数据&#xff0c;分为五个区域分别是&#xff1a;程序计数器&#xff0c;java 虚拟机栈&#xff0c;本地方法栈&#xff0c;java 堆&#xff0c;方法区。…

ATEN—第十章OSPF的高级配置(4)

实验使用的工具&#xff1a;小凡模拟器一、在路由器R1上&#xff0c;配置接口&#xff0c;启动ospf路由进程和rip,宣告网段&#xff0c;并配置路由重分发★☆R1☆★☆→Router>Router>enableRouter#config terminalRouter(config)#hostname R1-jinR1-jin(config)#interfa…

【ubuntu】ubuntu14.04、16.04、18.04 LTS版本支持时间

0、历史版本下载地址 http://old-releases.ubuntu.com/releases/ http://mirrors.163.com/ubuntu-releases/ 1、官网说明 https://wiki.ubuntu.com/Kernel/LTSEnablementStack 2、简要记录 如下图&#xff1a; 14.04.0(v3.13) 14.04.1(v3.13) 14.04.5(v4.4) LTS 支持至 20…

BERT拿下最佳长论文奖!NAACL 2019最佳论文奖公布

点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」全日程揭晓&#xff0c;请扫码咨询 ↑↑↑作者 | 刘静编辑 | 李尔客本文经授权转自公众号图灵Topia&#xff08;ID&#xff1a;turingtopia&#xff09;今日&#xff0c;自然语言处理顶会NAACL 2019最佳论文奖公布&#xff…