关于NPOI操作(一) 判空读写数据
掐指一算,有将近半年的时间没更新,这期间,发生了诸多来自生活,工作之间的琐事,逝者已去,生者如斯,真希望能一如既往的活出那个少年样子,无畏,逐浪,随心,闲言少叙,直奔主题。
关于判断 word,excel 文档是否为空的业务逻辑,对于Office而言,新建的空文件大小均为0kb,所以用IO流直接读取后判断长度即可,但是对于WPS的文件,即使是新建的空文件,大小也都是10K以上不等,目前能想到的思路还是通过一些第三方的轮子来操作,像功能强大的Apose 组件收费,Microsoft.Office library 太依赖于本地office的环境,还有版本的问题,最后兜兜转转绕了一圈,还是选择NPOI ,只需要选择好下载版本即可。
下载npoi Nuget包,针对Excel,有非常多的核心功能可供调用,如下操作,可以支持2003、2007
public static bool ReadExcel(string path) { try { var strExtension = Path.GetExtension(path).ToLower(); using (FileStream fs = File.OpenRead(path)) { //WorkbookFactory 自动识别2003(HSSFWorkbook ),或者更高版本(WSSFWorkbook ), IWorkbook workbook = WorkbookFactory.Create(fs); //遍历工作表Sheet for (int i = 0; i < workbook.NumberOfSheets; i++) { //当前工作表 var currSheet = workbook.GetSheetAt(i); //遍历工作表行数 for (int j = 0; j <= currSheet.LastRowNum; j++) { //当前行所在的列 var count = currSheet.GetRow(j) == null ? 0 : currSheet.GetRow(j).Count(); return count < 1; } } return false; } } catch { return false; } }
对于wps 的word 而言,XWPFDocument 只支持2007及以上的版本,但是对于2003的版本,一直都是报错的,进一步研究发现,NPOI 包中无 HWPFDocument 对象,github上的源码中是有的,但在发包的时候并没有,(PS:源码中的文件,作者也说明了一些自己公司的一些不平事,被离职,这里深感悲愤),所以可以把源码中的 HWPFDocument 对象的相关类拷贝出来,放在项目中运行即可,后来在Nuget程序包发现了 有人专门针对 word 2003版本的NPOI 打过一个包,所以直接安装即可 NPOI.HWPF .
public static bool ReadWord(string path) { try { var strExtension = Path.GetExtension(path).ToLower(); using (FileStream fs = File.OpenRead(path)) { //判断是否为2007格式 if (strExtension.Contains("docx")) { XWPFDocument doc = new XWPFDocument(fs); var grap = doc.Paragraphs[0].IRuns.Count(); return grap < 1; } else { HWPFDocument doc = new HWPFDocument(fs); return doc.CharacterLength < 1; } } } catch (Exception ex) { return false; } }
如此,便可解决NPOI 针对日常文件判断是否为空的问题。
附加: npoi 讲excel 转 html
public static void ExcelToHtml(string path, string htmlpath) { try { var strExtension = Path.GetExtension(path).ToLower(); using (FileStream fs = File.OpenRead(path)) { IWorkbook workbook = WorkbookFactory.Create(fs); ExcelToHtmlConverter excelToHtmlConverter = new ExcelToHtmlConverter { // 设置输出参数 OutputColumnHeaders = false, OutputHiddenColumns = false, OutputHiddenRows = false, OutputLeadingSpacesAsNonBreaking = false, OutputRowNumbers = false, UseDivsToSpan = false }; // 处理的Excel文件 excelToHtmlConverter.ProcessWorkbook(workbook); //添加表格样式 excelToHtmlConverter.Document.InnerXml = excelToHtmlConverter.Document.InnerXml.Insert( excelToHtmlConverter.Document.InnerXml.IndexOf("<head>", 0) + 6, @"<style>table, td, th{border:0.5px solid green;width:fit-content}th{background-color:green;color:white;}</style>" ); //输出的html文件 需创建对应的文件目录 这里是根目录下的doc文件夹 excelToHtmlConverter.Document.Save(htmlpath); } } catch (Exception ex) { throw; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构