在创建之初我们先区分一下 excel表格文件,区别于两种格式,一种是xls,一种是xlsx格式其中两者的区别:.xls格式单个工作表最多支持65536行,256列。.xlsx格式最多支持1048576行,16384列。此外就是,存储同样多的数据,.xlsx格式文件更小。
我们在程序开发当中,在做数据收集时,难免会遇到程序当中的一些数据处理,如将数据收集,分类或计算,我们通常有时的需求需要对数据进行一个保存。保存当中我们可以采用很多形式如
其中本文主要讲解表格文件的储存方式。
实现目标效果,项目当中使用的是NPOI的包来实现的,实现创建表格、单元格、单元格字体设置、最终完成表格的创建和设计。
下载步骤 用户在"工具 (菜单项)"上左键单击、在"管理解决方案的 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基础功能使用详则
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表格
{
///
/// MainWindow.xaml 的交互逻辑
///
public partial class MainWindow : Window
{
DataTable dt;
public MainWindow()
{
InitializeComponent();
}
///
/// 导入方法
///
/// 文件路径
///
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;
}
}
///
/// 导出
///
/// 文件路径
/// 数据文件
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));
}
///
/// 导出
///
///
///
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);
}
///
/// 导入
///
///
///
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数据类型
///
/// 转换为一个DataTable
///
///
/// param >
///
public static DataTable dataTable(IEnumerable 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;
}
文章最后如有不理解可以评论或私信一起交流学习