WPF实现DataGrid导出CSV格式

一.首先介绍下CSV以及它和Excel的区别

逗号分隔值(Comma-Separated Values,CSV),其文件以纯文本形式存储表格数据(数字和文本),文件的每一行都是一个数据记录。每个记录由一个或多个字段组成,用逗号分隔。使用逗号作为字段分隔符是此文件格式的名称的来源,因为分隔字符也可以不是逗号,有时也称为字符分隔值。

CSV广泛用于不同体系结构的应用程序之间交换数据表格信息,解决不兼容数据格式的互通问题,一般按照传输双方既定标准进行格式定义,而其本身并无明确格式标准。

1、Excel
(1). Excel不仅可以存储数据,还可以对数据进行操作
(2). 任何用于解析Excel数据的编程语言库通常都会更大,更慢,更复杂
(3). Excel导入数据时消耗更多的内存
2、CSV (即Comma Separate Values,这种文件格式经常用来作为不同程序之间的数据交互的格式。)
(1). CSV文件在windows平台默认的打开方式是excel,但是它的本质是一个文本文件,它存储数据,但不包含格式,公式,宏等。它也被称为平面文件
(2). CSV文件的体积更小,创建分发读取更加方便,适合存放结构化信息,比如记录的导出,流量统计等等
(3). 导入CSV文件可以更快,而且消耗更少的内存

总结:excel中后缀为csv和xls,二者区别如下:
1、xls 文件就是Microsoft excel电子表格的文件格式。
2、csv是最通用的一种文件格式,它可以非常容易地被导入各种PC表格及数据库中

二.导出CSV的两种方式

第一种方式比较简单,但是在实际使用中会存在一定缺陷,比如当字段中有比较长的数字字段存在时,在用excel软件查看csv文件时就会变成科学技术法的表现形式。其实这个问题跟用什么语言导出csv文件没有关系。Excel显示数字时,如果数字大于12位,它会自动转化为科学计数法;如果数字大于15位,它不仅用于科学技术法表示,还会只保留高15位,其他位都变0

 

该案例是在MVVM模式下,代码量较少,大家可以根据自己的项目需求进行更改

 public ICommand TwoSpeedExportToCSV
        {
            get
            {
                return new DelegateCommand<DataGrid>((grid) =>
                {
                    SaveFileDialog objSFD = new SaveFileDialog()
                    {
                        DefaultExt = "csv",
                        Filter = "CSV Files (*.csv)|*.csv|Excel XML (*.xml)|*.xml|All files (*.*)|*.*",
                        FilterIndex = 1
                    };
                    if (objSFD.ShowDialog() == true)
                    {
                        string strFormat = objSFD.FileName;
                        grid.SelectAllCells();
                        grid.ClipboardCopyMode = DataGridClipboardCopyMode.IncludeHeader;
                        ApplicationCommands.Copy.Execute(null, grid);
                        grid.UnselectAllCells();
                        string result = (string)System.Windows.Clipboard.GetData(System.Windows.DataFormats.CommaSeparatedValue);
                        File.AppendAllText(strFormat, result, UnicodeEncoding.UTF8);
                        Clipboard.Clear();//清空粘贴板               
                        MessageBox.Show("导出成功");
                    }
                }
                );
            }

第二种方式比较通用,可以导出任何excel支持的格式

首先需要下载NPOI管理程序包,然后建立一个通用类ExcelHelper,如下:

using NPOI.HSSF.UserModel;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Windows.Controls;

namespace ElecWaterCICC.Tools
{
    public class ExcelHelper
    {
        #region 打开保存excel对话框返回文件名
        public static string SaveExcelFileDialog(string fileName)
        {
            var sfd = new Microsoft.Win32.SaveFileDialog()
            {
                DefaultExt = "xls",
                Filter = "excel files(*.xls)|*.xls|excel files(*.csv)|*.csv|All files(*.*)|*.*",
                FilterIndex = 1
            };
            sfd.FileName = fileName;
            if (sfd.ShowDialog() != true)
                return null;
            return sfd.FileName;
        }
        #endregion
        #region 打开excel对话框返回文件名
        public static string OpenExcelFileDialog()
        {
            var ofd = new Microsoft.Win32.OpenFileDialog()
            {
                DefaultExt = "xls",
                Filter = "excel files(*.xls)|*.xls|All files(*.*)|*.*",
                FilterIndex = 1
            };

            if (ofd.ShowDialog() != true)
                return null;
            return ofd.FileName;
        }
        #endregion
        #region 读excel
        public static DataTable ImportExcelFile()
        {
            DataTable dt = new DataTable();

            //打开excel对话框
            var filepath = OpenExcelFileDialog();
            if (filepath != null)
            {
                HSSFWorkbook hssfworkbook = null;
                #region//初始化信息
                try
                {
                    using (FileStream file = new FileStream(filepath, FileMode.Open, FileAccess.Read))
                    {
                        hssfworkbook = new HSSFWorkbook(file);
                    }
                }
                catch (Exception e)
                {
                    throw e;
                }
                #endregion
                var sheet = hssfworkbook.GetSheetAt(0);
                System.Collections.IEnumerator rows = sheet.GetRowEnumerator();
                for (int j = 0; j < (sheet.GetRow(0).LastCellNum); j++)
                {
                    dt.Columns.Add(Convert.ToChar(((int)'A') + j).ToString());
                }
                while (rows.MoveNext())
                {
                    HSSFRow row = (HSSFRow)rows.Current;
                    DataRow dr = dt.NewRow();
                    for (int i = 0; i < row.LastCellNum; i++)
                    {
                        var cell = row.GetCell(i);
                        if (cell == null)
                        {
                            dr[i] = "";
                        }
                        else
                        {
                            if (cell.CellType == NPOI.SS.UserModel.CellType.Numeric)
                            {
                                if (HSSFDateUtil.IsCellDateFormatted(cell))
                                {
                                    dr[i] = cell.DateCellValue;
                                }
                                else
                                {
                                    dr[i] = cell.NumericCellValue;
                                }
                            }
                            else if (cell.CellType == NPOI.SS.UserModel.CellType.Boolean)
                            {
                                dr[i] = cell.BooleanCellValue;
                            }
                            else
                            {
                                dr[i] = cell.StringCellValue;
                            }
                        }
                    }
                    dt.Rows.Add(dr);
                }
            }
            return dt;
        }
        #endregion

        #region list转datatable
        public static DataTable ListToDataTable<T>(IEnumerable<T> c)
        {
            var props = typeof(T).GetProperties();
            var dt = new DataTable();
            dt.Columns.AddRange(props.Select(p => new DataColumn(p.Name, p.PropertyType)).ToArray());
            if (c.Count() > 0)
            {
                for (int i = 0; i < c.Count(); i++)
                {
                    ArrayList tempList = new ArrayList();
                    foreach (PropertyInfo item in props)
                    {
                        object obj = item.GetValue(c.ElementAt(i), null);
                        tempList.Add(obj);
                    }
                    dt.LoadDataRow(tempList.ToArray(), true);
                }
            }
            return dt;
        }
        #endregion

        #region 写入excel
        public static bool WriteExcel(DataTable dt, string fileName = "")
        {
            //打开保存excel对话框
            var filepath = SaveExcelFileDialog(fileName);
            if (filepath == null)
                return false;

            if (!string.IsNullOrEmpty(filepath) && null != dt && dt.Rows.Count > 0)
            {
                NPOI.HSSF.UserModel.HSSFWorkbook book = new NPOI.HSSF.UserModel.HSSFWorkbook();
                NPOI.SS.UserModel.ISheet sheet = book.CreateSheet("Sheet1");
                NPOI.SS.UserModel.IRow row = sheet.CreateRow(0);
                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    row.CreateCell(i).SetCellValue(dt.Columns[i].ColumnName);
                }
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    NPOI.SS.UserModel.IRow row2 = sheet.CreateRow(i + 1);
                    for (int j = 0; j < dt.Columns.Count; j++)
                    {
                        row2.CreateCell(j).SetCellValue(Convert.ToString(dt.Rows[i][j]));
                    }
                }
                // 写入到客户端  
                using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
                {
                    book.Write(ms);
                    using (FileStream fs = new FileStream(filepath, FileMode.Create, FileAccess.Write))
                    {
                        byte[] data = ms.ToArray();
                        fs.Write(data, 0, data.Length);
                        fs.Flush();
                    }
                    book = null;
                }
            }
            return true;
        }
        #endregion
        #region DataGrid转DataTable
        public static DataTable ConvertToDataTable(System.Windows.Controls.DataGrid dataGrid)
        {
            System.Data.DataTable dt = new System.Data.DataTable();

            //获取表头
            for (int i = 0; i < dataGrid.Columns.Count; i++)
            {
                if (dataGrid.Columns[i].Visibility == System.Windows.Visibility.Visible)//只导出可见列  
                {
                    if (dataGrid.Columns[i].Header == null)
                    {
                        dt.Columns.Add(string.Empty);
                        continue;
                    }
                    dt.Columns.Add(dataGrid.Columns[i].Header.ToString());//构建表头  
                }
            }
            //获取内容
            for (int i = 0; i < dataGrid.Items.Count; i++)
            {
                int columnsIndex = 0;
                System.Data.DataRow row = dt.NewRow();
                for (int j = 0; j < dataGrid.Columns.Count; j++)
                {
                    if (dataGrid.Columns[j].Visibility == System.Windows.Visibility.Visible)
                    {

                        if (dataGrid.Items[i] != null && (dataGrid.Columns[j].GetCellContent(dataGrid.Items[i]) as TextBlock) != null)//填充可见列数据  
                        {
                            string str= (dataGrid.Columns[j].GetCellContent(dataGrid.Items[i]) as TextBlock).Text.ToString();
                            row[columnsIndex] = str;
                        }
                        else
                        {
                            row[columnsIndex] = "";
                        }
                        columnsIndex++;
                    }
                }
                dt.Rows.Add(row);
            }
            return dt;
        }
        /// <summary>
        /// DataGrid转DataTable
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="dataGrid"></param>
        /// <param name="ennumber"></param>
        /// <returns></returns>
        public static DataTable ConvertToDataTable<T>(System.Windows.Controls.DataGrid dataGrid,List<T> ennumber)
        {
            System.Data.DataTable dt = new System.Data.DataTable();
            //获取表头
            for (int i = 0; i < dataGrid.Columns.Count; i++)
            {
                if (dataGrid.Columns[i].Visibility == System.Windows.Visibility.Visible)//只导出可见列  
                {
                    if (dataGrid.Columns[i].Header == null)
                    {
                        dt.Columns.Add(string.Empty);
                        continue;
                    }
                    dt.Columns.Add(dataGrid.Columns[i].Header.ToString());//构建表头  
                }
            }

            //获取内容
            foreach (var item in ennumber)
            {
                int columnsIndex = 0;
                System.Data.DataRow row = dt.NewRow();
                for (int j = 0; j < dataGrid.Columns.Count; j++)
                {
                    foreach (var type in item.GetType().GetProperties())
                    {
                        if (type.Name.Equals(dataGrid.Columns[j].SortMemberPath))
                        {
                            if (type.GetValue(item) != null)
                            {
                                string str = type.GetValue(item).ToString();
                                row[columnsIndex] = str;
                            }
                            else
                            {
                                row[columnsIndex] = "";
                            }
                            break;
                        }
                    }
                    columnsIndex++;
                }
                dt.Rows.Add(row);
            }
            return dt;
        }
        #endregion
    }
}

导出CSV 

public ICommand TwoSpeedExportToCSV
        {
            get
            {
                return new DelegateCommand<DataGrid>((grid) =>
                {
                    if (grid.Items.Count == 0)
                    {
                        MessageBox.Show("数据未加载,请查询后,在点击导出按键");
                       return;
                    }
                    List<ASMCHECKDATA_Entity> da = (grid.ItemsSource as ObservableCollection<ASMCHECKDATA_Entity>).ToList();
                    DataTable dt = ExcelHelper.ConvertToDataTable(grid, da);
                    if (dt == null)
                    {
                        MessageBox.Show("页面打开错误,请重新点击进入!");
                        return;
                    }
                    if (ExcelHelper.WriteExcel(dt, "稳态数据统计" + DateTime.Now.ToString("yyyy-MM-dd")))
                    {
                        MessageBox.Show("导出完成!");
                    }
                    else
                    {
                        MessageBox.Show("用户取消!");
                    }
                }
                );
            }
        }

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要将WPFDataGrid导出到Excel,需要使用第三方库或插件来实现。可以使用EPPlus或NPOI等库,也可以使用Syncfusion或DevExpress等插件来完成。具体实现方式可以参考各个库或插件的官方文档或示例代码。 ### 回答2: WPF中的DataGrid与Excel之间的数据交互可以通过数据绑定和数据模型来实现。在WPF中,我们可以通过将DataGrid的数据源与一个数据模型绑定,使用数据模型将DataGrid中的数据导出到Excel。 首先,我们需要创建一个继承自System.Windows.Documents.FlowDocument类的自定义类,用于实现将数据写入Excel。在自定义类中,我们需要创建一个方法,通过DataRowCollection对象遍历表格的行和列,将数据值按照Excel中表格的行列存储方式写入到Excel中。 接着,在我们需要将DataGrid数据导出到Excel的事件中,我们需要创建一个Excel文档,并使用数据模型将DataGrid中的数据导出到Excel中。在导出数据时,我们需要使用Range对象指定Excel表格中的单元格范围,并用数据模型中的数据填充单元格。 WPF中的DataGrid与Excel之间的数据转换可以通过使用数据模型和数据绑定来实现。在数据模型中,我们可以将DataGrid中的数据生成Excel表格,并将数据绑定到Excel中的单元格中。同时,我们可以使用Excel控件来处理Excel文档并导出数据。 总体来说,WPFDataGrid导出到Excel可以通过数据模型和数据绑定来实现,在导出数据时我们需要使用Range对象指定单元格范围,并使用数据模型中的数据填充单元格。这一过程需要仔细考虑数据的格式和内容,以确保正确的导出Excel文档。 ### 回答3: WPFDataGrid是一种强大的控件,它可以加载数据并以可视化的形式展示在界面上,对于需要复杂数据交互及展示的应用场景来说,是非常实用的。不过,有时候我们需要将DataGrid中的数据导出到Excel中,方便进行统计分析,或者需要向其他人提供数据,这时如何进行导出呢? 以下是一些实现方法: 1.将数据从DataGrid中提取出来,并将提取的数据存放在Excel文件中。我们可以读取DataGrid中的数据,将其转换为DataTable形式,然后使用专门的库如EPPlus,将DataTable的数据写入Excel文件中。 2.使用DataGrid控件绑定的ObservableCollection在Code Behind中创建Excel文件。我们同样可以通过DataGrid控件绑定的数据,创建相应的Excel文件,我们可以创建一个新的Excel工作表,将ObservableCollection中的每一行数据写入工作表中。 无论采用哪种方法,都需要使用到专业的库。一些可行的库如下: 1.EPPlus。EPPlus是一个开源的.NET类库,它使用Open XML SDK完成Excel文件操作。EPPlus具有Excel对象模型(Workbook,Worksheet,Range等),可以动态处理和生成Excel工作表。 2.Microsoft.Office.Interop.Excel。这个库是来自微软的一个组件,在使用时需要先引入相应的库。使用Microsoft.Office.Interop.Excel需要安装Microsoft Office Excel 2007或更高版本,它使用COM互操作性,而不是Open XML格式解析。 总体来说,将WPFDataGrid导出到Excel中并不难,只要我们掌握了相应的库和API,就可以轻松实现这个功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值