Ответ 1
Кажется, я сам нашел суть проблемы.
http://www.codeplex.com/ExcelDataReader
Эта библиотека работает хорошо, и для чтения файла excel требуется поток.
ExcelDataReader reader = new ExcelDataReader(ExcelFileUpload.PostedFile.InputStream);
Мне нужен способ чтения файла Excel из потока. Кажется, он не работает с ADO.NET способом делать что-то.
Сценарий заключается в том, что пользователь загружает файл через FileUpload, и мне нужно прочитать некоторые значения из файла и импортировать в базу данных.
По нескольким причинам я не могу сохранять файл на диск, и нет причин для этого.
Итак, кто-нибудь знает способ чтения файла Excel из потока FileUpload?
Кажется, я сам нашел суть проблемы.
http://www.codeplex.com/ExcelDataReader
Эта библиотека работает хорошо, и для чтения файла excel требуется поток.
ExcelDataReader reader = new ExcelDataReader(ExcelFileUpload.PostedFile.InputStream);
SpreadsheetGear может сделать это:
SpreadsheetGear.IWorkbook workbook = SpreadsheetGear.Factory.GetWorkbookSet().Workbooks.OpenFromStream(stream);
Вы можете попробовать его самостоятельно с помощью бесплатной оценки.
Отказ от ответственности: у меня есть SpreadsheetGear LLC
Это можно легко сделать с помощью 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();
}
}
}
Infragistics имеет excel component который может читать файл excel из потока.
Я использую его в проекте здесь, и он работает хорошо.
Также открытый источник myXls component может быть легко изменен для поддержки этого. Контрактор XlsDocument поддерживает только загрузку из файла, заданного именем файла, но он работает, создавая FileStream и затем считывая Stream, поэтому его изменение для поддержки загрузки из потоков должно быть тривиальным.
Изменить: Я вижу, что вы нашли решение, но я просто хотел заметить, что я обновил исходный код для компонента, чтобы теперь он мог читать файл excel непосредственно из потока.: -)
Я использую ClosedXML пакет nuget для чтения содержимого excel из потока. Он имеет перегрузку конструктора в классе XLWorkbook
, который принимает поток, указывающий на файл excel (aka workbook).
импортированное пространство имен в верхней части вашего файла кода:
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);
}
}