一.获取引用NPOI
VS2017,通过Nuget工具包下载NPOI到指定的项目中,如下
二.添加如下命名空间,其中HSSF是操作*.xls文件,XSSF操作*.xlsx文件.
using NPOI;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using NPOI.HSSF.UserModel;
三.关于NPOI关键类/接口:
工作表:IWorkbook,XSSFWorkbook(*.xlsx);HSSFWorkbook(*.xls)
工作表:ISheet,Sheet
行:IRow,
obj_sh.LastRowNum获取最后一行的index
obj_row.LastCellNum;获取当前行的列数
单元格:ICell
四,创建Excel,创建excel常规操作过程如下:
1.创建workbook对象
IWorkbook wbk = new XSSFWorkbook();
2.创建sheet到workbook中
ISheet mysheet = wbk.CreateSheet("mySheet");
3.在sheet对象中创建row
IRow myRow = mysheet.CreateRow(i);
4.在row中创建cell
ICell cell = myRow.CreateCell(i);
5.给cell赋值
cell.SetCellValue("单元格的值")
6.保存workbook对象的数据到电脑磁盘
using (FileStream fs_write = File.OpenWrite(path))
{
wbk.Write(fs_write);
}
或者如下方式也可以
using(FileStream fs_write = File.Open(path,FileMode.Create))
{
wbk.Write(fs_write);
}
//或如下,不用File.Open(...),直接new一个Filestream对象也可以
using (FileStream fs_write = new FileStream(path, FileMode.Create))
{
wbk.Write(fs_write);
}
//上面两种保存Excel方式,要注意FileMode必须是Create,如果是Open,Excel文件损坏打不开!!!
五.创建Excel文件Demo如下:
private void Form1_Load(object sender, EventArgs e)
{
//声明工作本对象(XSSFWorkbook后缀名.xlsx;HSSFWorkbook后缀名.xls)
IWorkbook wbk = new XSSFWorkbook();
//创建一个sheet
ISheet mysheet = wbk.CreateSheet("mySheet");
for (int i = 0; i < 3; i++)
{
//创建行
IRow myRow = mysheet.CreateRow(i);
//创建单元格,写入值
myRow.CreateCell(0).SetCellValue($"Row{i + 1}Col0");
myRow.CreateCell(1).SetCellValue($"Row{i + 1}Col1");
myRow.CreateCell(2).SetCellValue($"Row{i + 1}Col2");
}
int cellCnt = mysheet.GetRow(0).LastCellNum;
//自动调整列宽
for (int i = 0; i < cellCnt; i++)
{
mysheet.AutoSizeColumn(i);
}
string path = @"D:\dwang\myWBK.xlsx";
//将excel数据赋值给文件流,并excel文件的Write方法参数,保存wbk文件到本地磁盘
//using (FileStream fs = File.OpenWrite(path))
//{
// wbk.Write(fs);
//}
//或如下,不用File.OpenWrite(Path),直接new一个Filestream对象也可以
using (FileStream fs_write = new FileStream(path, FileMode.Create))
{
wbk.Write(fs_write);
}
//上面的保存Excel方式,要注意FileMode必须是Create,如果是Open,Excel文件损坏.
}
六.读取Excel文件:
读取excel文件过程如下:
1.通过指定的excel文件路径,读取到文件流中
2.创建workbook对象,将excel文件流作为workbook的构造函数传给工作本对象
3.读取sheet,row,cell,获取指定的内容,常见操作如下
3.1. 获取工作簿对象
IWorkbook workbook = new XSSFWorkbook(fs); // 2007
// IWorkbook workbook = new HSSFWorkbook(fs); // 2003
3.2. 获取工作表对象(第一个表,序号从0开始)
ISheet sheet = workbook.GetSheetAt(0);
3.3. 获取工作表的行(第一行)
IRow row = sheet.GetRow(0);
3.4. 获取指定行的单元格
ICell cell = row.GetCell(0);
3.5. 获取单元格样式
ICellStyle cellStyle = cell.CellStyle;
3.6. 创建工作簿对象
XSSFWorkbook workBook= new XSSFWorkbook();
3.7. 创建工作表对象
XSSFSheet newSheet = (XSSFSheet)workBook.CreateSheet("new sheet");
3.8. 创建工作表的行
XSSFRow newRow = (XSSFRow)newSheet.CreateRow(0);
3.9. 创建单元格
XSSFCell newCell = (XSSFCell)newRow.CreateCell(0);
3.10. 单元格写值
newCell.SetCellValue(1);
3.11. 设置Sheet名称
workBook.SetSheetName(0, "第一张表");
3.12. 设置单元格内容
newCell.SetCellValue(11);
3.13. 得到工作簿中Sheet数量
workBook.NumberOfSheets
如下代码是读取Exel文件的常规操作:
private void Form1_Load(object sender, EventArgs e)
{
string path = @"D:\dwang\mywbk.xlsx";
if(!File.Exists(path))
{
MessageBox.Show("文件不存在,退出");
return;
}
//读取excel,需要通过filestream读取excel,然后文件流对象作为参数传给workbook构造函数参数
FileStream fs_read = File.OpenRead(path);
//将文件流中的eexcel文件数据读取到workbook对象中
IWorkbook wbk = new XSSFWorkbook(fs_read);
//获取wbksheet数量
int sheetCnt = wbk.NumberOfSheets;
//激活第一个sheet
wbk.SetActiveSheet(0);
//获取sheet对象
ISheet sh = wbk.GetSheetAt(0);
//获取最后一行的行index
int rowCnt = sh.LastRowNum;
List<string> lst = new List<string>();
string cellContents = null;
IRow currRow = null;
for (int i = 0; i <= rowCnt; i++)
{
//当前行赋值
currRow = sh.GetRow(i);
//获取当前行的单元格数量,注意,这个数字是列数,不是最后一个单元格索引
int cellCnt = currRow.LastCellNum;
for (int j = 0; j < cellCnt; j++)
{
//获取当前行的每个单元格内容,并连接给字符串
cellContents += $"{currRow.GetCell(j).ToString()},";
}
lst.Add(cellContents);
cellContents = "";
}
foreach (var item in lst)
{
MessageBox.Show(item);
}
//更新单元格值,并保存
sh.GetRow(0).GetCell(0).SetCellValue("ASDFGH");
sh.AutoSizeColumn(0);
//关闭excel文件的读取流
fs_read.Close();
//wbk内容写入到新建的写入流,再到磁盘文件
//保存到磁盘:workbook ->filestream -> 磁盘文件
using (FileStream fs_write = File.OpenWrite(path))
{
wbk.Write(fs_write);
}
}