Как загрузить файл excel в С# с помощью NPOI Dll

Я хочу загрузить файл excel размером 40 МБ со стороны клиента, взять данные из файла excel и сохранить их в базе данных, но при загрузке файла формата .xls я получаю следующую ошибку:

 "Invalid header signature; read 0x090A0D3E7669643C, expected 0xE11AB1A1E011CFD0 - Your file appears not to be a valid OLE2 document"

Но для файла .xlsx я не получаю эту ошибку, так как я использую библиотеку NPOI, я думаю, что должен иметь возможность загружать файлы .xls и .xlsx. Ниже мой код:

private DataTable Excel_To_DataTable(int Index)
{
    DataTable dt = new DataTable();
    try
    {
        if (FileUpload1.HasFile)
        {
            string extension = Path.GetExtension(FileUpload1.PostedFile.FileName);
            string filename = Path.GetFullPath(FileUpload1.FileName);
            IWorkbook workbook = null;
            //Stream uploadFileStream = FileUpload1.PostedFile.InputStream;
            HttpPostedFile file = Request.Files[0];
            MemoryStream mem = new MemoryStream();
            mem.SetLength((int)file.ContentLength);
            file.InputStream.Read(mem.GetBuffer(), 0, (int)file.ContentLength);
            //using (MemoryStream file= new MemoryStream())
            //{
            if (extension == ".xlsx")
            {
                workbook = new XSSFWorkbook(mem);
            }
            else if (extension == ".xls")
            {
                workbook = new HSSFWorkbook(mem);
            }
            else
            {
                throw new Exception("This format is not supported");
            }
            //}
            //IWorkbook workbook = WorkbookFactory.Create(uploadFileStream);
            ISheet sheet = workbook.GetSheetAt(0);
            System.Collections.IEnumerator rows = sheet.GetRowEnumerator();

            IRow headerRow = sheet.GetRow(0);
            int cellCount = headerRow.LastCellNum;

            for (int j = 0; j < cellCount; j++)
            {
                ICell cell = headerRow.GetCell(j);
                dt.Columns.Add(cell.ToString());
            }

            for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++)
            {
                IRow row = sheet.GetRow(i);
                DataRow dataRow = dt.NewRow();
                if (row == null)
                {
                    break;
                }
                for (int j = row.FirstCellNum; j < cellCount; j++)
                {
                    if (row.GetCell(j) != null)
                        dataRow[j] = row.GetCell(j).ToString();
                }

                dt.Rows.Add(dataRow);
            }
            return dt;
        }
        else
        {
            return null;
        }
    }
    catch (Exception ex)
    {
        return null;
    }
}

person abhishek    schedule 29.08.2017    source источник
comment
Я думаю, что NPOI не может работать с файлами .xls (файлы Excel до Excel 2007), потому что это двоичные файлы. xlsx файлы заархивированы xml (формат OpenXML)   -  person Nino    schedule 29.08.2017
comment
Ни один NPOI не поддерживает оба типа файлов. Это EPPlus, который не поддерживает   -  person abhishek    schedule 29.08.2017
comment
вы можете попробовать использовать Filestream вместо memoryStream. Пожалуйста, проверьте эту ссылку NPOI stackoverflow .com/questions/5855813/   -  person kumar chandraketu    schedule 29.08.2017
comment
Пожалуйста, проверьте этот ответ. Ваш файл xls, вероятно, не является настоящим файлом xls. Я попробовал ваш код с файлом xls и не получил никаких ошибок.   -  person krlzlx    schedule 30.08.2017
comment
Спасибо, проблема в файле, а не в коде.   -  person abhishek    schedule 31.08.2017