WPF-将DataGrid控件中的数据导出到Excel
原文: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的更多相关文章
- 机房收费系统——在VB中将MSHFlexGrid控件中的数据导出到Excel
机房收费系统中,好多查询的窗体都包含同一个功能:将数据库中查询到的数据显示在MSHFlexGrid控件中,然后再把MSHFlexGrid控件中的数据导出到Excel表格中. 虽然之前做过学生信息管理系 ...
- 关于使用MVVM模式在WPF的DataGrid控件中实现ComboBox编辑列
最近在做一个组态软件的项目,有一个需求需要在建立IO设备变量的时候选择变量的类型等. 建立IO变量的界面是一个DataGrid实现的,可以一行一行的新建变量,如下如所示: 这里需要使用带有ComboB ...
- vb6如何将MSHFlexGrid控件中的内容导出为Excel
首先的是是准备工作 需要引用 Microsoft Excel 11.0 Object Library 需要添加控件Mircrosoft Hierarchical FlexGrid Control 6. ...
- 获取WPF的DataGrid控件中,是否存在没有通过错误验证的Cell
/// <summary> /// 获取DataGrid的所有行是否存在验证错误. /// </summary> /// &l ...
- SQL C# nvarchar类型转换为int类型 多表查询的问题,查询结果到新表,TXT数据读取到控件和数据库,生成在控件中的数据如何存到TXT文件中
在数据库时候我设计了学生的分数为nvarchar(50),是为了在从TXT文件中读取数据插入到数据库表时候方便,但是在后期由于涉及到统计问题,比如求平均值等,需要int类型才可以,方法是:Conver ...
- WPF的DataGrid控件从excel里复制数据然后粘贴
WPF的DataGrid控件不能像winform的DataGridView控件一样,支持值的粘贴.WPF的DataGrid控件本质上是跟数据绑定联系在一起,所以需要进行复制粘贴的操作,可以在wpf里用 ...
- WPF 4 DataGrid 控件(进阶篇一)
原文:WPF 4 DataGrid 控件(进阶篇一) 上一篇<WPF 4 DataGrid 控件(自定义样式篇)>中,我们掌握了DataGrid 列表头.行表头.行.单元格相关的 ...
- WPF 4 DataGrid 控件(进阶篇二)
原文:WPF 4 DataGrid 控件(进阶篇二) 上一篇<WPF 4 DataGrid 控件(进阶篇一)>中我们通过DataGridTemplateColumn 类自定义编辑 ...
- WPF 4 DataGrid 控件(基本功能篇)
原文:WPF 4 DataGrid 控件(基本功能篇) 提到DataGrid 不管是网页还是应用程序开发都会频繁使用.通过它我们可以灵活的在行与列间显示各种数据.本篇将详细介绍WPF 4 中 ...
随机推荐
- Redis在windows下的环境搭建
Redis在windows下的环境搭建 下载windows版本redis,,官方下载地址:http://redis.io/download, 不过官方没有Windows版本,官网只提供linux版本的 ...
- ActiveMQ修改连接的用户名密码
安装目录下conf/activemq.xml 添加如下内容: <plugins> <simpleAuthenticationPlugin> <users> < ...
- 《Redis深度历险:核心原理和应用实践》学习笔记一
1.redis五种数据结构 1.1 String字符串类型,对应java字符串类型 用户信息序列化后,可以用string类型存入redis中批量读写string类型,见效网络消耗数字类型的string ...
- Vue实例与组件的关系
所有的 Vue 组件都是 Vue 实例,可以看成Vue组件就是Vue实例的扩展. <div id="app"> <child></child> ...
- ThinkPHP import 类库导入 include PHP文件
ThinkPHP 模拟了 Java 的类库导入机制,统一采用 import 方法进行类文件的加载.import 方法是 ThinkPHP 内建的类库和文件导入方法,提供了方便和灵活的文件导入机制,完全 ...
- 微软Cortana可以帮助任何人解锁您的Windows 10系统
Cortana是微软在每个版本的Windows10中都内置的基于人工智能的智能助手,可以帮助攻击者解锁你的系统密码. 在周二发布的最新补丁中,微软推出了一项重要更新,以解决Cortana中容易被利用的 ...
- python基础:7.求结果
求结果: v1 = 1 or 3 v2 = 1 and 3 v3 = 0 and 2 and 1 v4 = 0 and 2 or 1 v5 = 0 and 2 or 1 or 4 v6 = 0 o ...
- java资料搜索网站
http://yun.java1234.com/ 盘多多 B站 一个集成了很多springboot功能的地址 https://gitbub.com/runzhenghengbin/SpringBoot ...
- php nl2br()函数 语法
php nl2br()函数 语法 作用:在字符串中的新行(\n)之前插入换行符dd马达 语法:nl2br(string,xhtml) 参数: 参数 描述 string 必须.规定要检查的字符串. xh ...
- angualr项目引入容联 七陌7mroo
最近项目要求在注册页面增加客服服务浮窗,各种查找资料准备采用7moor来实现.现记录一下实现过程,便于后期查看: 引入7moor浮窗有两种方式: 1.h5方式,这种情况一般是单独打开新页面即可: 直接 ...