使用NPOI的优势:
1、你不需要在服务器上安装微软的Office,可以避免版权问题。
2、使用起来比Office PIA的API更加方便,更人性化。
3、你不用去花大力气维护NPOI,NPOI Team会不断更新、改善NPOI,绝对省成本。
NPOI之所以强大,并不是因为它支持导出Excel,而是因为它支持导入Excel,并能“理解”OLE2文档结构,这也是其他一些Excel读写库比较弱的方面。通常,读入并理解结构远比导出来得复杂,因为导入你必须假设一切情况都是可能的,而生成你只要保证满足你自己需求就可以了,如果把导入需求和生成需求比做两个集合,那么生成需求通常都是导入需求的子集,这一规律不仅体现在Excel读写库中,也体现在pdf读写库中,目前市面上大部分的pdf库仅支持生成,不支持导入。
操作步奏:
1.将NPOI.dll和Ionic.Zip.dll放到项目中
2.添加引用
NPOI.dll和Ionic.Zip.dll
3.引用命名空间
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
4.编写代码操作Excel
4.编写代码操作Excel
/// <summary>
/// 使用NPOI将dataGridView里的数据导出到Excel表中
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnExcel_Click(object sender, EventArgs e)
{
//打开一个对话框,选择或输入保存excel文件的地址
SaveFileDialog sdfExport = new SaveFileDialog();
sdfExport.Filter = "Excel文件|*.xls";
if (sdfExport.ShowDialog()!=DialogResult.OK)
{
return;
}
//获取excel文件名
string fileName = sdfExport.FileName;
//创建一个workbook
HSSFWorkbook workbook = new HSSFWorkbook();
//设置工作表名
ISheet sheet = workbook.CreateSheet("学生信息");
//创建表头行
IRow rowHeader = sheet.CreateRow(0);
//给每个单元格设值
rowHeader.CreateCell(0, CellType.STRING).SetCellValue("编号");
rowHeader.CreateCell(1, CellType.STRING).SetCellValue("密码");
rowHeader.CreateCell(2, CellType.STRING).SetCellValue("姓名");
rowHeader.CreateCell(3, CellType.STRING).SetCellValue("地址");
rowHeader.CreateCell(4, CellType.STRING).SetCellValue("出生日期");
//循环dataGridView取出每一条数据(如果是集合或数组,操作一样)
for (int i = 0; i < this.dataGridView1.Rows.Count; i++)
{
//用Student接收每个对象
Student stu = this.dataGridView1.Rows[i].DataBoundItem as Student;
//循环列
for (int j = 0; j < this.dataGridView1.ColumnCount; j++)
{
//开始创建内容行并放入数据
IRow row = sheet.CreateRow(i + 1);
row.CreateCell(0, CellType.STRING).SetCellValue(stu.StudentNo);
row.CreateCell(1, CellType.STRING).SetCellValue(stu.LoginPwd);
row.CreateCell(2, CellType.STRING).SetCellValue(stu.StudentName);
row.CreateCell(3, CellType.STRING).SetCellValue(stu.Address);
//创建一个表格样式
ICellStyle styledate = workbook.CreateCellStyle();
//创建一个表格格式
IDataFormat format = workbook.CreateDataFormat();
//格式具体那些请看单元格右键中的格式,有说明(此处用于存日期类型)
styledate.DataFormat = format.GetFormat("yyyy\"年\"m\"月\"d\"日\"");
//创建一个存放日期的单元格
ICell cellIndate = row.CreateCell(4, CellType.NUMERIC);//日期
cellIndate.CellStyle = styledate;//指定此单元格样式
cellIndate.SetCellValue(stu.BornDate);//将日期赋给此单元格
}
}
//保存数据
using (Stream stream =File.OpenWrite(fileName))
{
workbook.Write(stream);
}
}
/// <summary>
/// 使用NPOI导入Excel
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnImport_Click(object sender, EventArgs e)
{
//打开一个对话框,选择要打开的excel文件
OpenFileDialog file = new OpenFileDialog();
file.Filter = "Excel文件|*.xls";
if (file.ShowDialog() != DialogResult.OK)
{
return;
}
//获取excel文件名
string fileName = file.FileName;
//读取Excel文件中的数据
using (Stream stream = File.OpenRead(fileName))
{
//创建一个workbook
HSSFWorkbook workbook = new HSSFWorkbook(stream);
//取出Excel表中的值
string value = workbook.GetSheetAt(0).GetRow(0).GetCell(1).StringCellValue;
MessageBox.Show(value);
}
}