c#:使用NPOI操作excel文件
首先NPOI是开源的POI项目的.NET版,可以使用读写Excel,Word,PPT等Office文件。
在使用npoi时,需要声明
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using NPOI.SS.Util;
对象和方法
IWorkbook
该接口用于操作excel工作簿的一个接口,主要有两个实现
HSSFWorkbook : 用于读取excel2007版本以下的xls文件
XSSFWorkbook : 用于读取.xlsx 文件
主要方法:
CreateSheet() : 创建一个 工作表
GetSheetAt() : 根据索引或名称获取工作表对象
ISheet :
excel工作表对象
主要属性:
LastRowNum : 最后一行的索引
FirstRowNum: 第一行的索引
主要方法:
GetRow(int index) : 根据索引获取一行
CreateRow(int index) : 创建一个数据行
IRow :
数据行对象
主要方法
CreateCell(int index) : 指定索引创建一个单元格
GetCell(int index) : 获取单元格
ICell:
单元格对象
主要方法
SetCellValue(string value) : 设置单元格的值
ToString() : 获取该单元格填充的内容
具体实例
简单操作excel文件
public void ExcelOp(string excelPath)
{
IWorkbook workbook=null;
string fileExt = Path.GetExtension(excelPath).ToLower();
if (fileExt == ".xlsx")
{
workbook = new XSSFWorkbook();//代表Xlsx文件
}
else if (fileExt == ".xls")
{
workbook = new HSSFWorkbook();//代表xls文件
}
else {
workbook = null;
}
if(workbook == null)
{
return;
}
ISheet sheet = workbook.CreateSheet("Sheet1");//写入sheet页,至少有一页
int iColSum = vSrcLineList.Count() - 1;//垂直直线列表个数
int iRowSum = hSrcLineList.Count() - 1;//水平直线列表个数
for(int i = 0;i<iRowSum;i++)
{
IRow row = sheet.CreateRow(i);//代表含义
for(int j = 0;j<iColSum;j++)
{
ICell cell = row.CreateCell(j);
cell.SetCellValue("");
}
}
//模板带入完善
for (int i = 0; i < iRowSum; i++)
{
for (int j = 0; j < iColSum; j++)
{
ICell cell = (ICell)sheet.GetRow(i).GetCell(j);
}
}
foreach (KeyValuePair<int, CombinTable> OneCombin in fact_CombinDic)//循环文本字典集
{
if (OneCombin.Value.iStartRow >= iRowSum || OneCombin.Value.iStartCol >= iColSum)
{
continue;//iStartRow代表开始的行号 如果开始的行号大于定义的水平直线数,或者开始列号大于垂直直线数则返回
}
ICell cell = sheet.GetRow(OneCombin.Value.iStartRow).GetCell(OneCombin.Value.iStartCol);//创建单元格,此时行列为OneCombin.Value.iStartRow和OneCombin.Value.iStartCol)
if (textDstDic.ContainsKey(OneCombin.Key))//判断key值是否存在,如果存在则
{
cell.SetCellValue(textDstDic[OneCombin.Key].m_Text.Trim()); //导出的时候,在前面加上一个单引号就行了,这就是文本格式的了。
}
CellRangeAddress region = new CellRangeAddress(OneCombin.Value.iStartRow, OneCombin.Value.iEndRow, OneCombin.Value.iStartCol, OneCombin.Value.iEndCol);
sheet.AddMergedRegion(region);//将新的单元格覆盖已有的单元格
}
//转为字节数组
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();
}
}
选中表格信息导出
public void ExportSelToExcel(bool bX = false)
{
LSTable OneTable = new LSTable();
_iTextKey = 0;
//2019-05-06
foreach (KeyValuePair<ulong, RenderedEntityInfo> OnePair in SelectCADDic)
// //循环keyvalue值 选中的 CAD图像字典 key 为 图形的 ObjectID
{
SetObjToTable(OnePair.Value, OneTable, bX);// 将cad对象进行分类整理
}
OneTable.GetTableLines();
if(!OneTable.DealGetAllRec())//获取最小矩形为为空,则返回
{
return;
}
OneTable.DealText(bX);//将原始列表与矩形列表组合并组合文字
SaveFileDialog pExcelOpenDG = new SaveFileDialog();
pExcelOpenDG.Filter = "Excel(*.xlsx)|*.xlsx|所有文件|*.*";//设置文件类型
pExcelOpenDG.ShowDialog();
string ExcelfilePath = pExcelOpenDG.FileName;//将文件名字赋值给ExcelfilePath
if (bX)//如果为true,则
{
OneTable.ExcelOpPOS(ExcelfilePath);
}
else
{
OneTable.ExcelOp(ExcelfilePath);
}
}
在事件里导出excel表格
private void 选中表格导出ToolStripMenuItem_Click(object sender, EventArgs e)
{
viewControl.ExportSelToExcel();
}