【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
? ? ? ? 对于在工厂上班的小伙伴来说,导出生产数据、生成报表,这是很习以为常的一个工作。之前的文章中,虽然我们也介绍了json脚本、sqlite数据库、mysql数据库这类数据保存的方式,但是它们只是我们程序员比较熟悉的数据保存形式。而工厂里面的工人,或者车间的管理人员来说,他们比较习惯的树汇总方式其实还是报表,简单来说就是excel表格。
? ? ? ? 今天,我们正好学习下如果用c# wpf生成excel表格。在这过程中需要安装一下开源库ClosedXML。
? ? ? ? ClosedXml里面有一个Excel库,里面确实实现可以帮助我们创建生成excel文件的功能。所以,第一步,还是要麻烦大家安装一下ClosedXml库,直接用NuGet安装就可以了,
? ? ? ? 测试界面可以做的比较简单一点,比如就是一个按钮就行,内容如下所示,
<Window x:Class="WpfApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp"
mc:Ignorable="d"
Title="ExportDemo" Height="450" Width="800">
<Grid>
<Button x:Name="export" Content="export" Foreground="Green" Click="Start_Click" HorizontalAlignment="Left" Margin="300,195,0,0" VerticalAlignment="Top" Width="95" Height="45">
<Button.Resources>
<Style TargetType="{x:Type Border}">
<Setter Property="CornerRadius" Value="5"></Setter>
</Style>
</Button.Resources>
</Button>
</Grid>
</Window>
? ? ? ? 转成界面的话,就应该是这样,
? ? ? ? 代码中,最主要的内容其实就是按钮的回调函数。在函数中,一般有三个部分,第一就是准备excel的基本数据,这个数据结构DataTable就可以完成;第二个部分,就是选择保存的地址,一般会弹出一个对话框,让用户来进行选择;第三呢,就是用XlWorkbook把之前的DataTable数据收入进来,同时保存到对应的目录,如果整个过程没有问题,代表我们的过程就是ok的。
using ClosedXML.Excel;
using System;
using System.Collections.Generic;
using System.Data;
using System.Windows;
namespace WpfApp
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
// construct function
public MainWindow()
{
InitializeComponent();
}
// start button function
private void Start_Click(object sender, RoutedEventArgs e)
{
// set the title for each column
DataTable dataTable = new DataTable("Report");
dataTable.Columns.Add("Name", typeof(string));
dataTable.Columns.Add("Age", typeof(int));
dataTable.Columns.Add("Gender", typeof(string));
// add data
dataTable.Rows.Add("Bill", 30, "Male");
dataTable.Rows.Add("Jack", 25, "Male");
dataTable.Rows.Add("Lily", 20, "Female");
// choose path
Microsoft.Win32.SaveFileDialog saveFileDialog = new Microsoft.Win32.SaveFileDialog();
saveFileDialog.FileName = "Report";
saveFileDialog.DefaultExt = ".xlsx";
saveFileDialog.Filter = "Excel Workbook (.xlsx)|*.xlsx|All Files (*.*)|*.*";
bool? result = saveFileDialog.ShowDialog();
if (result == true)
{
try
{
// create file
using (var workbook = new XLWorkbook())
{
// create datasheet
workbook.Worksheets.Add(dataTable);
// save it to relevant path
workbook.SaveAs(saveFileDialog.FileName);
}
MessageBox.Show("Successfully export the file!", "Success", MessageBoxButton.OK, MessageBoxImage.Information);
}
catch (Exception ex)
{
MessageBox.Show($"Error is:{ex.Message}", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
}
}
}
? ? ? ? 编译无误之后,就可以开始测试和验证。验证有两个部分,第一,需要看下对话框有没有弹出,提示我们文件已经成功导出;第二,需要看下导出的文件,里面的内容和我们之前设计的部分是不是真的一致。