使用NPOI C#向含XML Map的Excel表格填充数据时遇空引用异常
NPOI操作带XML Map的Excel保存触发NullReferenceException的问题解决
核心原因
Excel中的XML Map与表格(ListObject)是绑定关联的——表格作为XML数据的可视化载体,XML Map负责维护数据与XML结构的映射关系。当你通过NPOI修改表格数据后,若未同步更新XML Map对应的XML数据源,NPOI在保存文件时会尝试处理XML映射的序列化逻辑,此时因映射关系中的节点缺失或数据不匹配,触发NullReferenceException。移除XML Map后,NPOI无需处理映射逻辑,因此能正常保存。
结论:必须同步XML Map与表格数据
是的,必须同步两者的数据。XML Map和表格并非独立组件,而是绑定的整体。表格数据变更后,对应的XML数据源也需要同步更新,才能让NPOI正确处理文件保存时的映射逻辑。
解决方案步骤
- 获取表格关联的XML Map
先定位到你操作的目标表格(ListObject),通过其XmlMap属性获取对应的XML映射对象。 - 同步表格数据到XML Map的XML数据源
遍历已更新的表格行,将单元格数据写入XML Map对应的XML节点中,确保XML结构与表格数据完全匹配。 - 验证映射关系完整性
检查表格的每一列是否都正确绑定到XML Map的Schema节点,避免存在未绑定的列——这类缺失会导致NPOI处理时出现空引用。
修正后的代码示例
// 假设已获取templateWorkbook及目标工作表 ISheet targetSheet = templateWorkbook.GetSheet("DataSheet"); // 获取工作表中的表格对象 ListObject dataTable = targetSheet.GetListObjects()[0]; // 获取表格绑定的XML Map XmlMap xmlMap = dataTable.XmlMap; // --- 原有数据导入逻辑(填充表格行)--- // 此处替换为你原有的数据导入代码,比如从数据源读取并写入表格单元格 // ... // --- 同步表格数据到XML Map --- // 解析XML Map当前的XML数据 XDocument xmlDoc = XDocument.Parse(xmlMap.XmlData); var rowEnumerator = targetSheet.GetRowEnumerator(); rowEnumerator.MoveNext(); // 跳过表头行 while (rowEnumerator.MoveNext()) { IRow currentRow = (IRow)rowEnumerator.Current; // 根据XML Schema创建对应的数据行节点(示例节点名为<DataRow>,需匹配你的Schema) XElement rowElement = new XElement("DataRow"); for (int colIndex = 0; colIndex < currentRow.LastCellNum; colIndex++) { ICell cell = currentRow.GetCell(colIndex); // 获取表格列对应的XML节点名称(需与你的Schema一致) string xmlNodeName = dataTable.Columns[colIndex].Name; // 将单元格值写入XML节点 rowElement.Add(new XElement(xmlNodeName, cell?.ToString() ?? string.Empty)); } // 将新行节点添加到XML根节点下 xmlDoc.Root.Add(rowElement); } // 更新XML Map的XML数据 xmlMap.XmlData = xmlDoc.ToString(); // --- 保存文件 --- using (FileStream outputStream = new FileStream("processed_file.xlsx", FileMode.Create, FileAccess.Write)) { templateWorkbook.Write(outputStream); }
额外注意事项
- 确保XML Map的Schema与表格列的名称、数据类型完全匹配,避免因类型不兼容或节点缺失导致异常。
- 若XML Map是通过Excel开发工具导入的,提前验证Schema的有效性,确保没有语法错误。
- 调试时可检查
xmlMap.XmlData的内容,确认是否存在空节点或未初始化的映射项。
内容的提问来源于stack exchange,提问作者NickSO
相关产品推荐
相关产品推荐

