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("用户取消!");
                    }
                }
                );
            }
        }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值