个人主页 阿松爱睡觉横竖醒不来你可以不屠龙但不能不磨剑目录一、前言二、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);}这篇文章就到这里有什么问题评论区留言或者私信都可以下期见拜拜