2009-02-18 11 views
13

Tôi cần một cách để đọc tệp Excel từ luồng. Nó dường như không hoạt động với cách làm việc của ADO.NET.Đọc tệp excel từ luồng

Kịch bản là người dùng tải lên tệp qua Tệp tải lên và tôi cần đọc một số giá trị từ tệp và nhập vào cơ sở dữ liệu.

Vì nhiều lý do, tôi không thể lưu tệp vào đĩa và cũng không có lý do nào để thực hiện điều đó.

Vì vậy, bất kỳ ai biết cách đọc tệp Excel từ luồng FileUpload?

+0

Có một cái nhìn tại SO giải pháp này http://stackoverflow.com/a/13978464/1242061 – escist

Trả lời

0

Infragisticsexcel component có thể đọc tệp excel từ luồng.

Tôi đang sử dụng nó trong một dự án ở đây và nó hoạt động tốt.

Cũng có thể dễ dàng sửa đổi mã nguồn mở myXls component để hỗ trợ việc này. XlsDocument contstructor chỉ hỗ trợ tải từ một tập tin được đưa ra bởi một tên tập tin, nhưng nó hoạt động bằng cách tạo ra một FileStream và sau đó đọc Stream, vì vậy việc thay đổi nó để hỗ trợ tải từ các luồng sẽ là tầm thường.

Chỉnh sửa: Tôi thấy rằng bạn đã tìm thấy giải pháp nhưng tôi chỉ muốn lưu ý rằng tôi đã cập nhật mã nguồn cho thành phần để bây giờ có thể đọc tệp excel trực tiếp từ luồng. :-)

12

Có vẻ như tôi đã tìm thấy một linh hồn cho vấn đề bản thân mình.

http://www.codeplex.com/ExcelDataReader

Thư viện này dường như làm việc độc đáo và phải mất một dòng suối để đọc file excel.

ExcelDataReader reader = new ExcelDataReader(ExcelFileUpload.PostedFile.InputStream); 
+1

Cú pháp hiện tại có vẻ là: Trình đọc IExcelDataReader = new ExcelReaderFactory.CreateOpenXmlReader (ExcelFileUpload.PostedFile.InputStream); Hoặc cho các tệp định dạng 97-2003 Trình đọc IExcelDataReader = new ExcelReaderFactory.CreateBinaryReader (ExcelFileUpload.PostedFile.InputStream); – StuartQ

4

SpreadsheetGear có thể làm điều đó:

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

Bạn có thể thử nó cho chính mình với free evaluation.

Disclaimer: Tôi sở hữu SpreadsheetGear LLC

+2

+1 Tôi chỉ cần tự mình làm điều này và rất vui khi thấy rằng SSG có thể làm điều đó vì tôi đã có giấy phép cho nó - tiết kiệm cho tôi mọi điều rắc rối! –

3

Điều này có thể được thực hiện dễ dàng với 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(); 
     } 
    } 
} 
0

Tôi sử dụng ClosedXML gói nuget để đọc nội dung excel từ luồng. Nó có quá tải của hàm khởi tạo trong lớp XLWorkbook, luồng này trỏ đến tệp excel (còn gọi là sổ làm việc).

namespace nhập khẩu ở phía trên cùng của tập tin mã của bạn: Mã

using ClosedXML.Excel; 

Nguồn:

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); 
    } 
}