一、Excel理论知识
最新版NPOI2.4.1链接:https://pan.baidu.com/s/1iTgJi2hGsRQHyw2S_4dIUw 提取码:adnq
整个Excel表格叫做工作簿:WorkBook
工作簿由以下几部分组成
a.页(Sheet);
b.行(Row);
c.单元格(Cell);
二、处理Excel的技术
OLE Automation:程序启动一个Excel进程,然后和Excel进程进行通讯来运行Excel的操作。
优点:强大,Excel能实现的功能,都可以实现
缺点:必须装Excel
把Excel当成数据库,使用Microsoft.Jet.OleDb访问Excel,只适合二维结构,功能少,不用装Excel
OpenXML,微软提供的读写Excel的技术,只能处理xlsx格式文件
NPOI、MyXls,能够分析Excel文件的格式,能够进行常用Excel操作,不依赖于Excel,节省资源,没有安全性和性能的问题。只能处理xls格式文件、不能处理xlsx这样的新版本Excel文件格式。处理xlsx用OpenXML
描述工作簿的类:IWorkbook(接口)、HSSFWorkbook(具体实现类)
描述工作表的类:ISheet(接口)、HSSFSheet(具体实现类)
三、NPOI导出
方式一(默认导出位置)
private void button1_Click(object sender, EventArgs e)
{
List<Person> list = new List<Person>() {
new Person(){Name="张三",Age="15",Email="123@qq.com" },
new Person(){Name="李四",Age="16",Email="456@qq.com" },
new Person(){Name="王五",Age="17",Email="789@qq.com" }
};
// 引用命名空间
// using NPOI.HSSF.UserModel;
// using NPOI.SS.UserModel;
// using System.IO;
//将List集合中的内容导出到Excel中
//1、创建工作簿对象
IWorkbook wkBook = new HSSFWorkbook();
//2、在该工作簿中创建工作表对象
ISheet sheet = wkBook.CreateSheet("人员信息"); //Excel工作表的名称
//2.1向工作表中插入行与单元格
for (int i = 0; i < list.Count; i++)
{
//在Sheet中插入创建一行
IRow row = sheet.CreateRow(i);
//在该行中创建单元格
//方式一
//ICell cell = row.CreateCell(0);
//cell.SetCellValue(list[i].Name);
//方式二
row.CreateCell(0).SetCellValue(list[i].Name); //给单元格设置值:第一个参数(第几个单元格);第二个参数(给当前单元格赋值)
row.CreateCell(1).SetCellValue(list[i].Age);
row.CreateCell(2).SetCellValue(list[i].Email);
}
//3、写入,把内存中的workBook对象写入到磁盘上
FileStream fsWrite = File.OpenWrite("Person.xls"); //导出时Excel的文件名
wkBook.Write(fsWrite);
MessageBox.Show("写入成功!", "提示");
fsWrite.Close(); //关闭文件流
wkBook.Close(); //关闭工作簿
fsWrite.Dispose(); //释放文件流
}
Person类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _01NPOI的写入
{
public class Person
{
public string Name { get; set; }
public string Age { get; set; }
public string Email { get; set; }
}
}
方式二(更友好的一种方式,用户可以指定导出位置)推荐
private void button3_Click(object sender, EventArgs e)
{
List<Person> list = new List<Person>() {
new Person(){Name="张三",Age="15",Email="123@qq.com" },
new Person(){Name="李四",Age="16",Email="456@qq.com" },
new Person(){Name="王五",Age="17",Email="789@qq.com" }
};
//创建文件
string fileName = "人员信息表";
string saveFilePath = ""; //导出时文件的路径
SaveFileDialog saveDialog = new SaveFileDialog();
saveDialog.DefaultExt = "xls"; //默认文件扩展名
saveDialog.Filter = "Excel文件|*.xls"; //文件名筛选字符串
saveDialog.FileName = fileName; //导出文件名称
saveDialog.ShowDialog(); //显示窗口
saveFilePath = saveDialog.FileName; //文件路径
// 引用命名空间
// using NPOI.HSSF.UserModel;
// using NPOI.SS.UserModel;
// using System.IO;
//将List集合中的内容导出到Excel中
//1、创建工作簿对象
IWorkbook wkBook = new HSSFWorkbook();
//2、在该工作簿中创建工作表对象
ISheet sheet = wkBook.CreateSheet("人员信息"); //Excel工作表的名称
//2.1向工作表中插入行与单元格
for (int i = 0; i < list.Count; i++)
{
//在Sheet中插入创建一行
IRow row = sheet.CreateRow(i);
//在该行中创建单元格
//方式一
//ICell cell = row.CreateCell(0);
//cell.SetCellValue(list[i].Name);
//方式二
row.CreateCell(0).SetCellValue(list[i].Name); //给单元格设置值:第一个参数(第几个单元格);第二个参数(给当前单元格赋值)
row.CreateCell(1).SetCellValue(list[i].Age);
row.CreateCell(2).SetCellValue(list[i].Email);
}
//3、写入,把内存中的workBook对象写入到磁盘上
FileStream fsWrite = new FileStream(saveFilePath,FileMode.Create);
wkBook.Write(fsWrite);
MessageBox.Show("写入成功!", "提示");
fsWrite.Close(); //关闭文件流
wkBook.Close(); //关闭工作簿
fsWrite.Dispose(); //释放文件流
}
Person类:
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _01NPOI的写入
{
public class Person
{
public string Name { get; set; }
public string Age { get; set; }
public string Email { get; set; }
}
}
方式三、导出dataGridView数据
public static void ExportExcel(string fileName, DataGridView dgv)
{
string saveFileName = "";
SaveFileDialog saveDialog = new SaveFileDialog();
saveDialog.DefaultExt = "xls";
saveDialog.Filter = "Excel文件|*.xls";
saveDialog.FileName = fileName;
saveDialog.ShowDialog();
saveFileName = saveDialog.FileName;
HSSFWorkbook workbook = new HSSFWorkbook();
MemoryStream ms = new MemoryStream();
NPOI.SS.UserModel.ISheet sheet = workbook.CreateSheet("Sheet1");
int rowCount = dgv.Rows.Count+1;
int colCount = dgv.Columns.Count;
int r1;
NPOI.SS.UserModel.IRow dataRow1 = sheet.CreateRow(0);
for (int i = 0; i < rowCount; i++)
{
NPOI.SS.UserModel.IRow dataRow = sheet.CreateRow(i);
for (int j = 1; j < colCount; j++)
{
if (i == 0)
{
r1 = i;
}
else
{
r1 = i - 1;
}
if (dgv.Columns[j].Visible && dgv.Rows[r1].Cells[j].Value != null)
{
NPOI.SS.UserModel.ICell cell = dataRow.CreateCell(j-1);
if (i == 0)
{
cell.SetCellValue(dgv.Columns[j].HeaderCell.Value.ToString());
continue;
}
cell.SetCellValue(dgv.Rows[r1].Cells[j].FormattedValue.ToString());
}
else
{
NPOI.SS.UserModel.ICell cell = dataRow.CreateCell(j-1);
cell.SetCellValue("");
}
}
}
workbook.Write(ms);
FileStream file = new FileStream(saveFileName, FileMode.Create);
workbook.Write(file);
file.Close();
workbook = null;
ms.Close();
ms.Dispose();
}
DGV中数据导出Excel
四、NPOI读取Excel内容
private void button2_Click(object sender, EventArgs e)
{
//需要读取的文件:人员表.xls
// 创建文件
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "Excel文件|*.xls";
ofd.ShowDialog();
string filePath = ofd.FileName;
FileStream fsRead=null;
IWorkbook wkBook = null;
if (filePath != "")
{
//1、创建一个工作簿workBook对象
fsRead = new FileStream(filePath, FileMode.Open);
//将人员表.xls中的内容读取到fsRead中
wkBook = new HSSFWorkbook(fsRead);
//2、遍历wkBook中的每个工作表Sheet
for (int i = 0; i < wkBook.NumberOfSheets; i++)
{
//获取每个工作表对象
ISheet sheet = wkBook.GetSheetAt(i);
//获取每个工作表的行
//foreach遍历 sheet.GetEnumerator
for (int r = 0; r < sheet.LastRowNum; r++)
{
//获取工作表中的每一行
IRow currentRow = sheet.GetRow(r);
//遍历当前行中的每个单元格
for (int c = 0; c < currentRow.LastCellNum; c++)
{
try
{
//获取每个单元格
ICell cell = currentRow.GetCell(c);
if (cell == null) //如果单元格为空时,程序会报错,这里判断提示用户,用try catch防止程序蹦
{
MessageBox.Show(string.Format("第{0}行,第{1}列单元格为空!",r,c));
}
CellType cType = cell.CellType; // 获取单元格中的类型
MessageBox.Show(cType.ToString());
//判断当前单元格的数据类型,可以拓展
switch (cType)
{
case CellType.Numeric: //数字
MessageBox.Show("我是数字");
break;
case CellType.String: //字符串
MessageBox.Show("我是字符串");
break;
case CellType.Boolean:
MessageBox.Show("我是布尔值");
break;
}
//获取单元格的值
//日期
DateTime date = cell.DateCellValue;
//数字
double num = cell.NumericCellValue;
//字符串
string str = cell.StringCellValue;
//布尔值
bool bl = cell.BooleanCellValue;
}
catch (Exception EX)
{
}
}
}
}
}
else
{
MessageBox.Show("选择文件失败!","提示");
}
fsRead.Close();
wkBook.Close();
fsRead.Dispose();
}
项目链接:https://pan.baidu.com/s/150J59Z3XP2DroZDy9HYfFA 提取码:nkw1
最新版NPOI2.4.1链接:https://pan.baidu.com/s/1iTgJi2hGsRQHyw2S_4dIUw 提取码:adnq
原文链接:http://www.cnblogs.com/chenyanbin/p/10832614.html