Excel文件读写
不启动 Excel,用 NPOI 直接读写 .xls / .xlsx(1.32.6+)。不需要安装 Office 或 WPS。要控制已经打开的 Excel 窗口,用 Excel对象操作 或 Excel区域操作——两边的工作簿 / 工作表对象互不通用。
当前模块定义
sys:excelreadwrite输入 25 · 输出 20 · 枚举 3
输入参数
- 操作类型
operationEnum必填16 个选项打开Workbook、创建Workbook、保存Workbook
打开Workbookload创建WorkbooknewWorkbook保存Workbooksave获取SheetgetSheet创建SheetcreateSheet获取行getRow查找单元格(根据值)getCellByValue读取单元格getCell写入单元格setCell写入多行数据writeData合并单元格mergeCells冻结窗格freezePane自动筛选autoFilter设置区域单元格样式setStyle批量提取数据readData批量模板替换batchReplace - 工作簿类型
fileTypeEnum可选XSSF(.xlsx 2007版Excel默认XSSFHSSF(.xls 2003版ExcelHSSF - 文件路径
filePathText可选要打开或写入的Excel文件路径
- 提取数据定义
readDataMapText可选每行一条规则:"字段:[工作表序号或名称]单元格地址",详情请参考模块文档。
- 工作簿对象
workbookObject可选需要操作的工作簿对象
- 工作表序号或名称
sheetIndexText可选以0开始计算的序号或名称
- 工作表名称
sheetNameText可选要打开的工作表名称
- 如果工作表不存在则创建一个
createSheetIfNotExistBoolean可选 - 源数据
sourceDataObject可选可以为工作表对象、表格变量或对象列表
- 字段映射
columnMappingText可选复制哪些字段信息到目标工作表。请参考文档了解使用方法。
- 名称数据
namesText可选JSON格式的名称数据定义,详细请参考文档。
- 写入标题行
writeTitleRowBoolean可选是否输出标题行
- 工作表对象
worksheetObject可选需要操作或读写的工作表对象
- 单元格地址
cellAddressText可选类似于"D5"这样的单元格位置名称。或在下方使用行序号和单元格序号指定(两种二选一)。
- 单元格范围
cellRangeText可选类似于"A1:B5"格式,或"开始行号,结束行号,开始列号,结束列号"方式(从0开始的序号)。
- 样式设置
styleDataText可选请参考模块文档。
- 行序号
rowIndexInteger可选以0开始计算的序号
- 列序号
cellIndexInteger可选单元格在所在行里的序号,从0开始
- 单元格类型
cellTypeText可选设置单元格类型
6 个选项自动(根据值的类型判断)、String(文本)、Numeric(数字或日期)
自动(根据值的类型判断)String(文本)StringNumeric(数字或日期)NumericBoolean(布尔)BooleanFormula(公式)FormulaBlank(空白)Blank - 值
cellValueAny可选设置单元格的值
- 数据格式
dataFormatText可选设置单元格的DataFormat
- 链接
cellLinkText可选可以为网址、邮件地址(mailto:who@domain.com)、工作表名称、文件路径
- 替换数据词典
replaceDictDict可选词典格式数据。键为要查找的字段,值为要填充的内容。
- 占位符前后缀
replacePrefixSuffixText可选第一行写前缀,第二行写后缀。"前缀+字段名+后缀"组成要查找和替换的目标,如"{{姓名}}"。
查看默认值
{{ }} - 失败后停止
stopIfFailBoolean可选失败后是否停止动作
输出参数
- 是否成功
isSuccessBoolean操作是否成功
- 工作簿对象
workbookObject用于在后续步骤中继续操作工作簿。
- 工作表名称列表
worksheetNameListList工作簿中的工作表名列表。
- 工作表个数
numberOfSheetsInteger工作簿中的工作表个数。
- 工作表对象
sheetObject返回指定的工作表。加载文件时返回工作簿中的第一个工作表对象
- 首行序号
firstRowInteger工作表首行序号(从0开始)。
- 末行序号
lastRowInteger工作表有内容的最后一行序号(从0开始)。
- 名称数据
namesText工作簿中定义的名称数据,返回json格式
- 首个单元格的列序号
firstCellNumInteger一行的首列序号(从0开始)。获取工作表信息时,
- 末个单元格的列序号
lastCellNumInteger一行的最后一个单元格的序号(从0开始)。
- 最大列序号
maxColumnNumInteger工作表的最大列序号(从0开始)。
- 是否有值
hasValueBoolean单元格是否有值
- 值
cellValueAny单元格的值
- 文本值
cellTextValueText文本格式的单元格内容
- 类型
cellTypeText单元格的类型
- 公式
cellFormulaText单元格的公式值
- 数据词典
dictDataDict从工作簿加载的数据
- 数据格式字符串
cellDataFormatStringText数据格式的字符串表示
- 单元格地址
cellAddressObject查找到的单元格地址
- 单元格地址列表
cellAddressListList查找到的单元格地址的列表(查找多个单元格的情况)
概述
- 工作簿(Workbook):一个 Excel 文件。
- 工作表(Worksheet / Sheet):文件里的一张表。下图这个文件有 Sheet1、Sheet2、Sheet3。
限制与排障
- 改文件前先备份。本模块方便读写数据,不是完整的 Excel 排版工具。
- 列标题两侧不要有空格;尽量用文本格式,减少转换丢精度。
- 工作表参数若是数字,按序号找;否则按名称。数字当名称时写成
:2。 - 覆盖已有文件可能丢掉 NPOI 不支持的特性,重要文档不要直接覆盖。
- 打开时报「已存在具有相同键的条目」,多半有完全空白的 Sheet,见 讨论。
操作类型
打开Workbook
打开一个Excel文件,并返回工作簿(Workbook)对象(用于在后面的步骤中对其内容进行操作)。
Excel文件读写
输入参数
文件路径:要打开的Excel文件路径。支持Excel 2003格式(.xls) 和 Excel2007格式(.xlsx)。
输出参数
工作簿对象:生成的工作簿对象。使用此对象在后续步骤对文档内容进行读写。
工作表个数:文档中的工作表Sheet个数。
工作表名称列表:文档中工作表的名称列表。
工作表对象:返回工作簿中的第一个工作表对象。因为多数情况是对工作簿中的第一个工作表进行读写操作,这里直接返回该工作表对象,可以减少一个获取工作表的步骤。
首行序号:第一个工作表的首行数据序号(以0开始计算)。
末行序号:第一个工作表的末行数据序号(以0开始计算)。
创建工作簿
创建一个新的Excel文档。
Excel文件读写
输入参数
工作簿类型:文档类型。
- 建议使用XSSF类型。此处的类型需要和保存文件时使用的文件扩展名匹配。
- HSSF(Excel 2003版本)格式有一些功能限制(如不支持设置格式。)
输出参数
工作簿对象:创建的Workbook对象。
保存工作簿
将工作簿对象存入Excel文件中。
注意事项:
- 在更新工作簿内容后,需要使用保存工作簿的步骤之后,才会实际写入excel文档中。
- 因为NPOI组件可能无法支持所有的Excel功能,如果覆盖已有文件可能导致部分信息丢失,所以通常仅用此功能写入完全自动生成的Excel文档,重要的Excel文档请提前做好备份。
Excel文件读写
输入参数
文件路径:保存的目标文件路径。
- 如果路径已存在,将会被覆盖。
- 文件名后缀需要与文档类型一致(HSSF 对应
.xls,XSSF 对应.xlsx)。
工作簿对象:要保存的Workbook对象。将此对象的内容存入路径生成Excel文件。
获取Sheet(工作表)
从工作簿中获取一个工作表对象(以便于在后续步骤中读取或写入内容)。
Excel文件读写
输入参数
工作簿对象:要从哪个Workbook对象中读取工作表。
工作表序号或名称:设定更要读取的序号或名称。
- 如果参数值是数字,则按序号查找工作表。如果该序号不存在,则将其当做工作表名称查找工作表。
- 如果参数值不是数字,则按名称查找。
- 如果希望返回某个以数字命名的工作表,可以使用
:数字的格式指定。如:2将会返回名称为“2”的工作表,而不是序号为2的。 - 尽量避免使用纯数字的工作表名称。
输出参数
工作表对象:返回找到的Worksheet对象。
首行序号:Worksheet数据范围的第一行序号(从0开始)。
末行序号:Worksheet数据范围的最后一行序号(从0开始)。
注:如果工作区还没有数据,首行行号和末行行号都会返回0。
创建Sheet(工作表)
在指定的工作簿中创建一个新的工作表。
Excel文件读写
输入参数
工作簿对象:指定要创建工作表的工作簿对象。
工作表名称:要创建的工作表名称。
- 不能含有这些字符:
[ ] * / \ ? :。 - 工作表名称不能重复。
输出参数
工作表对象:创建好的工作表对象。
获取行
返回工作表的某一行的信息。通常用于遍历工作表内所有单元格时使用。
注:如果指定的行不存在,则本步骤会执行失败。
Excel文件读写
输入参数
工作表对象:要读取的工作表。
行序号:要读取信息的行序号(从0开始)。
输出参数
是否成功:如果行不存在,返回失败。(需取消选中“失败后停止”选项,否则动作本身会停止也就不会输出是否成功了。)
首个单元格序号:行内第一个单元格的序号(从0开始)。
末个单元格序号:行内最后一个单元格的序号(从0开始)。
注:Excel在保存数据时,仅仅保存那些可能有数据的单元格而不是所有单元格。因此某些单元格可能是“不存在”的。
查找单元格
查找首个具有特定值的单元格。(1.33.12+版本)
Excel文件读写
输入参数
工作表对象:要读取的工作表。
值:要查找的内容。查找将按照从上到下、从左到右的顺序进行,完全相等的情况下才判断为匹配。
注:对于非文本类型单元格,如 日期、时间、数字等,请先使用“读取单元格”操作获得“文本值”,再通过此文本值查找定位单元格。 参考讨论
输出参数
是否成功:如果行不存在,返回失败。(需取消选中“失败后停止”选项,否则动作本身会停止也就不会输出是否成功了。)
首行序号:单元格所在行号(从0开始)。
首个单元格序号:单元格所在列号(从0开始)。
单元格地址:类似于B2这样格式的单元格地址值(文本类型)。
读取单元格
读取单元格的数据。
Excel文件读写
输入参数
工作表对象:要读取的工作表对象。
单元格地址:以Excel单元格地址的方式指定要读取的单元格。如“A1”(表示工作表左上角单元格)等。指定此值时,忽略“行序号”和“列序号”。
行序号 / 列序号:通过数字序号指定要读取的单元格,从 0 开始。
输出参数
是否有值:所指定的单元格是存在并且非空白。
值:单元格的值,可能为文本、数字、布尔或日期时间类型。
文本值:转换为文本格式后的值。
类型:单元格类型,可能为 Numeric、String、Formula、Blank、Boolean、Error 等值。(Excel中的日期时间是用数字类型存储的)
公式:对于公式类型的单元格,返回其公式内容(不带开始的“=”字符)。
数据格式字符串:单元格的数据格式信息。
写入单元格
向指定单元格写入数据。
Excel文件读写
输入参数
工作表对象:要读取的工作表对象。
单元格地址:以Excel单元格地址的方式指定要写入的单元格。如“A1”(表示工作表左上角单元格)等。指定此值时,忽略“行序号”和“列序号”。
行序号 / 列序号:通过数字序号指定要写入的单元格,从 0 开始。
单元格类型:指定单元格的类型。
值:向单元格写入的值。如果单元格类型为公式时,指定去除“=”开始字符的公式内容。
数据格式:数字和日期时间格式的格式化字符串。
链接:为单元格设置链接。支持如下类型的链接:
-
邮件,格式为
mailto:user@domina.com。 -
网址,以
http://或https://开始。 -
文件路径:以
file:前缀开始的完整路径或相对路径。如:file:D:\Docs\Sunlogin Files\sunlogin_20220405100851.bmp或file:模板文件.xlsx -
其它内容作为文档内链接。
-
如果链接内容为某个Sheet的名称,则自动转换为对该Sheet第一个单元格的引用。例如
Sheet2自动转换为'Sheet2'!A1 -
其他内容直接作为链接值存入,请自行确定引用位置的合法性。
写入多行数据
将多行数据内容写入工作表的指定列中。
Excel文件读写
输入参数
源数据:数据源对象,可以为:
- 另一个工作表对象。要求:工作表的首行应该标题行,有数据的行第一列不应该为空。各标题前后应避免有空格造成无法匹配。
- 表格类型的变量(DataTable对象)。
字段映射:设定应该把哪个字段的数据放入哪一列中。
(1)在目标表存在标题行(目标区域的第一行为标题行),此时的设定方式:
- 字段映射第一行写
= - 如果目标表标题和源数据的各字段标题一致,则不需要做其他设置。
- 对于两边标题不一致的列,每个需要转换的列标题写一行规则,格式为:
目标列标题:源数据列标题
(2)复制所有字段到目标表中。此时设定方式:
- 字段映射第一行写
* - 需要更改字段标题的列,每一个创建一行规则,格式为:
目标列标题:源数据列标题
(3)复制某些字段到指定的列中。此时目标列可以不连续。此时设定方式:
- 字段映射第一行写
# - 每个要复制的列创建一行规则,格式为
列序号或列名:源数据列名,列序号为从0开始的数字,列名为ABCD这样的字符(就像在Excel中显示的那样)。
(4)复制某些指定的列,设定方式:
- 每行指定一个要复制的列。
- 如果列名不需要改变,直接写列名,如果需要改变,则按格式
目标列名:源列名填写。
工作表对象:要写入的工作表。
行序号:从哪一行开始写入数据。
写入标题行:是否在目标位置第一行各列写入标题(否则直接写数据)。如果目标表已经存在标题行(字段映射设置首行为“=”,则忽略此选项)。
合并单元格
Excel文件读写
输入参数
工作表对象:要操作的工作表对象。
单元格范围:指定要合并的单元格范围,支持两种格式:
- Excel范围地址格式,如
A1:F2 - 4个数字,分别指以0开始的“开始行号,结束行号,开始列号,结束列号”,如:
0,0,0,5
冻结窗格
锁定行列禁止滚动。
Excel文件读写
输入参数
工作表对象:需要冻结窗格的工作表对象。
行序号:冻结到哪一行(从0开始)。
列序号:冻结到哪一列(从0开始)。
自动筛选
设定列标题单元格自动筛选。
Excel文件读写
输入参数
工作表对象:要建立筛选的工作表。
单元格范围:指定位筛选单元格的范围。
设置区域单元格样式
设置某个区域中单元格的外观样式,如字体、边框、对齐等。
仅支持对Excel2007格式的工作簿对象设置样式。
Excel文件读写
输入参数
工作表对象:要操作的工作表对象。
单元格范围:需要更新样式的单元格范围。
样式设置:
- 仅设置需要更改的样式;
- 这些代码规则可以组合在一起使用,但不需要全部使用;
- 底层库在更新样式时可能存在一些BUG,请测试验证;
- 尽量先设置样式后更新数据,更新数据时可能会对样式有所影响;
font.Name:仿宋
font.Height:30
font.Italic:true
font.Strikeout:true
font.Color:#FF0000
font.Bold:true
font.underline:2
border.All:Thin,#00FF00
border.Bottom:Double,#0000FF
horz:right
vert:bottom
fillpattern:SolidForeground
background:#F0F0F0
foreground:#FFFAFA
wraptext:true
border.outside:Thick,#FF0000
格式说明(实际填写时避免空格):
-
字体相关
-
font.name:字体名称 -
font.height:字号点数(数字) -
font.italic:是否斜体(true/false) -
font.strikeout:是否删除线(true/false) -
font.color:文字颜色格式为#RRGGBB -
font.underline:下划线可选值:0(无下划线),1(单下划线),2(双下划线),33(每个字符的单下划线),34(每字符双下划线)。 -
边框相关:
-
border.all:边框风格,边框颜色统一设定区域内所有单元格的边框风格设置。边框风格请参考下面内容,边框颜色格式为#RRGGBB。 -
border.top:边框风格,边框颜色单独设定顶部边框的风格和颜色 -
border.right:边框风格,边框颜色单独设定右边框的风格和颜色 -
border.bottom:边框风格,边框颜色单独设定底部边框的风格和颜色 -
border.left:边框风格,边框颜色单独设定左边框的风格和颜色 -
border.outside:区域外观风格,颜色区域外边框风格和颜色(建议放在风格设置的末尾) -
边框风格可选值:
None无Thin细Medium中等Dashed虚线Dotted点线Thick厚Double双线Hair无MediumDashedDashDotMediumDashDotDashDotDot``MediumDashDotDotSlantedDashDot,请参考这里。 -
背景填充
-
fillpattern:NoFill填充风格,可选值请参考这里,默认为不填充(NoFill)。如需使用纯色填充,请使用模式SolidForeground,结合下面的foreground参数设置颜色。 -
background:#F0F0F0填充花纹背景色。 -
foreground:#FFFAFA填充填充花纹前景色。 -
其它
-
horz:水平对齐可选值GeneralLeft``CenterRight``Justify``Fill``CenterSelectionDistributed,请参考这里,可以填写名称也可以填写对应的数字值。 -
vert:垂直对齐可选值NoneTopCenterBottomJustifyDistributed, 请参考这里,可以填写名称也可以填写对应的数字值,请参考这里,可以填写名称也可以填写对应数字值。 -
wraptext:true单元格内的内容是否自动换行。
批量提取数据
将工作簿中指定位置的数据提取到词典的对应键值中。
Excel文件读写
输入参数
工作簿对象:要读取数据的工作簿对象。
提取数据定义:指定哪个位置的数据放入词典的哪个键的值中。
- 每行一条规则,格式为
词典键名:数据位置。 - 数据位置:使用
[工作表序号或名称]单元格位置的形式定义。“工作表序号或名称”如果指定了一个数字,将被优先当做从0开始的工作表序号处理。 - 如果是第一个工作表中的单元格,可以省略工作表部分,直接指定单元格位置,如:
Name:B2。 - 支持单值和表格形式的数据。表格数据时,指定所在区域。如
[Sheet1]A1:D10,该区域的第一行应为标题行。表格数据将使用DataTable类型对象保存在词典的值中, 在使用时需强制转换一下。
批量模板替换
将表格中的模板字段替换为实际的值。

用于根据汇总表及模板表批量生成Excel文件。实际的使用过程大概为:对于汇总表中的每行数据,创建一个模板文件的副本。将该行数据的每一列填充的副本文件的模板字段中。
Excel文件读写
输入参数
工作表对象:要填充数据的工作表对象。
替换数据词典:词典格式的数据,键为模板文件中的字段名,值为要实际填充的内容。
占位符前后缀:在模板文件中,使用类似于 {{字段名}}的形式定义要填充的位置。我们称 {{字段名}}为占位符,其中{{便是占位符的前缀,}}便是占位符的后缀。可以根据需要自定义占位符的前后缀,避免它和文档中的其它内容有冲突。定义式分两行填写,第一行填写前缀,第二行填写后缀。
示例动作
这些动作步骤较多,用卡片打开即可。
通过表达式调用NPOI对象的方法
本模块仅封装了NPOI对象的一部分方法,如果需要更多的控制,可以在表达式中对工作簿和工作表对象的方法进行调用。
如:
设置列宽
**$=****{worksheet}**.**SetColumnWidth**(1, 20*256);
列宽的单位是 1/256 个字符宽度。上面的表达式将从0开始的序号为1的列设置为 20 个字符宽(20 * 256)。{worksheet}为工作表对象。
设置行高
**$=****{worksheet}**.**GetRow**(2).Height = 40*20;
行高的单位是 1/20 个点(twips)。上面的表达式将从0开始的序号为2的行高设置行为 40 点。{worksheet}为工作表对象。
自动列宽
$= {worksheet}.AutoSizeColumn(0); // 自动调整第1列的宽度。{worksheet}为工作表对象。
相关链接
更新历史
- 20230623 增加写入Workbook的注意信息、打开Workbook的一种错误原因的说明。
- 20250803 增加wraptext设置的说明、表达式调用npoi方法的说明。
更新于