NPOI即意为.NET平台的POI,是操作Excel的一个开源工具,被广泛的使用.
一.创建Excel文件
由于03版和07及以后版的Excel的格式不同,分别为xls,xlsx
所以他们的创建并兼容,
在NPOI中的表现为创建他们的对象不同
03版的为
HSSFWorkbook
07及以后为
XSSFWorkbook
创建时必须正确的写Excel的格式,写混的话用Excel打开的话会报文件损坏
同時创建的Excel文件又必须带有至少一个Sheet
1.创建xls
class Program
{
public static void main()
{
//创建一个excel文件(工作簿)
HSSFWorkbook workbook = new HSSFWorkbook();
//在其中创建一张表
ISheet sheet = work.CreateSheet("sheetOne");
//开发一个文件流,准备写入数据
FileStream stream = new FileStream("Test.xls",FileMode.Create);
//写入Excel信息
workbook.Write(stream);
//关闭流
stream.Close();
}
}
2.创建xlsx
class Program
{
public static void main()
{
//创建一个excel文件(工作簿)
XSSFWorkbook workbook = new XSSFWorkbook();
//在其中创建一张表
ISheet sheet = work.CreateSheet("sheetOne");
//开发一个文件流,准备写入数据
FileStream stream = new FileStream("Test.xlsx",FileMode.Create);
//写入Excel信息
workbook.Write(stream);
//关闭流
stream.Close();
}
}
3.添加Excel的文件描述信息
这个相关的描述信息在Excel文件右键属性中才可以看得到,如果不需要也大可忽略
在Workbook类的属性中可以设置
DocumentSummaryInformation和
SummaryInformation对象的信息,
在创建后你就可以在
xls/xlsx文件的右键属性中查看到
(XSSFWorkbook类则不可以设置描述信息,因为该类型中没有上述两个成员变量)
static void Main(string[] args)
{
HSSFWorkbook workbook = new HSSFWorkbook();
//設置文件右鍵屬性信息
DocumentSummaryInformation document = PropertySetFactory.CreateDocumentSummaryInformation();
SummaryInformation info = PropertySetFactory.CreateSummaryInformation();
document.ApplicationVersion = 999; document.ByteCount = 6666; document.Category = "文件描述信息";
document.Company = "Roman Sultan Mehmed"; document.ContentStatus = "已完成"; document.ContentType = "表格";
info.Title = "這是一個測試的表格"; info.Author = "Sultan"; info.ApplicationName = "NPOI測試程序";
info.OSVersion = 3;
workbook.DocumentSummaryInformation = document;
workbook.SummaryInformation = info;
//--------------------------------------分割线
ISheet sheet = workbook.CreateSheet("sheetOne");
FileStream fstream = new FileStream("C:/Users/F1338705/Desktop/showSummary.xls", FileMode.Create);
workbook.Write(fstream);
fstream.Close();
}
查看属性
二.向单元格写入数据
单元格在NPOI里表现为HSSFCell对象或XSSFCell对象,
其中重载了很多的SetCellValue(不同类型参数),以用于写入不同数据类型的值
public void SetCellValue(DateTime value);
public void SetCellValue(DateTime? value);
public void SetCellValue(IRichTextString str);
public void SetCellValue(string str);
public void SetCellValue(double value);
public void SetCellValue(bool value);
1.确定坐标
Excel以横纵坐标来确定单元格的位置,
NPOI也是同理,也从0开始以横纵坐标确定单元格,
只需要在sheet里指定行和列即可,
sheet.CreateRow(0).CreateCell(0).SetCellValue("12345");
(PS:使用GetCell和GetRow时要注意之前是否创建了对应的行和单元格)
2.区分类型区别
单元格的数据类型有以下几种
namespace NPOI.SS.UserModel
{
public enum CellType
{
Unknown = -1,
Numeric, 数字
String, 字符串
Formula, 公式
Blank, 空白
Boolean, 布尔
Error
}
}
3.设置表头,写入DataTable
一般导出Excel都是从数据库查出的DataTable中拿数据,当然如果也可以直接讲对象集合写入(使用ORM框架的话),不过DataTable的数据时死的,实现对象集合的写入可能要使用反射。
表头一般就是Excell的第一行,用来做一些标题,分类什么的,
如果要设置合并单元格的话则需要使用sheet对象调用 .AddMergedRegion()
传入CellRangeAddress对象制定要合并区域的坐标位置
这对象只有一个构造函数,
CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol)
//这个参数很好理解--即(firstRow,firstCol)为区域左上角的坐标,(lastRow,lastCol)为区域的右下角坐标
例:
public class Program
{
public static void Main(string[] args)
{
SqlConnection sqlConnection = new SqlConnection("server=.;Database=EFCoreTest;uid=XXXX;pwd=XXXX");
sqlConnection.Open();
SqlCommand cmd = sqlConnection.CreateCommand();
cmd.CommandText = "select * from Persons";
SqlDataAdapter sqlDataAdapter = new SqlDataAdapter();
sqlDataAdapter.SelectCommand = cmd;
DataTable dataTable = new DataTable();
sqlDataAdapter.Fill(dataTable);
HSSFWorkbook wb = new HSSFWorkbook();
ISheet sheet = wb.CreateSheet("sheetOne");
IRow title = sheet.CreateRow(0);
title.CreateCell(0).SetCellValue("ID属性");
title.CreateCell(1).SetCellValue("Name");
title.CreateCell(2).SetCellValue("Age");
title.CreateCell(3).SetCellValue("Address");
for(int i = 0; i < dataTable.Rows.Count; i++)
{
IRow temp = sheet.CreateRow(i + 1);
for(int j = 0;j<dataTable.Rows[i].ItemArray.Length; j++)
{
temp.CreateCell(j).SetCellValue(dataTable.Rows[i][j].ToString());
}
}
FileStream stream = new FileStream("C:/Users/ASUS/Desktop/Test.xls",FileMode.Create);
wb.Write(stream);
stream.Close();
wb.Close();
}
}