【Unity开发】NPOI库超详细使用教程保姆级
个人主页 阿松爱睡觉横竖醒不来你可以不屠龙但不能不磨剑目录一、前言二、Excel表格创建三、Word文档创建一文本操作二表格操作三添加图片四、保存文件一、前言NPOI库可以把创建生成Excel表格并保存到电脑上也可以创建一个word文档保存到电脑上。那么在Unity中我们就可以根据自己的需求把数据以Excel表格或者Word文档的形式保存到电脑上。二、Excel表格创建Excel表格的样子相信大家都不陌生就是一个一个的格子格子里面存放不同的数据所以我们的数据也要转换成二维数组。数据转换成二维数组之后就可以下一步了直接上干货// 创建 Excel 文件IWorkbookworkbooknewXSSFWorkbook();ISheetsheetworkbook.CreateSheet(Sheet1);IRowrowsheet.CreateRow(0);ICellcellrow.CreateCell(0);cell.SetCellValue(Hello, NPOI!);FileStreamfilenewFileStream(example.xlsx,FileMode.Create);workbook.Write(file);file.Close();表格的创建和操作相对来时比较简单就是一个二维数组的数据按顺序填入即可下面的Word文档比较复杂一点因为涉及到一些文本的格式。三、Word文档创建首先是创建一个新的文档XWPFDocumentdocumentnewXWPFDocument();也可以打开指定文件在指定文件上做修改。比如在原有的文件上面追加一段文字或图片就可以使用这个。XWPFDocumentdocument;using(FileStreamstreamnewFileStream(文件路径.docx,FileMode.Open,FileAccess.Read)){documentnewXWPFDocument(stream);}获取文档的页面设置CT_SectPrsectPrdocument.Document.body.sectPr;CT_PageMarpageMarsectPr.pgMar;// 获取页边距ulongwsectPr.pgSz.w;// 页宽ulonghsectPr.pgSz.h;// 页高ulongleftMarginpageMar.left;// 左边的页边距ulongrightMarginpageMar.right;// 右边的页边距// 有了上面的信息就可以算出内容实际的宽高整个页面宽度减去左右页边距就是内容宽度w-leftMarginrightMargin;一文本操作创建一个段落文本就是一个又一个的段落。段落其实不难理解你在word上按下回车进行换行其实就是创建了一个新的段落。XWPFParagraphparagraphdocument.CreateParagraph();创建一个运行在创建的段落的基础上创建运行。运行其实就是操作只不过用代码用程序来操作就是“运行”。运行操作可以设置相关的样式最常用的就是字体、大小、颜色等样式XWPFParagraphpgdocument.CreateParagraph();// 创建段落XWPFRunrunpg.CreateRun();// 创建运行pg.AlignmentParagraphAlignment.CENTER;// 设置段落居中run.AddBreak(BreakType.PAGE);//分页符样式设置SetText(stringvalue)SetText(stringvalue,intpos)run.SetText(文本);// 设置文本run2.FontFamily微软雅黑;// 设置字体为 微软雅黑run.FontSize20;// 设置字体大小run.IsBoldtrue;// 设置加粗run.SetColor(0000FF);// 设置颜色上面的一些简单的操作生成简单的文档基本就已经够用了。注意到这个运行比较独特任何操作都是基于运行的方法去实现的。XWPFRun在 NPOI 中代表 Word 文档中的一个文本运行Text Run即一段具有相同格式的连续文本。你可以使用XWPFRun的方法来设置文本内容和各种格式属性。以下是一些常用的XWPFRun方法SetText(string text, bool isAppend)作用设置或追加文本内容到这个Run中。参数text: 要设置或追加的字符串。isAppend: 布尔值。如果为true则将新文本追加到Run现有文本的末尾如果为false默认则用新文本替换Run中现有的所有文本。示例:run.SetText(这是一段文本,false);// 设置新文本run.SetText(这是追加的文本,true);// 追加文本SetColor(string color)作用设置Run中文本的颜色。参数color- 颜色值通常是一个 6 位十六进制字符串如FF0000表示红色或者是一些预定义的颜色名称如red,blue。注意NPOI 对颜色名称的支持可能有限十六进制格式更可靠。示例:run.SetColor(FF0000);// 设置文本为红色// 或者使用颜色名称可能需要尝试看是否支持// run.SetColor(red);SetFontFamily(string fontFamily)作用设置Run中文本的字体名称。参数fontFamily- 字体名称例如宋体,Arial,Times New Roman等。示例:run.SetFontFamily(Arial);SetFontSize(int size)作用设置Run中文本的字体大小。参数size- 字体大小通常以磅pt为单位。注意传入的值是字体大小的点数而不是像素。例如12 表示 12 磅。示例:run.SetFontSize(14);// 设置字体大小为 14 磅SetBold(bool bold)作用设置Run中文本是否加粗。参数bold- 布尔值。true表示加粗false表示不加粗。示例:run.SetBold(true);// 设置文本加粗SetItalic(bool italic)作用设置Run中文本是否倾斜斜体。参数italic- 布尔值。true表示斜体false表示不斜体。示例:run.SetItalic(true);// 设置文本为斜体SetUnderline(UnderlinePatterns pattern)作用设置Run中文本的下划线样式。参数pattern- 一个UnderlinePatterns枚举值表示下划线类型。常见的值包括UnderlinePatterns.None: 无下划线默认UnderlinePatterns.Single: 单下划线UnderlinePatterns.Double: 双下划线UnderlinePatterns.Dotted: 点状下划线UnderlinePatterns.Dash: 虚线下划线UnderlinePatterns.Heavy: 粗下划线UnderlinePatterns.Wave: 波浪下划线示例:run.SetUnderline(UnderlinePatterns.Double);// 设置双下划线SetTextPosition(int position)作用设置Run中文本的垂直位置相对于基线。参数position- 一个整数表示文本相对于基线的偏移量单位通常是 twips1/20 点。正值使文本上移负值使文本下移。示例run.SetTextPosition(20);// 文本上移run.SetTextPosition(-15);// 文本下移SetStrikeThrough(bool strike)作用设置Run中文本是否添加删除线中划线。参数strike- 布尔值。true表示添加删除线false表示不添加。示例:run.SetStrikeThrough(true);// 设置文本添加删除线SetColor(string themeColor, ThemeColorElement element, double tint)作用使用主题颜色设置文本颜色并提供更精细的控制。参数themeColor: 主题颜色名称如 “accent1”, “hyperlink”。element:ThemeColorElement枚举指定颜色元素类型。tint: 颜色色调调整0.0-1.0正值使颜色更亮负值使颜色更暗。示例:// 使用主题颜色run.SetColor(accent1,ThemeColorElement.Text1,0.0);这些只是XWPFRun提供的部分常用方法。除此之外NPOI 还提供了许多其他方法来控制文本的更多细节例如设置背景色、缩放比例、字符间距等具体可以查阅 NPOI 的官方文档。二表格操作这个表格不是最开始说的Excel表格而是Word文档中的表格在文档中也可以创建一些表格。这里说的就是在word中创建表格的一些相关的操作。下面是一个简单的开发示例可以看下// 创建一个表格3行5列XWPFTabletabledocument.CreateTable(3,5);table.Width(int)(w*0.6f);//设置表格的宽度页面宽度的60%//设置行高设置全部的行高也可以单独只设置一个行的行高for(inti0;irow;i){table.GetRow(i).Height200;// 行高单位是Twips, 500 Twips 大约等于 2.5cm}//设置列宽-固定宽度table.GetCTTbl().AddNewTblPr().tblLayoutnewCT_TblLayoutType(){typeST_TblLayoutType.fixed};table.SetColumnWidth(0,400);// 设置第一列宽度为400单位是Twips, 400 Twips 大约等于 2cmtable.SetColumnWidth(1,400);// 设置第一列宽度为400table.SetColumnWidth(2,1200);// 设置第一列宽度为1200// 纵向合并单元格第一行第2个单元格和第二行第2个单元格合并table.GetRow(0).GetCell(0).GetCTTc().AddNewTcPr().AddNewVMerge().valST_Merge.restart;table.GetRow(1).GetCell(0).GetCTTc().AddNewTcPr().AddNewVMerge().valST_Merge.continue;// 设置完设置样式垂直居中table.GetRow(0).GetCell(0).SetVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);//垂直居中// 水平合并单元格table.GetRow(0).MergeCells(3,4);// 水平合并单元格// 在单元格中添加段落运行XWPFTableCellcelltable.GetRow(0).GetCell(0);XWPFParagraphparagraphcell.AddParagraph();cell.RemoveParagraph(0);// 移除默认段落XWPFRunrun0paragraph.CreateRun();paragraph.AlignmentParagraphAlignment.CENTER;run0.SetText(序号);run0.IsBoldtrue;// 设置加粗// 也可以直接简单的设置文本但是都是默认的样式详细的样式还是要创建段落运行table.GetRow(j2).GetCell(6).SetText(${female_athlete_count});// 设置表格的背景颜色CT_TblPrtblPrtable.GetCTTbl().GetTblPr()??table.GetCTTbl().AddNewTblPr();CT_TblBgtblBgtblPr.IsSetTblBg()?tblPr.GetTblBg():tblPr.AddNewTblBg();tblBg.srgbClrFF0000;// 设置背景颜色为红色十六进制格式虽然东西比较多但是基本都是重复的往表格里面填数据和设置表格的宽高很容易理解需要重点说明的就是表格的合并下面详细解释一下这段代码是如何实现表格单元格合并的以及ST_Merge枚举的含义。单独拎出来看下合并示例// 第一行第2个单元格和第二行第2个单元格合并table.GetRow(0).GetCell(0).GetCTTc().AddNewTcPr().AddNewVMerge().valST_Merge.restart;table.GetRow(1).GetCell(0).GetCTTc().AddNewTcPr().AddNewVMerge().valST_Merge.continue;table.GetRow(0).GetCell(0).SetVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);//垂直居中table.GetRow(0).GetCell(0).GetCTTc().AddNewTcPr().AddNewVMerge().val ST_Merge.restart;逐个方法解释table.GetRow(0): 获取表格的第一行。.GetCell(0): 获取第一行的第一个单元格。注意这里索引是0表示第一列的单元格而不是第二列。如果目标是第二列应该使用GetCell(1)。.GetCTTc(): 获取单元格的 XML 表示CTTc是 OpenXML 中单元格的 XML 结构。.AddNewTcPr(): 确保TcPr单元格属性元素存在。TcPr包含单元格的各种样式和格式属性。.AddNewVMerge(): 添加一个VMerge元素用于控制单元格的垂直合并。.val ST_Merge.restart: 设置VMerge元素的val属性为ST_Merge.restart。这表示这个单元格是合并区域的起始单元格。table.GetRow(1).GetCell(0).GetCTTc().AddNewTcPr().AddNewVMerge().val ST_Merge.continue;逐个方法解释table.GetRow(1): 获取表格的第二行。.GetCell(0): 获取第二行的第一个单元格。同样这里索引是0表示第一列的单元格而不是第二列。如果目标是第二列应该使用GetCell(1)。.GetCTTc(),.AddNewTcPr(),.AddNewVMerge(): 同上确保VMerge元素存在。.val ST_Merge.continue: 设置VMerge元素的val属性为ST_Merge.continue。这表示这个单元格是合并区域的一部分继续之前的合并。table.GetRow(0).GetCell(0).SetVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);逐个方法解释table.GetRow(0).GetCell(0): 获取第一行的第一个单元格。.SetVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER): 设置单元格的垂直对齐方式为居中。合并的原理在 OpenXMLWord 文档的底层格式中表格单元格的合并是通过VMerge和VMergeRef元素来实现的VMerge元素val restart表示这个单元格是合并区域的起始单元格。从这个单元格开始后续的单元格会被合并。val continue表示这个单元格是合并区域的一部分继续之前的合并。合并过程在起始单元格val restart设置VMerge。在后续需要合并的单元格val continue设置VMerge。Word 渲染时会将这些单元格显示为一个合并的单元格。ST_Merge枚举ST_Merge是 OpenXML Schema 中定义的一个枚举类型用于表示单元格合并的状态。它有两个值restart表示这个单元格是合并区域的起始单元格。后续的单元格如果设置了continue会被合并到这个单元格。continue表示这个单元格是合并区域的一部分继续之前的合并。它本身不包含内容只是表示这个单元格是合并的一部分。三添加图片word文档中还有一个比较常见就是图片下面是将图片添加到文档中的操作示例using(FileStreamfsnewFileStream(imgFile,FileMode.Open,FileAccess.Read)){// 添加图片到文档XWPFParagraphimgParagraphdocument.CreateParagraph();XWPFRunimgRunimgParagraph.CreateRun();imgRun.AddPicture(fs,(int)PictureType.JPEG,imgFile,Units.ToEMU(imgWidth),Units.ToEMU(imgHeight));// 设置图片宽度和高度}using(FileStreaminputFsnewFileStream(site_plan_path,FileMode.Open,FileAccess.Read)){// 读取第一个文档XWPFDocumentsourceDocnewXWPFDocument(inputFs);// 获取所有图片IListXWPFPictureDatapicturessourceDoc.AllPictures;// 将图片按顺序添加到第二个文档foreach(XWPFPictureDatapictureinpictures){// 创建新的段落和运行XWPFParagraphparagraphdocument.CreateParagraph();runparagraph.CreateRun();// 添加图片到第二个文档using(MemoryStreammsnewMemoryStream(picture.Data)){run.AddPicture(ms,(int)PictureType.PNG,picture.FileName,Units.ToEMU(415),Units.ToEMU(203));}}}四、保存文件保存文件是最简单的操作基本上没有什么技术含量。直接看示例就可以// 将修改后的文档保存到新的文件using(FileStreamoutStreamnewFileStream(文件路径.docx,FileMode.Create,FileAccess.Write)){document.Write(outStream);}这篇文章就到这里有什么问题评论区留言或者私信都可以下期见拜拜

相关新闻

Kafka高性能原理:顺序写、零拷贝、批量压缩与分区并行

Kafka高性能原理:顺序写、零拷贝、批量压缩与分区并行

先说明一个现象:很多人第一次接触Kafka,都是从“高性能、高吞吐”这六个字开始的。但真正去翻源码、看文档、甚至自己搭集群压测之后,才会意识到一个问题——Kafka的快,不靠堆硬件,不靠缓存硬扛,也不靠把逻…

2026/10/14 20:18:35 阅读更多 →
C#导出Excel六种方案对比:CSV、OpenXML、NPOI、COM组件与Blob

C#导出Excel六种方案对比:CSV、OpenXML、NPOI、COM组件与Blob

后台管理系统里,导出Excel这个需求应该没人能避开。我最早接触C#导出Excel相关任务时,第一反应就是直接拼文本文件,后来陆续接触过库存报表、对账单、数据接口这几类场景,才把C#导出Excel文件的常见路线都摸了一遍。这篇就把我用过…

2026/10/14 20:17:34 阅读更多 →
解决ENVI无法打开Landsat8/9 C2L2数据的问题:Python脚本实现

解决ENVI无法打开Landsat8/9 C2L2数据的问题:Python脚本实现

解决ENVI无法打开Landsat8/9 C2L2数据的问题:Python脚本实现常见问题问题及参考博客问题现象解决方案手动解决方法Python脚本实现批量处理常见问题 问题及参考博客 在处理从USGS网站下载的Landsat8/9 C2 L2数据时,常常会遇到将MTL.txt 文件直接拉入ENV…

2026/10/14 20:17:34 阅读更多 →

最新新闻

基于Django与机器学习的电商评论情感分析系统设计

基于Django与机器学习的电商评论情感分析系统设计

1. 项目概述与核心价值电商平台每天产生海量用户评论数据,这些非结构化文本中蕴含着消费者对商品、服务的真实评价。传统人工分析方式效率低下且主观性强,而基于Django框架结合机器学习的情感分析系统,能够自动化完成评论数据采集、清洗、建模…

2026/10/14 22:07:27 阅读更多 →
核实通告:北京宝珀Villeret系列机芯保养,最新维修电话地址及服务范围调整说明(2026年10月)

核实通告:北京宝珀Villeret系列机芯保养,最新维修电话地址及服务范围调整说明(2026年10月)

核实通告:北京宝珀Villeret系列机芯保养,最新维修电话地址及服务范围调整说明(2026年10月),这份通告涉及的核对事项集中在机芯保养项目、北京本地网点位置与服务范围三块,逐条对照即可完成确认。北京地区表主可优先查询朝阳区华贸…

2026/10/14 22:07:27 阅读更多 →
智能界面与对话式Agent:从感知到执行的技术架构与实操

智能界面与对话式Agent:从感知到执行的技术架构与实操

1. 从一条标题说起:智能界面到底在说什么 凌晨刷到一条消息,标题写着“GPT-6凌晨上线智能界面!对话式Agent没戏了”。我第一反应不是兴奋,而是警觉。这类标题通常把两件事混在一起讲:一个是模型能力的代际跃迁&#xf…

2026/10/14 22:07:27 阅读更多 →
pyKT知识追踪标准复现指南:从配置到跑通到结果对齐

pyKT知识追踪标准复现指南:从配置到跑通到结果对齐

知识追踪这个方向,我从早期做学生模型建模那会儿就开始跟,一路看着它从简单的贝叶斯推断走到今天深度模型遍地开花。pyKT 这个库算是目前少有的、把知识追踪各种模型统一到一套接口下的工程化尝试,前面几篇我陆续聊过它的数据管线、模型封装和…

2026/10/14 22:07:27 阅读更多 →
微分中值定理与微分方程:辅助函数构造与综合题破解全攻略

微分中值定理与微分方程:辅助函数构造与综合题破解全攻略

微分中值定理和微分方程,在高等数学的目录里隔了老远,可复习到后期你会发现,这两章其实是同一件事的两种问法:一个是从导数信息反推函数在某个点上的性质,一个是从导数关系反推函数本身的表达式。考研数学里&#xff0…

2026/10/14 22:07:27 阅读更多 →
30天倒计时:如何用时间约束为验收环境装上质量门禁

30天倒计时:如何用时间约束为验收环境装上质量门禁

测试员这行干久了,心态再稳的人也会遇到几个逼得你想“动手”的场景。我印象最深的,是某个跨平台客户端项目进入验收阶段后,验收环境挂了三周,脚本跑了几轮,功能点却还有一大半没覆盖到。管理层看到“验收环境在线”就…

2026/10/14 22:06:25 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →