You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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正确处理文件保存时的映射逻辑。

解决方案步骤

  1. 获取表格关联的XML Map
    先定位到你操作的目标表格(ListObject),通过其XmlMap属性获取对应的XML映射对象。
  2. 同步表格数据到XML Map的XML数据源
    遍历已更新的表格行,将单元格数据写入XML Map对应的XML节点中,确保XML结构与表格数据完全匹配。
  3. 验证映射关系完整性
    检查表格的每一列是否都正确绑定到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 15:45:12