使用 ExcelDataReader 时出现无效数据异常
Invalid Data Exception when using ExcelDataReader
我有一个使用 ExcelDataReader.dll.
读取 Excel 文件的程序
一切都很完美,直到我将文件读取移至新任务:
Stream output = new MemoryStream();
httpRequest.Files[0].InputStream.CopyToAsync(output);
ImportDataWriter importDatawRiter = new ImportDataWriter(authenticationInfo);
Task.Run(() => importDatawRiter.ImportFile(output));
导入行代码:
public ImportResult ImportFile(Stream fs)
{
IExcelDataReader reader = ExcelReaderFactory.CreateOpenXmlReader(fs);
}
现在这一行:
IExcelDataReader reader = ExcelReaderFactory.CreateOpenXmlReader(fs);
导致异常:
类型'System.IO.InvalidDataException'的异常发生在System.IO.Compression.dll,但未在用户代码中处理
消息:
找不到中央目录记录的结尾。
从我第二次调用该函数开始出现异常。
可能是什么问题?
问题是您没有等待复制任务完成,所以当您读取 MemoryStream
时,它不是完整的(甚至可能是完全空的),所以,更改您的代码为:
Stream output = new MemoryStream();
await httpRequest.Files[0].InputStream.CopyToAsync(output);
^^^^^
ImportDataWriter importDatawRiter = new ImportDataWriter(authenticationInfo);
Task.Run(() => importDatawRiter.ImportFile(output));
而且,除非 ImportFile
是一劳永逸的行为,否则我建议您使用
await Task.Run(() => importDatawRiter.ImportFile(output));
我有一个使用 ExcelDataReader.dll.
读取 Excel 文件的程序
一切都很完美,直到我将文件读取移至新任务:
Stream output = new MemoryStream();
httpRequest.Files[0].InputStream.CopyToAsync(output);
ImportDataWriter importDatawRiter = new ImportDataWriter(authenticationInfo);
Task.Run(() => importDatawRiter.ImportFile(output));
导入行代码:
public ImportResult ImportFile(Stream fs)
{
IExcelDataReader reader = ExcelReaderFactory.CreateOpenXmlReader(fs);
}
现在这一行:
IExcelDataReader reader = ExcelReaderFactory.CreateOpenXmlReader(fs);
导致异常:
类型'System.IO.InvalidDataException'的异常发生在System.IO.Compression.dll,但未在用户代码中处理
消息:
找不到中央目录记录的结尾。
从我第二次调用该函数开始出现异常。
可能是什么问题?
问题是您没有等待复制任务完成,所以当您读取 MemoryStream
时,它不是完整的(甚至可能是完全空的),所以,更改您的代码为:
Stream output = new MemoryStream();
await httpRequest.Files[0].InputStream.CopyToAsync(output);
^^^^^
ImportDataWriter importDatawRiter = new ImportDataWriter(authenticationInfo);
Task.Run(() => importDatawRiter.ImportFile(output));
而且,除非 ImportFile
是一劳永逸的行为,否则我建议您使用
await Task.Run(() => importDatawRiter.ImportFile(output));