Aspose.Cells.Worksheet.Cells.DeleteBlankRows();出错:$exception {“未将对象引用设置到对象的实例。”} System.NullReferenceException
不开单独线程,一切正常.把代码放在 await Task.Run(() =>
{
}); 才会出现 worksheet.Cells.DeleteBlankRows();的错误.我这边因为处理大数据表,需要将 worksheet.Cells的一些操作放在另外的线程里面.
好的,我的本意也不是要多线程处理。只是想单独开一个线程来处理Aspose.Cells打开文件。也没什么实际作用,我改代码了。
@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方法。
好的,非常感谢给出的详细解释!