Aspose.Cells.Worksheet.Cells.DeleteBlankRows();出错:$exception {"未将对象引用设置到对象的实例。"} System.NullReferenceException

Aspose.Cells.Worksheet.Cells.DeleteBlankRows();出错:$exception {“未将对象引用设置到对象的实例。”} System.NullReferenceException

@hudaming,

您能否分享示例(可运行)代码和示例 Excel 文件(如果有)来重现问题/异常? 我们会尽快检查您的问题。

附言。 请先压缩资源文件,然后再附加到此处。

不好意思,现在才有时间做了个重现问题的步骤.我附上代码.
asposetest.zip (74.9 KB)

不开单独线程,一切正常.把代码放在 await Task.Run(() =>
{
}); 才会出现 worksheet.Cells.DeleteBlankRows();的错误.我这边因为处理大数据表,需要将 worksheet.Cells的一些操作放在另外的线程里面.

@hudaming
感谢您的反馈和详细信息。我们将进一步调查您的问题。一旦我们有了最新消息,我们会通知您。我们很快就会给你回复。

@hudaming
Aspose.Cells目前只支持多线程读操作,不支持多线程写操作。关于多线程读操作,请参考以下文档。

好的,我的本意也不是要多线程处理。只是想单独开一个线程来处理Aspose.Cells打开文件。也没什么实际作用,我改代码了。

@hudaming
感谢你的反馈。很高兴你通过其他方式解决了问题。如果你有任何疑问,请随时联系我们。

@hudaming
Aspose.Cells仅有限支持多线程读同一个workbook的数据,不支持多线程同时修改一个workbook的数据。我们研究并测试了您提供的工程,其中并不存在多线程修改数据的问题。您所遇到的异常,问题不在于DeleteBlankRows,而在于worksheet.Dispose()这行代码。您在访问集合迭代器的过程中将其中的元素释放,有时候会导致迭代器迭代元素出现问题。对于您示例中使用的这个简单的文件,如果您倒序访问worksheet就可以避免这种问题,例如将:

foreach(Aspose.Cells.Worksheet worksheet in lswo.Worksheets)

改为

for (int i=lswo.Worksheets.Count-1; i>-1; i--)

即可以解决当前遇到的空指针异常。

然而,通常在DeleteBlankRows等方法的执行过程中,会去检查其它worksheet以保证公式引用等得到正确的变化。您将访问过的worksheet释放后,很多资源无法再被正确访问,所以即使使用上述的倒序访问的方式,对于其它较复杂的文件和数据,这种处理方式仍然非常可能导致异常。所以,请不用在一个workbook还没有使用完毕的情况下直接释放一个worksheet。若您确实需要更及时的释放worksheet,请先从workbook里面删除它(RemoveAt),然后调用Dispose方法。

好的,非常感谢给出的详细解释!

@hudaming
不客气。如果你有任何疑问,请随时联系我们。