尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Magicodes.IE.IO: XML 单元格读写:转义、稀疏列与日期

Magicodes.IE.IO: XML 单元格读写:转义、稀疏列与日期 导出时要把 .NET 值写成合法的 OOXML 单元格导入时要从不同的单元格表示恢复逻辑列和文本。本文把 XML 转义、UTF-8、Inline String、稀疏列、富文本和日期系统放在一条读写链路里说明。单元格读写的共同难点是业务上看到的是“一个值”OOXML 里却有很多表示方式。写入先保证 XML 正确再走快路径文本节点中和必须转义。当前实现也会保守地处理、单双引号和非法控制字符首尾空白则写出xml:spacepreserve避免 Excel 改变文本语义。写入路径会先判断字符串是否是安全 ASCII长 ASCII、无特殊字符 → 直接写入 UTF-8 字节可使用向量化转换 短 ASCII → 标量复制 中文、特殊字符、非法控制字符 → UTF-8 编码 / 转义 / 替换路径SearchValueschar和Ascii.FromUtf16只是安全 ASCII 路径的实现优化不是通用 XML 校验器。中文文本通常不需要 XML 实体转义但它不是 ASCII仍要经过 UTF-8 编码。读取XML 顺序不等于逻辑列顺序外部 XLSX 可能是稀疏列c rA2v10/v/c c rC2v30/v/cB 列没有节点。Reader 必须从rC2解析列号在中间补null而不是把第二个 XML 节点当成第二列。同样节点可能按 A、C、B 的 document order 出现。Reader 仍应按 cell reference 落到正确的逻辑列。inline string、富文本与布尔值inline string 直接位于ist文本/t/is富文本可能有多个tisrtHel/t/rrtlo/t/r/isReader 会拼接为Hello。它恢复的是业务文本不试图恢复字体和颜色等富文本样式。布尔单元格通常是tb值1、0会规范成true、false再交给对象映射层转换。1900 / 1904 日期系统日期不只看单元格值还要看xl/workbook.xml中的workbookPr date19041 /日期处理不能只靠DateTime.FromOADate。如果工作簿使用 1904 日期系统而读取方忽略该设置日期会出现固定天数偏移问题通常很隐蔽。日期 round-trip 也不应只比较格式化后的文本。Excel 序列号、1900 / 1904 日期系统、DateTimeKind、DateTimeOffset和浮点精度都会影响结果测试应按组件的序列化语义覆盖这些边界。当前 Reader 会识别date1904而新建工作簿的 Writer 固定按 1900 / OA 日期系统写入尚不支持输出date1904工作簿。一个外部文件场景外部系统导出的 worksheet 可能同时出现表头在 A、B、C 列 数据行只写 A、C 两列 单元格 XML 顺序是 A、C、B 日期采用 date1904 备注是多个富文本 run如果 Reader 只是按 XML 节点出现顺序 append金额会落到错误属性如果只读第一个t备注会截断如果忽略date1904日期会整体偏移。Reader 的稀疏列、富文本和日期测试就是针对这些外部工作簿形态而不是只验证自己生成的最小 XLSX。导出侧也要用同一组约束反查特殊字符是否被正确转义、首尾空格是否保留、日期值是否按当前 1900 / OA 写入语义输出。读写能互相 round-trip 只是基础外部文件仍要单独覆盖。
返回列表