实习笔记 C#创建excel表格并且学会使用NPOI

前言 

     在创建之初我们先区分一下 excel表格文件,区别于两种格式,一种是xls,一种是xlsx格式其中两者的区别:.xls格式单个工作表最多支持65536行,256列。.xlsx格式最多支持1048576行,16384列。此外就是,存储同样多的数据,.xlsx格式文件更小。

实例

     我们在程序开发当中,在做数据收集时,难免会遇到程序当中的一些数据处理,如将数据收集,分类或计算,我们通常有时的需求需要对数据进行一个保存。保存当中我们可以采用很多形式如

  • 储存在数据库当中
  • 储存为xml文件
  • 储存为表格文件

其中本文主要讲解表格文件的储存方式。

一、 C#手动创建excel表格

     实现目标效果,项目当中使用的是NPOI的包来实现的,实现创建表格、单元格、单元格字体设置、最终完成表格的创建和设计。

第一步 下载NPOI包,完成创建excel表格文件

     下载步骤 用户在"工具 (菜单项)"上左键单击、在"管理解决方案的 NuGet 程序包... (菜单项)"上左键单击、搜索NPOI 下载2.5.6版本如下图1-1示例

图1-1下载示例 

代码创建:表格

   IWorkbook objects = new HSSFWorkbook();
            ISheet objectss = objects.CreateSheet("数据信息");//创建表单
            objects.Write(new FileStream("测试文件1.xls", FileMode.OpenOrCreate, FileAccess.Write));


            IWorkbook objects1 = new XSSFWorkbook();
            ISheet biao = objects1.CreateSheet("数据信息2");//创建表单
            objects1.Write(new FileStream("测试文件2.xlsx", FileMode.OpenOrCreate, FileAccess.Write));

示例解释:

     其中第一段创建的表格信息文件名称为,“测试文件” 其中IWorkbook是程序当中的写法具体解释不太清除,但其中后面的HssWorkbook是指定创建的文件后缀为xls文件,而第二段XSSFWorKbook是指定创建的是文件后缀为xlsx文件。其两者的区别前面已做解释。其中当前代码中要掌握的便是1创建指定格式表格文件、2创建表单、3写入指定位置保存文件。其中创建表单是指如下图1-2所示

图1-2

     如果想创建多个表单那么可以修改一下上面的代码  将表单多次创建 其中表单Isheet有很多属性和设置我们后续讲解

            IWorkbook objects1 = new XSSFWorkbook();
            ISheet biao = objects1.CreateSheet("数据信息2");//创建表单
            objects1.CreateSheet("3");
            objects1.CreateSheet("4");
            objects1.CreateSheet("5");
            objects1.CreateSheet("6");
            objects1.Write(new FileStream("测试文件2.xlsx", FileMode.OpenOrCreate, FileAccess.Write));

第二步 创建表格当中的列、行、单元格

代码创建:第一行第一列第一个单元格,单元格内显示“列名”

IWorkbook objects = new HSSFWorkbook();
ISheet objectss = objects.CreateSheet("数据信息");//创建表单
IRow row = objectss.CreateRow(0);//创建第1行
ICell cell=    row.CreateCell(0);//创建第1行第1列
cell.SetCellValue("列名");//第1行第1列的值为 "第一行第一个的显示内容"         
objects.Write(new FileStream("测试文件1.xls", FileMode.OpenOrCreate, FileAccess.Write));

示例解释: 

     在第1行第2列追加内容"名字"  修改前面代码(提示:可以添加行的时候不用IRow接收也可使用HssFRow接收因为此类显示实现了接口IRow。XSSFRow也是如此)其中需知:单元格行列等都是从0开始的0就是对应的1 效果在文件中如下图1-3

图1-3 

在原文件中追加名称,将上方部分代码修改如下

IWorkbook objects = new HSSFWorkbook();
ISheet objectss = objects.CreateSheet("数据信息");//创建表单
IRow row = objectss.CreateRow(0);//创建第1行
ICell cell=    row.CreateCell(0);//创建第1行第1列
cell.SetCellValue("列名");//第1行第1列的值为 "第一行第一个的显示内容"
row.CreateCell(1).SetCellValue("名称");//在拿到行的对象row后再行上的第二列追加内容 名称
objects.Write(new FileStream("测试文件1.xls", FileMode.OpenOrCreate, FileAccess.Write));

效果如下图1-4

图1-4 

 第三步 单元格设置字体样式大小等

代码创建:单元格样式

IWorkbook objects = new HSSFWorkbook();
ISheet objectss = objects.CreateSheet("数据信息");//创建表单
IRow row = objectss.CreateRow(0);//创建第1行
ICell cell = row.CreateCell(0);//创建第1行第1列
cell.SetCellValue("列名");//第1行第1列的值为 "第一行第一个的显示内容"
row.CreateCell(1).SetCellValue("名称");//在拿到行的对象row后再行上的第二列追加内容 名称
//使用表格创建一个样式
ICellStyle cellStyle = objects.CreateCellStyle();
cellStyle.WrapText = true;
cellStyle.BottomBorderColor = 10;
HSSFFont font = (HSSFFont)objects.CreateFont();
font.FontName = "想";
font.Color = 10;//字体颜色
font.IsItalic = true;//是否倾斜
font.TypeOffset = FontSuperScript.Super;
font.IsBold = true;//是否加粗
font.FontHeight = 20*20;//字体大小
cellStyle.SetFont(font);//附上字体配置

cell.CellStyle = cellStyle;
objects.Write(new FileStream("测试文件1.xls", FileMode.OpenOrCreate, FileAccess.Write));

示例解释:

     创建单元格样式很简单1用Iworkbook创建一个样式2设置样式的属性3将创建并设置好的样式IcellStyle类型的对象赋值给单元格属性CellStyle。提示再设置字体属性时,需手动创建一个IFont类型变量其中HssFFont和XSSFFont都显示实现了当前接口,上述代码就是通过IWorkbook类型变量创建一个字体设置的方法CreateFont(),再将属性进行赋值,以达到效果。

二、 熟练使用NPOI包基础功能

此章节内容中NPOI有许多的功能大家可以去下面这个链接查看 注:链接内容非本人撰写

NPOI基础功能使用详则

三、 实战:导入excel表格导出Datagrid表格数据

<Window x:Class="创建excel表格.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:创建excel表格"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <StackPanel>

            <DataGrid Height="500" ScrollViewer.VerticalScrollBarVisibility="Visible"  HorizontalAlignment="Left"  Name="s" CanUserAddRows="False"   IsReadOnly="True"  AutoGenerateColumns="True"/>
            <Button Click="Button_Click"/>
        </StackPanel>
       
    </Grid>
</Window>
using Microsoft.Win32;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System;
using System.Data;
using System.IO;
using System.Text;
using System.Windows;
using Path = System.IO.Path;

namespace 创建excel表格
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        DataTable dt;
        public MainWindow()
        {
            InitializeComponent();
        }
        /// <summary>
        /// 导入方法
        /// </summary>
        /// <param name="fileName">文件路径</param>
        /// <returns></returns>
        public static DataTable ImportToTable(string fileName)
        {
            DataTable dt = new DataTable();//用来储存返回结果
            IWorkbook workbook;//创建工作簿
            string fileExt = Path.GetExtension(fileName).ToLower();//将选中的文件进行返回后缀,再将其转换为小写
            using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read))//读取文件
            {
                //XSSFWorkbook 适用XLSX格式,HSSFWorkbook 适用XLS格式
                if (fileExt == ".xlsx")
                {
                    workbook = new XSSFWorkbook(fs);
                }
                else if (fileExt == ".xls")
                {
                    workbook = new HSSFWorkbook(fs);
                }
                else
                {
                    workbook = null;
                    return null;
                }

                ISheet sheet = workbook.GetSheetAt(0);//获取第3个表中的内容 //Sheet总数量:workbook.NumberOfSheets

                //表头  
                IRow header = sheet.GetRow(sheet.FirstRowNum);
                for (int i = 0; i < header.LastCellNum; i++)
                {
                    object obj = header.GetCell(i);
                    if (obj == null || obj.ToString() == string.Empty)
                    {
                        dt.Columns.Add(new DataColumn("Columns" + i.ToString()));
                    }
                    else

                        dt.Columns.Add(new DataColumn(obj.ToString()));
                }
                //数据  
                for (int i = sheet.FirstRowNum + 1; i <= sheet.LastRowNum; i++)//sheet.FirstRowNum+1 表中的第1行+1  就是第二行开始   LastRowNum 最后一行数 等于最后一行跳出
                {
                    DataRow dr = dt.NewRow();//创建一行新行储存当前行数据
                    bool hasValue = false;
                    IRow row = sheet.GetRow(i);//获取表中 第i行
                    for (int j = row.FirstCellNum; j < row.LastCellNum; j++)//  row.FirstCellNum 第一个单元格    row.LastCellNum 最好一个单元格 
                    {
                        //第dr中的第j行的每一个单元格以此赋值
                        dr[j] = (sheet.GetRow(i).GetCell(j));//第二行第J个单元格
                        if (dr[j] != null && dr[j].ToString() != string.Empty)//判读得到的数据不是null和空再添加
                        {
                            hasValue = true;
                        }
                    }
                    if (hasValue)
                    {
                        dt.Rows.Add(dr);
                    }
                }

                return dt;
            }

        }
        /// <summary>
        /// 导出
        /// </summary>
        /// <param name="filename">文件路径</param>
        /// <param name="dataTable">数据文件</param>
        public static void export(string filename, DataTable dataTable)
        {
            //创建工作簿
            IWorkbook objects = new XSSFWorkbook();//xlsx
         ISheet objects1=   objects.CreateSheet();//创建个表单
            for (int i = 0; i < dataTable.Rows.Count; i++)
            {
             IRow cells=   objects1.CreateRow(i);
                for (int j = 0; j < dataTable.Columns.Count; j++)
                {
                    cells.CreateCell(j).SetCellValue(dataTable.Rows[i][j].ToString());
                }
            }
            objects.Write(new FileStream(filename, FileMode.OpenOrCreate, FileAccess.Write));
        }
        /// <summary>
        /// 导出
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            #region datagrid的数据直接添加时可用此方式转换为Datatable 
            //DataView dataView = new DataView();
            //s.ItemsSource = dataView;
            #endregion
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.Append(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory));
            export(stringBuilder.ToString()+"\\011.xlsx", dt);
        }
        /// <summary>
        /// 导入
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.ShowDialog();

            dt = ImportToTable(openFileDialog.FileName);
            if (dt != null)
            {
                //dt.Columns.RemoveAt(dt.Columns.Count-1);
                s.ItemsSource = dt.DefaultView;
                //ItemCollection itemCollection= s.Items;
                //  itemCollection.RemoveAt(s.Items.Count);
                //s.Columns.Remove()
            }
        }
    }

}
  #region datagrid的数据直接添加时可用此方式转换为Datatable 
            //DataView dataView = new DataView();
            //s.ItemsSource = dataView;
            #endregion

    我们再导出datagrid的数据的时候temsSource是IEnumerable类型其具体的数据可以无法通过上述方法转换我们需要将IEnumerable类型转换为DataTable数据类型

  /// <summary>
        /// 转换为一个DataTable
        /// </summary>
        /// <typeparam name="TResult"></typeparam>
        /// <param name = "value" ></ param >
        /// <returns></returns>
        public static DataTable dataTable<T>(IEnumerable<T> data)
        {
            PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T));
            var table = new DataTable();
            foreach (PropertyDescriptor prop in properties)
                table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);
            foreach (T item in data)
            {
                DataRow row = table.NewRow();
                foreach (PropertyDescriptor prop in properties)
                    row[prop.Name] = prop.GetValue(item) ?? System.DBNull.Value;
                table.Rows.Add(row);
            }
            return table;
        }

文章最后如有不理解可以评论或私信一起交流学习 

  • 2
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学软件开发的猪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值