在 C# 中流空以读取和上传 Excel 文件

本文关键字:Excel 文件 读取 | 更新日期: 2024-10-29 15:21:02

我在使用 Excel Data Reader 的 IExcelDataReader 读取 HttpPostedFileBase Excel 文件以及 AWS SDK API 以上传相同的 Excel 文件时遇到问题。 进行验证以确定是应上载文件还是仅在数据表中使用文件,如果验证通过,则始终上载 0 Kb 的空 Excel 文件。

我已经尝试过:在使用文件的输入流之前关闭并处理IExcelDataReader;创建一个新的Stream并上传它;重置InputStream的位置;并检查这个网站是否有类似的问题。 此外,将上载放在验证之前会上传完整文档,但随后的 IExcelDataReader 会引发"无法使用已释放的对象"错误。

有谁知道如何重用文件输入流? 提前感谢!

//If save to bucket area is here, upload works, but later logic fails on disposed object
IExcelDataReader uploadReader;
switch (uploadExtension)
{
    case ".xls":
        uploadReader = ExcelReaderFactory.CreateBinaryReader(UploadedFile.InputStream);
        break;
    case ".xlsx":
        uploadReader = ExcelReaderFactory.CreateOpenXmlReader(UploadedFile.InputStream);
        break;
    default:
        uploadReader = ExcelReaderFactory.CreateBinaryReader(UploadedFile.InputStream);
        break;
}
DataSet excelUploadDataSet = uploadReader.AsDataSet();
var resultSheets = from DataTable sheet in excelUploadDataSet.Tables select sheet.TableName;
var excelSheets = resultSheets.ToList();
DataTable excelUpload = excelUploadDataSet.Tables[0];
int excelRows;
if ((string)excelSheets[0] != "Info")
{
    //Tried everything in the problem here, to no avail
    //Save to bucket area
    using (var client = new AmazonS3Client(Amazon.RegionEndpoint.USWest1))
    {
        PutObjectRequest request = new PutObjectRequest
        {
            BucketName = bucketLocation,
            Key = UploadedFile.FileName,
            InputStream = UploadedFile.InputStream
        };
        PutObjectResponse response = client.PutObject(request);
    }
}
else
{
    //Other logic using data table/IExcelDataReader
}

在 C# 中流空以读取和上传 Excel 文件

你有从UploadedFile.InputStream读取的代码(因此寻找它到最后),然后你尝试将该流(位置设置为末尾,因此没有任何内容可以从中读取)传递给其他方法。由于PutObject无法从流中读取任何内容并发送空数据。

可能的解决方法 - 将位置设置为 0(请参阅 Stream.Seek(0, SeekOrigin.Begin) 或 Position = 0),但请注意,在许多情况是不可搜索的(即 ASP.Net 上传的文件) - 在这种情况下,您需要读取流一次或将其复制到本地(即复制到 MemoryStream )以多次读取。