写点什么

C#开发之基于 NPOI 的操作 Excel 开发体验

用户头像
DisonTangor
关注
发布于: 2021 年 06 月 16 日
最近遇到一个数据导入的需求,语言是.net framework 4.7 的 C#。但是,这次主要探讨 NPOI 的体验,原则就是向前兼容。所以采用.xls 的支持。网上的资料,我稍微整合了一些。

#1 单元格下拉框

在开发中我们会遇到为单元格设置下拉框。一般可以编写如下:

var cellRanges = new CellRangeAddressList(firstRow, lastRow, firstCol, latsCol);

DVConstraint constraint = DVConstraint.CreateExplicitListConstraint(stringArray);

HSSFDataValidation validate = new HSSFDataValidation(cellRanges, constraint);

validate.ShowProptBox = true;

sheet.AddValidationData(validate);

但是,如果字符串数组存在长度限制,如 NPOI 导出 Excel 时下拉列表值超过 255 的问题(String literals in formulas can't be bigger than 255 characters ASCII)
解决方案

通过额外新建 Excel 的 Sheet 页保存下拉内容,并转换为下拉框数据。


ISheet hidden = workbook.CreateSheet(columnName);IRow row = null;ICell cell = null;for (int i = 0; i < stringArray.Length; i++){    row = hidden.CreateRow(i);    cell = row.CreateCell(0);    cell.SetCellValue(stringArray[i]);}IName namedCell = workbook.CreateName();namedCell.NameName = column.ColumnName;// 注意下面的语法是Excel的公式,建议不要落掉一个`$`,很多文档都要所遗漏。namedCell.RefersToFormula = $"{columnName}!$A$1:$A${stringArray.Length}";DVConstraint constraint =  DVConstraint.CreateFormulaListConstraint(columnName);CellRangeAddressList addressList = new CellRangeAddressList(firstRow, lastRow, firstCol, latsCol);HSSFDataValidation validate = new HSSFDataValidation(addressList, constraint);sheet.AddValidationData(dataValidate);
复制代码

#2 添加批注

代码如下:


HSSFPatriarch patriarch = (HSSFPatriarch)sheet.CreateDrawingPatriarch();// 这个代码参数不要写成固定的,它用来定位你的批注的位置和大小。HSSFComment comment =     (HSSFComment)patriarch.CreateCellComment(new HSSFFClientAnchor(0, 0, 255,255, col1, 0, col1 + 2, 5));comment.Author = "Dison";comment.String = new HSSFRichTextString($"内容");cell.CellComment = comment;
复制代码

#3 读取数据

如何解析公式的结果

代码如下:


if (row.GetCell(i).CellType.Equals(CellType.Formula)){    var data = row.GetCell(i).RichStringCellValue;}
复制代码


如果希望读取公式也可以如下:


var data = row.GetCell(i).ToString();


但是需要注意结果没有等号“=”, 这里我是演示,所以写了局部变量。

日期格式 MM-dd-yy 转 yyyy-MM-dd

由于 Excel 的数字和日期都是 Numeric 格式,;处理如下:


if (row.GetCell(i).CellType.Equals(CellType.Numeric)){    ICell cell = row.GetCell(i);    short format = cell.CellStyle.DataFormat;    if (format != 0)    {        var data = cell.DateCellValue.ToString("yyyy-MM-dd");    }    else     {        var data = cell.NumericCellValue;    }}
复制代码

结语

NPOI 还是一个相对成熟的 Excel 操作库。网上的资料确实写的比较潦草。但是作为程序员,必须学会耐心,尤其是 debug。

参考文档

发布于: 2021 年 06 月 16 日阅读数: 8
用户头像

DisonTangor

关注

怀揣一个武侠梦的男孩 2020.07.29 加入

还未添加个人简介

评论

发布
暂无评论
C#开发之基于NPOI的操作Excel开发体验