NPOI在C#中的使用总结
目录
0.NPOI简单介绍
百度百科说NPOI可以在没有安装Office的情况下对Word或Excel文档进行读写操作,NPOI是一个开源的C#读写Excel、WORD等微软OLE2组件文档的项目。
优势:可以在没有安装Office的电脑上对Word和Excel进行操作,开源免费。
1.NPOI在C#中的安装与调用
新建一个项目,在解决方案管理器中右击,点击管理NuGet程序包(N)
在弹出的窗体浏览界面输入NPOI
选中第一个NPOI,点击安装(因为我已经装好了所以显示是卸载)
安装完成后,添加引用
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.SS.Util;
using NPOI.XSSF.UserModel;
然后就可以使用NPOI了。
2.NPOI查找行数和列数
int lienum = sheet.GetRow(0).LastCellNum;//某一行的列数
int rownum = sheet.LastRowNum;//所选表的行数
string filepath_save = filepath_sa + "\\" + filepath.Substring(filepath.LastIndexOf("\\") + 1);
IWorkbook workbook = null;
FileStream fs = new FileStream(filepath, FileMode.OpenOrCreate, FileAccess.ReadWrite);
if (filepath_save.IndexOf(".xlsx") > 0) // 2007版本
workbook = new XSSFWorkbook(fs);
else if (filepath_save.IndexOf(".xls") > 0) // 2003版本
workbook = new HSSFWorkbook(fs);
ISheet sheet = workbook.GetSheetAt(workbook.ActiveSheetIndex);
int lienum = sheet.GetRow(0).LastCellNum;//某一行的列数
int rownum = sheet.LastRowNum;//所选表的行数
3.NPOI创建单元格
sheet.CreateRow(i)//创建第i行
sheet.GetRow(i).CreateCell(j)//创建第i行的第j个单元格
sheet.ShiftRows(0, sheet.LastRowNum, 2, true, false);
sheet.CreateRow(0);
sheet.CreateRow(1);
IRow row1 = sheet.GetRow(0);
IRow row2 = sheet.GetRow(1);
for (int i = 0; i < lienum; i++) { row1.CreateCell(i); row2.CreateCell(i); }
4.NPOI合并单元格
先确定要合并的区域region,然后再执行AddMergedRegion函数
需要注意的是region的设置,CellRangeAddress(要合并单元格的第一行,要合并单元格的最后一行,要合并单元格的第一列,要合并单元格的最后一列)
NPOI中单元格的行数和列数均是从0开始
CellRangeAddress region1 = new CellRangeAddress(0, 0, 0, row1.LastCellNum - 1);
CellRangeAddress region2 = new CellRangeAddress(1, 1, 0, row2.LastCellNum - 1);
//合并首行
sheet.AddMergedRegion(region1);
//合并第二行注释行
sheet.AddMergedRegion(region2);
5.NPOI执行公式
sheet.GetRow(si).GetCell(j).SetCellFormula(formula_sum);
在单元格的SetCellFormula中设置要执行的公式,注意列的写法是ABCD这种的。
sheet.ForceFormulaRecalculation = true;//保证公式执行,而不是打开Excel表双击后公式才执行
string formula_sum = "SUM(" + sum_lie + 3.ToString() + ":" + sum_lie + sheet.LastRowNum.ToString() + ")";
sheet.GetRow(sheet.LastRowNum).GetCell(0).SetCellValue("合计");
sheet.GetRow(sheet.LastRowNum).GetCell(8).SetCellFormula(formula_sum);
6.NPOI设置单元格格式和列宽
ICellStyle cellstyle_title = workbook.CreateCellStyle();
// cellstyle_title.DataFormat = HSSFDataFormat.GetBuiltinFormat("0.00");
cellstyle_title.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
cellstyle_title.VerticalAlignment = VerticalAlignment.Center;
// cellStyle.BorderBottom =;
IFont cellfont_title = workbook.CreateFont();
cellfont_title.FontName = "等线";
cellfont_title.FontHeightInPoints = 20;//设置字号
cellfont_title.IsBold = true;
cellstyle_title.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;//上
cellstyle_title.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;//下
cellstyle_title.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;//左
cellstyle_title.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;//右
cellstyle_title.SetFont(cellfont_title);
sheet.GetRow(1).Height = 55 * 20; //设置行高 Height的单位是1/ 20个点。例:设置高度为50个点
7.修改结果保存
fs.Close();
FileStream file = new FileStream(filepath_save, FileMode.Create);
workbook.Write(file);
file.Close();
8.NPOI使用过程中遇到的一些问题与解决办法
(1)单元格内容换行后,即使行高变大,还是不能完全显示,不便于成果的打印
ICellStyle notesStyle = workbook.CreateCellStyle();
notesStyle.WrapText = true;//设置换行这个要先设置
StringBuilder noteString = new StringBuilder("填写说明:\n");
noteString.Append("1、第一行的内容;\n");
noteString.Append("2、第二行的内容\n");
noteString.Append("3、第三行的内容\n");
noteString.Append("4、第四行的内容");
notesStyle.WrapText = true;
(2)小数位数的设置
sheet.GetRow(sheet.LastRowNum).GetCell(8).CellStyle.DataFormat = HSSFDataFormat.GetBuiltinFormat("0.00");
(3)自动调整列宽
for (int i=0;i<lienum;i++) { sheet.AutoSizeColumn(i); }
更多推荐
所有评论(0)