【问题标题】:C# Convert physical file to iformfileC# 将物理文件转换为 iformfile
【发布时间】:2020-07-03 01:35:54
【问题描述】:

我正在尝试将物理 excel 文件读取到 IFormFile,但是当我读取它保留的文件时内容总是空的,它显示字节 0。我正在尝试测试一种将读取 excel 文件内容的方法。有没有人进行过测试以设法将 excel 文件读取到 iformfile,或者我如何编写使用 epplus 读取文件的单元测试?

ServiceTest.cs

    [Fact]
    public async Task saveFile_test()
    {
        string rootPath = Directory.GetCurrentDirectory();
        string testAssetsFolder = @"Assets\";
        string testFile = "test.xlsx";
        string testFilePath = Path.Combine(rootPath, testAssetsFolder, testFile);

        // Arrange.
        var fileMock = new Mock<IFormFile>();
        var physicalFile = new FileInfo(testFilePath);
        var ms = new MemoryStream();
        var writer = new StreamWriter(ms);
        using (FileStream fs = physicalFile.OpenRead())
        {
            byte[] b = new byte[1024];
            UTF8Encoding temp = new UTF8Encoding(true);

            while (fs.Read(b, 0, b.Length) > 0)
            {
                writer.WriteLine(temp.GetString(b));
            }
        }
        writer.Flush();
        ms.Position = 0;
        var fileName = physicalFile.Name;
        //Setup mock file using info from physical file
        fileMock.Setup(_ => _.FileName).Returns(fileName);
        fileMock.Setup(_ => _.Length).Returns(ms.Length);
        fileMock.Setup(m => m.OpenReadStream()).Returns(ms);
        fileMock.Setup(m => m.ContentDisposition).Returns(string.Format("inline; filename={0}", fileName));
        //...setup other members as needed

        List<IFormFile> files = new List<IFormFile>();
        files.Add(fileMock.Object);

        await _service.saveFile(files, "directory", "subDirectory", default);
    }

Service.cs

    public async Task saveFile(List<IFormFile> files, string directory, string subDirectory, CancellationToken cancellationToken)
    {
        subDirectory = subDirectory ?? string.Empty;
        var target = Path.Combine(directory, subDirectory);

        Directory.CreateDirectory(target);

        foreach (IFormFile file in files)
        {
            if (file.Length <= 0) return;
            var filePath = Path.Combine(target, file.FileName);
            using (var stream = new FileStream(filePath, FileMode.Create))
            {
                await file.CopyToAsync(stream, cancellationToken);
                try
                {
                    // add to read encoded 1252 values
                    using (var package = new ExcelPackage(stream))
                    {

                        // Express worksheet
                        ExcelWorksheet worksheet = package.Workbook.Worksheets["Express"];
                        int colCount = worksheet.Dimension.End.Column;  //get Column Count
                        int rowCount = worksheet.Dimension.End.Row;

                        ....

【问题讨论】:

    标签: c# unit-testing .net-core epplus


    【解决方案1】:

    您应该能够使用ExcelDataReader.ExcelReaderFactory 实现此目的

     using (var stream = file.OpenReadStream())
                {
                    using (var reader = ExcelReaderFactory.CreateReader(stream))
                    {
                        
                            reader.Read(); /* Header row - we ignore this */
                            do
                            {
                                while (reader.Read())
                                {
                                    {
                                        var username = reader.GetString(0);
                                        var firstName = reader.GetString(1);
    ....
    

    【讨论】:

      猜你喜欢
      • 2016-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-18
      • 2020-10-30
      • 2020-10-04
      • 2016-05-23
      相关资源
      最近更新 更多