使用closedXML C#库,如何在尝试保存时找出导致此错误的数据

时间:2013-11-20 17:44:10

标签: c# excel closedxml

我有一个使用ClosedXML导出到Excel的C#应用​​。它工作正常但只是遇到了一个问题,当我点击:

  var ms = new MemoryStream();
  workbook.SaveAs(ms);

我得到一个例外:

' ', hexadecimal value 0x0B, is an invalid character

它绝对是数据相关的,因为我查看某些数据它工作正常但其他数据导致了这个问题。

我怎样才能找出造成问题的角色?此外,一旦我弄明白,找到这个角色在我的数据中的最佳方式是什么?

3 个答案:

答案 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来包装IXLWorksheetIXLCell接口。首先,我们代理IXLWorksheet值(通过添加新工作表返回,如下例所示,或通过索引现有工作表)。这需要通过方法调用手动完成;从那时起的其他一切都已建立起来。访问单元格时(通过Cell方法或ActiveCell属性),将返回代理IXLCell值,该值将通过Value属性和{{检查正在设置的数据1}}方法。根据评论,检查在SetValue中完成。如果您愿意,可以将此整个机制保留在代码库中,并通过ValidateMethodInterceptor方法中的开关打开/关闭。

作为另一种选择,包EPPlus(具有与ClosedXML类似的功能)在遇到VT字符时不会崩溃。相反,它将其替换为值Program.Proxy。也许换班会更有利?

_x00B_