Чтение файла Excel из потока - PullRequest
15 голосов
/ 18 февраля 2009

Мне нужен способ прочитать файл Excel из потока. Кажется, он не работает с ADO.NET.

Сценарий состоит в том, что пользователь загружает файл через FileUpload, и мне нужно прочитать некоторые значения из файла и импортировать в базу данных.

По нескольким причинам я не могу сохранить файл на диск, и нет никаких оснований для этого.

Итак, кто-нибудь знает способ чтения файла Excel из потока FileUpload?

Ответы [ 5 ]

14 голосов
/ 18 февраля 2009

Кажется, я сам нашел решение этой проблемы.

http://www.codeplex.com/ExcelDataReader

Эта библиотека, кажется, работает хорошо, и для чтения файла Excel требуется поток.

ExcelDataReader reader = new ExcelDataReader(ExcelFileUpload.PostedFile.InputStream);
4 голосов
/ 31 марта 2017

Это можно легко сделать с помощью EPPlus .

//the excel sheet as byte array (as example from a FileUpload Control)
byte[] bin = FileUpload1.FileBytes;

//gen the byte array into the memorystream
using (MemoryStream ms = new MemoryStream(bin))
using (ExcelPackage package = new ExcelPackage(ms))
{
    //get the first sheet from the excel file
    ExcelWorksheet sheet = package.Workbook.Worksheets[1];

    //loop all rows in the sheet
    for (int i = sheet.Dimension.Start.Row; i <= sheet.Dimension.End.Row; i++)
    {
        //loop all columns in a row
        for (int j = sheet.Dimension.Start.Column; j <= sheet.Dimension.End.Column; j++)
        {
            //do something with the current cell value
            string currentCellValue = sheet.Cells[i, j].Value.ToString();
        }
    }
}
4 голосов
/ 18 февраля 2009

SpreadsheetGear может сделать это:

SpreadsheetGear.IWorkbook workbook = SpreadsheetGear.Factory.GetWorkbookSet().Workbooks.OpenFromStream(stream);

Вы можете попробовать это сами с бесплатной оценкой .

Отказ от ответственности: я владею SpreadsheetGear LLC

0 голосов
/ 30 ноября 2017

Я использую ClosedXML пакет nuget для чтения содержимого Excel из потока. Он перегружен конструктором в классе XLWorkbook, который принимает поток, указывающий на файл Excel (он же рабочая книга).

импортированное пространство имен в верхней части файла кода:

using ClosedXML.Excel;

Исходный код:

var stream = /*obtain the stream from your source*/;
if (stream.Length != 0)
{
    //handle the stream here
    using (XLWorkbook excelWorkbook = new XLWorkbook(stream))
    {
        var name = excelWorkbook.Worksheet(1).Name;
        //do more things whatever you like as you now have a handle to the entire workbook.
        var firstRow = excelWorkbook.Worksheet(1).Row(1);
    }
}
0 голосов
/ 18 февраля 2009

Инфраструктура имеет компонент Excel , который может читать файл Excel из потока.

Я использую его в проекте, и он хорошо работает.

Также компонент с открытым исходным кодом myXls может быть легко изменен для поддержки этого. Contstructor XlsDocument поддерживает только загрузку из файла, заданного именем файла, но он работает, создавая FileStream и затем читая Stream, поэтому его изменение для поддержки загрузки из потоков должно быть тривиальным.

Edit: Я вижу, что вы нашли решение, но я просто хотел отметить, что я обновил исходный код для компонента, чтобы он теперь мог читать файл Excel прямо из потока. : -)

...