一、npoi简介
NPOI,顾名思义,就是POI的.NET版本。那POI又是什么呢?POI是一套用Java写成的库,能够帮助开发者在没有安装微软Office的情况下读写Office 97-2003的文件,支持的文件格式包括xls, doc, ppt等。
二、npoi的引用(NuGet程序包)
在解决方案下—》》引用上右键 —》》管理NuGet程序包
选择浏览 —》》输入npoi—》》选着最新版点击一下 —》》右边安装即可
三、npoi基础
一、属性和方法
Excel分为两种格式.xsl和.xslx,分别是97-2003版的excel和2007版及以后的。由于保存格式的不同,所以引用的不同动态链接库。
NPOI.HSSF.UserModel库是用于.xsl(97-2003版的Excel)
NPOI.XSSF.UserModel库是用于.xsl(2007版的Excel)
项目 | 注释 |
---|---|
IWorkbook workbook = new XSSFWorkbook(); | //新建工作簿(Excel文件) 2007版.xslx、 |
IWorkbook workbook = new HSSFWorkbook(); | //新建工作簿(Excel文件).xsl 2003版 |
//创建一个表Sheet =在工作簿上创建第一个表 表名为test
ISheet sheet = workbook.CreateSheet("test");
//在表中创建第一行 |
IRow row = sheet.CreateRow(0);
for (int i = 0; i < 7; i++)
{
//Cell表示列
//在第一行中创建单元格 也就是第一行第i列
ICell cell = row.CreateCell(i);
//在excel里,在某个位置有没有单元格,和单元格里有没有值,这两个是分开保存的。
//单元格是一个无形的容器,必须首先有容器,才能往里头存放值。
//必须先创建单元格在添加数据
//给单元赋值
cell.SetCellValue(i);
}
// 获取第一行(第一行一般为标题行)
IRow headerRow = sheet.GetRow(0);
//获取第一行的有值的总列数
int cellCount= headerRow.LastCellNum;
//总共行数 (整个表格有多少行)
int rowCount = sheet.LastRowNum;
//设置保存路径
string ExcelPath = "F:\\excel.xlsx";
//导出方法一
//导出 (打开一个xls文件,如果没有则自行创建,如果存在myxls.xls文件则在创建时不要打开该文件)
//using (FileStream fs = File.OpenWrite(ExcelPath))
//{
// workbook.Write(fs);//向打开的这个xls文件中写入并保存。
//}
//导出方法二
//转为字节数组
//创建内存流
MemoryStream stream = new MemoryStream();
//把工作簿写入内存流
workbook.Write(stream);
var buf = stream.ToArray();
//保存为Excel文件
using (FileStream fs = new FileStream(ExcelPath, FileMode.Create, FileAccess.Write))
{
fs.Write(buf, 0, buf.Length);
fs.Flush();
}
三、判断单元格里的值
属性 | 注释和取值方法 |
---|---|
HSSFCell.CELL_TYPE_STRING: | // 字符串 value = cell.getStringCellValue(); |
HSSFCell.CELL_TYPE_BOOLEAN: | // Booleanvalue = cell.getBooleanCellValue() + “”; |
HSSFCell.CELL_TYPE_FORMULA: | // 公式value = cell.getCellFormula() + “”; |
HSSFCell.CELL_TYPE_BLANK: | // 空值value = ""或者string.Empty; |
HSSFCell.CELL_TYPE_ERROR: | // 故障 value = “非法字符”; value = “未知类型”; |
HSSFCell.CELL_TYPE_NUMERIC: | // 数字 |
HSSFCell.CELL_TYPE_NUMERIC: // 数字
//如果为时间格式的内容
if (HSSFDateUtil.isCellDateFormatted(cell)) {
//注:format格式 yyyy-MM-dd hh:mm:ss 中小时为12小时制,若要24小时制,则把小h变为H即可,yyyy-MM-dd HH:mm:ss
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
//获取值
value=sdf.format(HSSFDateUtil.getJavaDate(cell.getNumericCellValue())).toString();
}
else { value = new DecimalFormat("0").format(cell.getNumericCellValue()); }
/// <summary>
///
/// </summary>
/// <param name="cell">单元格</param>
/// <returns></returns>
private static string GetCellValue(ICell cell)
{
if (cell == null)
{
return string.Empty;//设置空值即"";
}
switch (cell.CellType)
{
case CellType.Blank:
return string.Empty;
case CellType.Boolean:
return cell.BooleanCellValue.ToString();
case CellType.Error:
return cell.ErrorCellValue.ToString();
case CellType.Numeric:
case CellType.Unknown:
default:
return cell.ToString();
case CellType.String:
return cell.StringCellValue;
case CellType.Formula:
try
{
HSSFFormulaEvaluator e = new HSSFFormulaEvaluator(cell.Sheet.Workbook);
e.EvaluateInCell(cell);
return cell.ToString();
}
catch
{
return cell.NumericCellValue.ToString();
}
}
}
三、设置样式
//创建单元格样式
ICellStyle cellStyle = workbook.CreateCellStyle();
//设置单元格上下左右边框线
cellStyle.BorderTop = NPOI.SS.UserModel.BorderStyle.DashDot;
cellStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.DashDot;
cellStyle.BorderLeft = NPOI.SS.UserModel.BorderStyle.DashDot;
cellStyle.BorderRight = NPOI.SS.UserModel.BorderStyle.DashDot;
//文字水平和垂直对齐方式
cellStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Right;
//垂直对齐方式
cellStyle.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;
//是否换行
//cellStyle.WrapText = true;
//缩小字体填充
cellStyle.ShrinkToFit = true;
//创建第二行第1列单元格
ICell Cell = sheet.CreateRow(1).CreateCell(0);
//给单元格赋予样式
Cell.CellStyle = cellStyle;
//给单元格设置值
Cell.SetCellValue(“样式效果”);
//没有值是看不出来样式效果滴
四、导入Excel
using System;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System.Data;
using System.IO;
namespace ExcelForm.Services
{
/// <summary>
/// Excel类
/// </summary>
static public class ImportExcel
{
/// <summary>
/// 传入Excel返回成DataTable类型
/// </summary>
/// <param name="filePath">文件路径</param>
/// <returns></returns>
public static DataTable GetExcelDataTable(string filePath)//DataTable
{
IWorkbook Workbook;
DataTable table = new DataTable();
try
{
using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
//XSSFWorkbook 适用XLSX格式,HSSFWorkbook 适用XLS格式
string fileExt = Path.GetExtension(filePath).ToLower();
if (fileExt == ".xls")
{
Workbook = new HSSFWorkbook(fileStream);
}
else if (fileExt == ".xlsx")
{
Workbook = new XSSFWorkbook(fileStream);
}
else
{
Workbook = null;
}
}
}
catch (Exception ex)
{
throw ex;
}
//定位在第一个sheet
ISheet sheet = Workbook.GetSheetAt(0);
//第一行为标题行
IRow headerRow = sheet.GetRow(0);
int cellCount = headerRow.LastCellNum;//首行列数
int rowCount = sheet.LastRowNum;//总共列数
//分几次执行
//int TimesCount = (rowCount / 500)+1;
//int Xtimes = 1;
//循环添加标题列
for (int i = headerRow.FirstCellNum; i < cellCount; i++)
{
DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue);
table.Columns.Add(column);
}
//数据
for (int i = (sheet.FirstRowNum+1 ); i <= rowCount; i++)/
{
IRow row = sheet.GetRow(i);
DataRow dataRow = table.NewRow();
if (row != null)
{
for (int j = row.FirstCellNum; j < cellCount; j++)
{
if (row.GetCell(j) != null)
{
dataRow[j] = GetCellValue(row.GetCell(j));
}
}
}
table.Rows.Add(dataRow);
}
return table;
}
private static string GetCellValue(ICell cell)
{
if (cell == null)
{
return string.Empty;
}
switch (cell.CellType)
{
case CellType.Blank:
return string.Empty;
case CellType.Boolean:
return cell.BooleanCellValue.ToString();
case CellType.Error:
return cell.ErrorCellValue.ToString();
case CellType.Numeric:
case CellType.Unknown:
default:
return cell.ToString();
case CellType.String:
return cell.StringCellValue;
case CellType.Formula:
try
{
HSSFFormulaEvaluator e = new HSSFFormulaEvaluator(cell.Sheet.Workbook);
e.EvaluateInCell(cell);
return cell.ToString();
}
catch
{
return cell.NumericCellValue.ToString();
}
}
}
}
}
五、导出Excel
/// <summary>
/// Datable导出成Excel
/// </summary>
/// <param name="dt"></param>
/// <param name="file">导出路径(包括文件名与扩展名)</param>
public static void TableToExcel(DataTable dt, string file)
{
IWorkbook workbook;
string fileExt = Path.GetExtension(file).ToLower();
if (fileExt == ".xlsx") { workbook = new XSSFWorkbook(); } else if (fileExt == ".xls") { workbook = new HSSFWorkbook(); } else { workbook = null; }
if (workbook == null) { return; }
ISheet sheet = string.IsNullOrEmpty(dt.TableName) ? workbook.CreateSheet("Sheet1") : workbook.CreateSheet(dt.TableName);
//表头
IRow row = sheet.CreateRow(0);
for (int i = 0; i < dt.Columns.Count; i++)
{
ICell cell = row.CreateCell(i);
cell.SetCellValue(dt.Columns[i].ColumnName);
}
//数据
for (int i = 0; i < dt.Rows.Count; i++)
{
IRow row1 = sheet.CreateRow(i + 1);
for (int j = 0; j < dt.Columns.Count; j++)
{
ICell cell = row1.CreateCell(j);
cell.SetCellValue(dt.Rows[i][j].ToString());
}
}
//转为字节数组
MemoryStream stream = new MemoryStream();
workbook.Write(stream);
var buf = stream.ToArray();
//保存为Excel文件
using (FileStream fs = new FileStream(file, FileMode.Create, FileAccess.Write))
{
fs.Write(buf, 0, buf.Length);
fs.Flush();
}
}