原文:WPF-将DataGrid控件中的数据导出到Excel

  导出至Excel是非常常见,我们可以用很多类库,例如Aspose、NOPI、Interop,在这里我们使用微软自家的工具。我的WPF绑定的ObservableCollection<T>集合。

        public string ExcelExport(System.Data.DataTable DT, string title)
{
try
{
//创建Excel
Microsoft.Office.Interop.Excel.Application ExcelApp = new Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop.Excel.Workbook ExcelBook = ExcelApp.Workbooks.Add(System.Type.Missing);
//创建工作表(即Excel里的子表sheet) 1表示在子表sheet1里进行数据导出
Microsoft.Office.Interop.Excel.Worksheet ExcelSheet = (Microsoft.Office.Interop.Excel.Worksheet)ExcelBook.Worksheets[];
//如果数据中存在数字类型 可以让它变文本格式显示
ExcelSheet.Cells.NumberFormat = "@";
//设置工作表名
ExcelSheet.Name = title;
//设置Sheet标题
string start = "A1";
string end = ChangeASC(DT.Columns.Count) + "";
Microsoft.Office.Interop.Excel.Range _Range = (Microsoft.Office.Interop.Excel.Range)ExcelSheet.get_Range(start, end);
_Range.Merge(); //单元格合并动作(要配合上面的get_Range()进行设计)
_Range = (Microsoft.Office.Interop.Excel.Range)ExcelSheet.get_Range(start, end);
_Range.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter;
_Range.Font.Size = ; //设置字体大小
_Range.Font.Name = "宋体"; //设置字体的种类
ExcelSheet.Cells[, ] = title; //Excel单元格赋值
_Range.EntireColumn.AutoFit(); //自动调整列宽
//写表头
for (int m = ; m <= DT.Columns.Count; m++)
{
ExcelSheet.Cells[, m] = DT.Columns[m - ].ColumnName.ToString();
start = "A2";
end = ChangeASC(DT.Columns.Count) + "";
_Range = (Microsoft.Office.Interop.Excel.Range)ExcelSheet.get_Range(start, end);
_Range.Font.Size = ; //设置字体大小
_Range.Font.Name = "宋体"; //设置字体的种类
_Range.EntireColumn.AutoFit(); //自动调整列宽
_Range.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter;
}
//写数据
for (int i = ; i < DT.Rows.Count; i++)
{
for (int j = ; j <= DT.Columns.Count; j++)
{
//Excel单元格第一个从索引1开始
// if (j == 0) j = 1;
ExcelSheet.Cells[i + , j] = DT.Rows[i][j - ].ToString();
}
}
//表格属性设置
for (int n = ; n < DT.Rows.Count + ; n++)
{
start = "A" + (n + ).ToString();
end = ChangeASC(DT.Columns.Count) + (n + ).ToString();
//获取Excel多个单元格区域
_Range = (Microsoft.Office.Interop.Excel.Range)ExcelSheet.get_Range(start, end);
_Range.Font.Size = ; //设置字体大小
_Range.Font.Name = "宋体"; //设置字体的种类
_Range.EntireColumn.AutoFit(); //自动调整列宽
_Range.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter; //设置字体在单元格内的对其方式 _Range.EntireColumn.AutoFit(); //自动调整列宽
}
ExcelApp.DisplayAlerts = false; //保存Excel的时候,不弹出是否保存的窗口直接进行保存
////弹出保存对话框,并保存文件
Microsoft.Win32.SaveFileDialog sfd = new Microsoft.Win32.SaveFileDialog();
sfd.DefaultExt = ".xlsx";
sfd.Filter = "Office 2007 File|*.xlsx|Office 2000-2003 File|*.xls|所有文件|*.*";
if (sfd.ShowDialog() == true)
{
if (sfd.FileName != "")
{
ExcelBook.SaveAs(sfd.FileName); //将其进行保存到指定的路径
System.Windows.MessageBox.Show("导出文件已存储为: " + sfd.FileName, "温馨提示");
}
}
//释放可能还没释放的进程
ExcelBook.Close();
ExcelApp.Quit();
return sfd.FileName;
}
catch
{
//System.Windows.MessageBox.Show("导出文件保存失败,可能原因该文件已打开!", "警告!");
return null;
}
}

该方法还不止这么多,还涉及到了1-27 = A-Z 的适配,如以下方法。

        /// <summary>
/// 获取当前列列名,并得到EXCEL中对应的列
/// </summary>
/// <param name="count"></param>
/// <returns></returns>
private string ChangeASC(int count)
{
string ascstr = "";
switch (count)
{
case :
ascstr = "A";
break;
case :
ascstr = "B";
break;
case :
ascstr = "C";
break;
case :
ascstr = "D";
break;
case :
ascstr = "E";
break;
case :
ascstr = "F";
break;
case :
ascstr = "G";
break;
case :
ascstr = "H";
break;
case :
ascstr = "I";
break;
case :
ascstr = "J";
break;
case :
ascstr = "K";
break;
case :
ascstr = "L";
break;
case :
ascstr = "M";
break;
case :
ascstr = "N";
break;
case :
ascstr = "O";
break;
case :
ascstr = "P";
break;
case :
ascstr = "Q";
break;
case :
ascstr = "R";
break;
case :
ascstr = "S";
break;
case :
ascstr = "T";
break;
default:
ascstr = "U";
break;
}
return ascstr;
}

最后我们获取数据给方法,下面是设计了数据转换到datatable的一个过程。

private void Export(object sender, RoutedEventArgs e)
{
DataTable newTB = new DataTable();
ObservableCollection<XModel.STORE_IN> instore = this.dataGrid.ItemsSource as ObservableCollection<XModel.STORE_IN>;
List<XModel.STORE_IN> list = new List<XModel.STORE_IN>(instore.ToList());
newTB = XTools.XHelper.Datavalidation.CopyToDataTable<XModel.STORE_IN>(list);
ExcelExport(newTB, "入库记录");
}
 public static class Datavalidation
{
public static DataTable CopyToDataTable<T>(this IEnumerable<T> array)
{
var ret = new DataTable();
foreach (PropertyDescriptor dp in TypeDescriptor.GetProperties(typeof(T)))
ret.Columns.Add(dp.Name);
foreach (T item in array)
{
var Row = ret.NewRow();
foreach (PropertyDescriptor dp in TypeDescriptor.GetProperties(typeof(T)))
Row[dp.Name] = dp.GetValue(item);
ret.Rows.Add(Row);
}
return ret;
}
}

WPF-将DataGrid控件中的数据导出到Excel的更多相关文章

  1. 机房收费系统——在VB中将MSHFlexGrid控件中的数据导出到Excel

    机房收费系统中,好多查询的窗体都包含同一个功能:将数据库中查询到的数据显示在MSHFlexGrid控件中,然后再把MSHFlexGrid控件中的数据导出到Excel表格中. 虽然之前做过学生信息管理系 ...

  2. 关于使用MVVM模式在WPF的DataGrid控件中实现ComboBox编辑列

    最近在做一个组态软件的项目,有一个需求需要在建立IO设备变量的时候选择变量的类型等. 建立IO变量的界面是一个DataGrid实现的,可以一行一行的新建变量,如下如所示: 这里需要使用带有ComboB ...

  3. vb6如何将MSHFlexGrid控件中的内容导出为Excel

    首先的是是准备工作 需要引用 Microsoft Excel 11.0 Object Library 需要添加控件Mircrosoft Hierarchical FlexGrid Control 6. ...

  4. 获取WPF的DataGrid控件中,是否存在没有通过错误验证的Cell

     /// <summary>         /// 获取DataGrid的所有行是否存在验证错误.         /// </summary>         /// &l ...

  5. SQL C# nvarchar类型转换为int类型 多表查询的问题,查询结果到新表,TXT数据读取到控件和数据库,生成在控件中的数据如何存到TXT文件中

    在数据库时候我设计了学生的分数为nvarchar(50),是为了在从TXT文件中读取数据插入到数据库表时候方便,但是在后期由于涉及到统计问题,比如求平均值等,需要int类型才可以,方法是:Conver ...

  6. WPF的DataGrid控件从excel里复制数据然后粘贴

    WPF的DataGrid控件不能像winform的DataGridView控件一样,支持值的粘贴.WPF的DataGrid控件本质上是跟数据绑定联系在一起,所以需要进行复制粘贴的操作,可以在wpf里用 ...

  7. WPF 4 DataGrid 控件(进阶篇一)

    原文:WPF 4 DataGrid 控件(进阶篇一)      上一篇<WPF 4 DataGrid 控件(自定义样式篇)>中,我们掌握了DataGrid 列表头.行表头.行.单元格相关的 ...

  8. WPF 4 DataGrid 控件(进阶篇二)

    原文:WPF 4 DataGrid 控件(进阶篇二)      上一篇<WPF 4 DataGrid 控件(进阶篇一)>中我们通过DataGridTemplateColumn 类自定义编辑 ...

  9. WPF 4 DataGrid 控件(基本功能篇)

    原文:WPF 4 DataGrid 控件(基本功能篇)      提到DataGrid 不管是网页还是应用程序开发都会频繁使用.通过它我们可以灵活的在行与列间显示各种数据.本篇将详细介绍WPF 4 中 ...

随机推荐

  1. elasticsearch 基础 —— Update By Query API

    Update By Query API 最简单的用法是_update_by_query在不更改源的情况下对索引中的每个文档执行更新.这对于获取新属性或其他一些在线映射更改很有用 .这是API: POS ...

  2. pwd - 显示出当前/活动目录的名称

    总览 (SYNOPSIS) pwd [OPTION] 描述 (DESCRIPTION) 显示出 完整的 当前 活动目录 名称. --help 显示 帮助 信息, 然后 退出 --version 显示 ...

  3. socket - Linux 套接字

    总览 #include <sys/socket.h> mysocket = socket(int socket_family, int socket_type, int protocol) ...

  4. vue,一路走来(11)--HTML5 History模式

    HTML5 History模式 项目中我用的是history模式. 默认 hash 模式 —— 使用 URL 的 hash 来模拟一个完整的 URL,于是当 URL 改变时,页面不会重新加载. 如果不 ...

  5. MySQL--15 MHA简介

    目录 一.MHA简介 二.工作流程 三.MHA架构图 四.MHA工具介绍 五.基于GTID的主从复制 六.部署MHA 一.MHA简介 松信嘉範: MySQL/Linux专家 2001年索尼公司入职 ...

  6. Opacity函数-transparentize()、 fade-out()函数

    transparentize() 和 fade-out() 函数所起作用刚好与 opacify() 和 fade-in() 函数相反,让颜色更加的透明.这两个函数会让透明值做减法运算,当计算出来的结果 ...

  7. Tab选项卡点击 滑动效果js实现

    html部分代码: [html] css部分代码: *{ margin: ; padding:; list-style: none; font-size: 12px; } .notice{ width ...

  8. java资料搜索网站

    http://yun.java1234.com/ 盘多多 B站 一个集成了很多springboot功能的地址 https://gitbub.com/runzhenghengbin/SpringBoot ...

  9. 使用Fiddler为满足某些特定格式的网络请求返回mock响应

    假设我想对本地Java程序发起的调用SAP Hybris web service https://jerrywang.com:9002/rest/v2/electronics/users/ 这个网络请 ...

  10. js中的回钓函数,C#中的委托

    $(function(){ myfunction(sayHi); }); var sayHi=function(){ alter('你好'); } function myfunction(a){ a( ...