2012-12-18 40 views
12

Làm cách nào để đọc bảng tính Excel vừa được đăng lên máy chủ của tôi? Tôi đã tìm kiếm nội dung nào đó nhưng tôi chỉ tìm cách đọc bảng tính Excel có đường dẫn tên tệp không phải là trường hợp của tôi.Đọc bảng tính Excel trong bộ nhớ

tôi cần một cái gì đó như thế:

public ActionResult Import(HttpPostedFileBase file) 
{ 
    var excel = new ExcelQueryFactory(file); //using linq to excel 
} 
+1

có thể trùng lặp của câu hỏi này: [đọc file excel từ một dòng] (http: // stackoverflow .com/questions/560435/read-excel-file-from-a-stream)? –

+0

Bạn sẽ phải xem xét các vấn đề như: Điều gì sẽ xảy ra nếu bảng không có trên trang tính đầu tiên? Điều gì xảy ra nếu nó không nằm trong phạm vi bạn chỉ định? Excel không có khả năng OleDb, nhưng bạn phải sử dụng các phương thức như 'GetOleDbSchema()' để nhận các tab, sau đó biết phạm vi truy vấn. Có thể, nhưng không chỉ 3 dòng mã. –

+0

@DominicZukiewicz Đó không phải là vấn đề thực sự trong trường hợp của tôi vì mỗi tệp tải lên sẽ có cùng một lược đồ. – MuriloKunze

Trả lời

13

Rất tiếc, không thể đọc bảng tính từ luồng bằng LinqToExcel.

Đó là bởi vì nó sử dụng OLEDB để đọc từ bảng tính và không thể đọc từ luồng.

-1

Bạn cần văn phòng Interops hội. Kiểm tra số Excel Object Model để tham khảo.

+0

Điều này không thực sự trả lời câu hỏi – jAC

19

Tôi đã gặp sự cố tương tự nhưng tôi không muốn chuyển sang dịch vụ trả tiền, vì vậy đây là những gì tôi đã làm.

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

} 

Đây là một thử nghiệm

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

      } 
     } 
    } 

Đây là MemoryFile.cs. Tệp này chỉ được sử dụng để thử nghiệm. Nó chỉ là một thực hiện của HttpPostedFileBase vì vậy bạn có thể kiểm tra bộ điều khiển của bạn và trợ giúp nhỏ của tôi. Điều này đã được mượn từ một bài đăng khác.

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

Tốt, tôi đã làm một cái gì đó như thế để giải quyết vấn đề của tôi. – MuriloKunze

+0

Cảm ơn Brett Allred, điều này đã giúp! – escist

0

Bạn có thể sử dụng tài sản của InputStreamHttpPostedFileBase để đọc các bảng tính excel trong bộ nhớ.

Tôi sử dụng gói ClosedXML gói để đọc nội dung excel từ luồng khả dụng trong trường hợp của bạn. Nó có một quá tải đơn giản mà có dòng chỉ để dòng cho các tập tin excel (aka bảng tính).

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

using ClosedXML.Excel; 

Nguồn:

public ActionResult Import(HttpPostedFileBase file) 
{ 
    //HttpPostedFileBase directly is of no use so commented your code 
    //var excel = new ExcelQueryFactory(file); //using linq to excel 
    var stream = file.InputStream; 
    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); 
     } 
    } 
} 
Các vấn đề liên quan