我有一个使用ClosedXML导出到Excel的C#应用。它工作正常但只是遇到了一个问题,当我点击:
var ms = new MemoryStream();
workbook.SaveAs(ms);
我得到一个例外:
' ', hexadecimal value 0x0B, is an invalid character
它绝对是数据相关的,因为我查看某些数据它工作正常但其他数据导致了这个问题。
我怎样才能找出造成问题的角色?此外,一旦我弄明白,找到这个角色在我的数据中的最佳方式是什么?
答案 0 :(得分:6)
由于您在ClosedXML表格中输入的数据/字符串中包含无效字符,因此您必须找到它们并将其取出。
最简单的解决方案是添加
.Replace((0x0B).ToString(), " ")
删除所有字符串以删除垂直制表符并用空格替换它们。
答案 1 :(得分:6)
由于ClosedXML是一个开源项目,跟踪错误的最简单方法是从source * 构建它,然后在调试模式下对库运行代码
一旦看到完整的堆栈跟踪,您就应该能够识别错误发生的位置。很有可能它是ClosedXML项目使用Microsoft XML库的方式中的错误,因为您提到的错误是由ClosedXML项目之外的库报告的。
<小时/> * 我下载了项目,并尝试构建它。
closedxml-79843.zip
包中的所有内容都可以正确构建。
答案 2 :(得分:3)
由于ClosedXML不会阻止您在值中使用0x0B字符,因此您必须自己擦除数据(如@Raidri所建议),或者您可以强制和异常,或者执行字符串替换设置值时。我创建了一个示例程序,下面使用Castle's Dynamic Proxy来包装IXLWorksheet
和IXLCell
接口。首先,我们代理IXLWorksheet
值(通过添加新工作表返回,如下例所示,或通过索引现有工作表)。这需要通过方法调用手动完成;从那时起的其他一切都已建立起来。访问单元格时(通过Cell
方法或ActiveCell
属性),将返回代理IXLCell
值,该值将通过Value
属性和{{检查正在设置的数据1}}方法。根据评论,检查在SetValue
中完成。如果您愿意,可以将此整个机制保留在代码库中,并通过ValidateMethodInterceptor
方法中的开关打开/关闭。
作为另一种选择,包EPPlus(具有与ClosedXML类似的功能)在遇到VT字符时不会崩溃。相反,它将其替换为值Program.Proxy
。也许换班会更有利?
_x00B_