Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Read an Excel spreadsheet in memory

How can I read an Excel spreadsheet that was just posted to my server? I searched for something but I only found how to read an Excel spreadsheet with the file name path which is not my case.

I need something like that:

public ActionResult Import(HttpPostedFileBase file)
{
     var excel = new ExcelQueryFactory(file); //using linq to excel
}
like image 264
MuriloKunze Avatar asked Dec 18 '12 11:12

MuriloKunze


People also ask

How do I view a cached Excel file?

It will only cache the files that you opened with an Office application (such as Word, Excel, or PowerPoint). To get to the cached Office files, open the Office Upload Center and select All Cached Files from the drop-down list next to the Refresh button.

Can Excel pull live data?

Much like that feature, the October 2018 update of Excel in Office 365 enables you to pull real-time and constantly updated financial market and geographic data from the cloud into your spreadsheet.


Video Answer


2 Answers

I was running into your same issue but I didn't want to switch to a paid service so this is what I did.

public class DataImportHelper : IDisposable
{
    private readonly string _fileName;
    private readonly string _tempFilePath;

    public DataImportHelper(HttpPostedFileBase file, string tempFilePath)
    {
        _fileName = file.FileName;
        _tempFilePath = Path.Combine(tempFilePath, _fileName);
        (new FileInfo(_tempFilePath)).Directory.Create();
        file.SaveAs(_tempFilePath);
    }

    public IQueryable<T> All<T>(string sheetName = "")
    {
        if (string.IsNullOrEmpty(sheetName))
        {
            sheetName = (typeof (T)).Name;
        }

        var excelSheet = new ExcelQueryFactory(_tempFilePath);

        return from t in excelSheet.Worksheet<T>(sheetName)
               select t;
    }

    public void Dispose()
    {
        File.Delete(_tempFilePath);
    }

}

Here is a Test

[Fact]
    public void AcceptsAMemoryStream()
    {
        MemoryFile file;

        using (var f = File.OpenRead("SampleData.xlsx"))
        {
            file = new MemoryFile(f, "multipart/form-data", "SampleData.xlsx");

            using (var importer = new DataImportHelper(file, "Temp/"))
            {
                var products = importer.All<Product>();

                Assert.NotEmpty(products);

            }
        }
    }

Here is MemoryFile.cs. This file is only used for testing. It is just an implementation of HttpPostedFileBase so you can test your controllers and my little helper. This was borrowed from another post.

 public class MemoryFile : HttpPostedFileBase
    {
        Stream stream;
        string contentType;
        string fileName;

        public MemoryFile(Stream stream, string contentType, string fileName)
        {
            this.stream = stream;
            this.contentType = contentType;
            this.fileName = fileName;
        }

        public override int ContentLength
        {
            get { return (int)stream.Length; }
        }

        public override string ContentType
        {
            get { return contentType; }
        }

        public override string FileName
        {
            get { return fileName; }
        }

        public override Stream InputStream
        {
            get { return stream; }
        }

        public override void SaveAs(string filename)
        {
            using (var file = File.Open(filename, FileMode.Create))
                stream.CopyTo(file);
        }
    }
like image 131
Brett Allred Avatar answered Sep 23 '22 12:09

Brett Allred


Unfortunately it's not possible to read a spreadsheet from a stream with LinqToExcel.

That's because it uses OLEDB to read from the spreadsheets and it can't read from a stream.

like image 40
Paul Avatar answered Sep 22 '22 12:09

Paul