C#将表格导出至Excel

  • 前言
  • 一、构建DataTable
    • 1.定义一个新的DataTable
    • 2.构建DataTable的列头属性
    • 3.再构建DataTable的行属性
    • 3.构建写入数据类
    • 4.选择文件目录
  • 二、将DataTable传入导出Excel函数(NPOI)
    • 1.调用Excel写入方法
    • 2.使用NPOI
    • 3.保存
  • 总结

前言

这是工作接触到的第一个项目,而我所要做的就是实现软件中的一个导出按钮功能,通过这个按钮,我们能够将软件中的一个数据表格导出至Excel。

一、构建DataTable

1.定义一个新的DataTable

代码如下:(using System.Data;)

public static DataTable dataDesignTable=new DataTable();

2.构建DataTable的列头属性

这个方法能将数据表里的表头加入进我们DataTable的表头。

public static DataTable ConstructDataProperty(ObservableCollection<DataGridColumn> datalst)
{ 
	DataTable dt = new DataTable();
	//设置区分大小写
	dt.CaseSensitive = true;
	foreach(var item in dataLst)
	{ 
		dt.Columns.Add(new DataColumn(item.Header.ToString(),typeof(string)));
	}
	return dt;
}

//列头导入dataTable。
//SetForm:窗体名,ProjectDesignData:控件名,Columns:列数据
//由于数据已经存在我们的控件之中,我们直接用即可
dataDesignTable = ConstructDataProperty(SetForm.ProjectDesignData.Columns).Copy();

3.再构建DataTable的行属性

//这里我们也是通过控件直接调用数据,并且直接做了类型转换,as后面的其实也是个List
var source = SetForm.ProjectDesignData.ItemSource as ObservableCollection<T_ZYCT_ProjectRoomPropertyEntity>;
//再将行数据导入至DataTable
foreach(var item in source)
{ 
	//在DataTable中新建一个列
	DataRow newRow = dataDesignTable.NewRow();
	//将这一列中的数据导入进去
	newRow["序号"]=item.Extend1;
	newRow["名称"]=item.Name;
	newRow["数量"]=item.Num;
	dataDesignTable.Rows.Add(newRow);
}

3.构建写入数据类

public class ExcelInfoData
{ 
	public string ExcelFileName;//excel文件名
	public List<ExcelWriteData> ExcelWriteDataLst {  get; set; }
}
public  class ExcelWriteData
{ 
	public string SheetName {  get; set; }//sheet名字
	public string ProjectName {  get; set; }//项目名字
	 public DataTable WriteDataTable {  get; set; }//DataTable
}
List<ExcelInfoData> excelInfoDatas = new List<ExcelInfoData>();
ExcelInfoData excelInfoData = new ExcelInfoData();
excelInfoData.ExcelWriteDataLst = new List<ExcelWriteData>();

ExcelWriteData excelWriteData = new ExcelWriteData();
excelWriteData.SheetName = "系统";
excelWriteData.WriteDataTable = dataDesignTable;

excelInfoData.ExcelWriteDataLst.Add(excelWriteData);

4.选择文件目录

SaveFileDialog saveDialog = new SaveFileDialog();
saveDialog.DefaultExt = "xlsx";
saveDialog.Filter = "Excel文件|*.xlsx";
saveDialog.ShowDialog();

excelInfoData.ExcelFileName = saveDialog.FileName;

二、将DataTable传入导出Excel函数(NPOI)

1.调用Excel写入方法

//ExcelWriteUtil是一个Excel写入类
//ExcelWrite是其中的一个写入方法
ExcelWriteUtil.ExcelWrite(excelInfoDatas);

2.使用NPOI

最开始并不知道有NPOI如此好的方法,自己用着最原始的方法将数据给写到了Excel,最后只能是导出一个表格居然都要等待2~3s,读取数据太慢,然后同事告诉了我NPOI。
当然NPOI也有它的优缺点。
优点:读取数据快,读取方式灵活,包含多个sheet的Excel单元格合并设置单元格字段、颜色、设置单元格为下拉框,并限制输入值,设置单元格只能输入数据等(能解决几乎所有的Excel问题)。
缺点:不能对已经打开的Excel进行操作,需要导入多个dll文件(引用,依赖文件)
NPOI.dll
NPOI.OOXML.dll
NPOI.OpenXml4Net.dll
NPOI.OpenXmlFormats.dll
ICSharpCode.SharpZipLib.dll
(一定要注意引用文件属性中的版本是否和自己使用的一样,不一样是会报错的)
下面是NPOI的使用方法,更多请参考:
http://www.cnblogs.com/csqb-511612371/p/4878059.html

//新建Excel工作簿
IWorkbook workbook = new XSSFWorkbook();
//按指定名称创建sheet
ISheet worksheet = workbook.CreateSheet(SheetName);
//创建第一行
IRow rowHead = worksheet.CreateRow(0);
//写入数据,在此行的第k列写入
rowHead.CreateCell(k).SetCellValue(“string”)//合成单元格,CellRangeAddress(开始行,结束行,开始列,结束列)
//这个函数起始是0,而excel中起始是1,所以下面是从第(a+1)到第(b+1)行,第(c+1)列到第(d+1)列的合并。
CellRangeAddress region = new CellRangeAddress(a, b, c, d);
worksheet.AddMergedRegion(region);
//格式设置
ICellStyle BorderStyle = workbook.CreateCellStyle();
IFont font = workbook.CreateFont();
font.FontHeightInPoints = 10.5;//设置字体高度
font.Boldweight = (Int16)FontBoldWeight.Bold;//原始字体
font.FontName = "宋体";//字体
font.IsBold = true;//是否加粗
BorderStyle.SetFont(font);
BorderStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;//底边画细线
BorderStyle.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;//上边画细线
BorderStyle.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;//左边画细线
BorderStyle.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;//右边画细线
BorderStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.CenterSelection;//居中
rowHead.GetCell(k).CellStyle = BorderStyle;//应用至相应单元格,rowhead行k列
//设置列宽,key:某列 value:某列所对应单元格大小
Dictionary<int, int> colWidth = new Dictionary<int, int>();
colWidth.Add(0, 5);
//遍历Dictionary的key
Dictionary<int, int>.KeyCollection keyCol = colWidth.Keys; 
foreach (int key in keyCol)
{ 
   worksheet.SetColumnWidth(key, colWidth[key] * 256);
}

在导出的过程中,又接触到了拆分和合并单元格功能,NPOI中也有,但是拆分的思路也就是将一个单元格中的内容根据关键字拆分成几段,再增添相应的行或列就行了,再将增添出来的行列中共同的给它合并起来就行,合并有专门的方法。
最后再给你的单元格设置一下框线什么的,导入完成后,一起保存即可

3.保存

//FileStream后面的lstExcelInfoData其实就是excelInfoDatas,这样达到自己选择保存路径。
FileStream file = new FileStream(lstExcelInfoData[i].ExcelFileName,FileMode.Create);
workbook.Write(file);
file.Close;

总结

对于导出至Excel,关键的是我们需要构建一个合适的DataTable,再将其传给我们的传出Excel函数即可,在这个函数中我们需要掌握NPOI的使用,这样传出Excel就变得简单很多了。对此我们需要熟练掌握DataTable和List还有NPOI的使用。

本文地址:https://blog.csdn.net/weixin_43911700/article/details/109901689