2015-10-23 29 views
12

Tôi gặp sự cố khi đọc tệp .xlsx (Excel). Tôi đã cố gắng sử dụng:Cách đọc từ XLSX (Excel)?

var fileName = @"C:\automated_testing\ProductsUploadTemplate-2015-10-22.xlsx"; 
var connectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0; data source={0}; Extended Properties=Excel 8.0;", fileName); 

var adapter = new OleDbDataAdapter("SELECT * FROM [workSheetNameHere$]", connectionString); 
var ds = new DataSet(); 
adapter.Fill(ds, "XLSData"); 
DataTable data = ds.Tables["XLSData"]; 

// ... Loop over all rows. 
StringBuilder sb = new StringBuilder(); 
foreach (DataRow row in data.Rows) 
{ 
    sb.AppendLine(string.Join(",", row.ItemArray)); 
} 

nhưng nếu không thành công do connectionString. Vì vậy, tôi cập nhật dòng để hỗ trợ .xlsx:

var connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=Excel 12.0;", fileName); 

nhưng tôi nhận được:

Nhà cung cấp 'Microsoft.ACE.OLEDB.12.0' không được đăng ký trên máy tính cục bộ.

(Vấn đề ở đây là, tôi không thể cài đặt phần mềm mới trên máy tính từ xa thử nghiệm của tôi, vì vậy tôi không thể sửa chữa nó và cần phải tìm giải pháp khác.)

Tôi cũng làm cần phải chắc chắn rằng dữ liệu đã nhập sẽ được lưu trữ một cách đơn giản (tôi là lập trình viên mới bắt đầu) để cho phép tôi lặp qua nó, tức là tạo các đối tượng với dữ liệu của hàng.

cách tiếp cận khác tôi đã kiểm tra:

bình luận: dường như có thể làm việc cho tôi, nhưng không hỗ trợ các file Excel có kích thước chưa biết (số ngẫu nhiên của các hàng và cột).

bình luận: không hỗ trợ cài đặt tên cột từ hàng khác so với người đầu tiên (trong một số các tập tin Excel của tôi, có ý kiến ​​trong 4-6 hàng đầu tiên và sau đó là hàng tiêu đề và dữ liệu bên dưới).

bình luận: cùng một vấn đề như trên.

bình luận: tải về gói trọng lượng đã kết thúc 60MB và nó đòi hỏi tôi phải cài đặt nó trên hệ thống, đó là không thể thực hiện trong hoàn cảnh của tôi. Dù sao, mọi người bình luận rằng nó được giới hạn trong 150 hàng.

Trong khi đó, tôi sẽ cố gắng kiểm tra https://code.google.com/p/linqtoexcel/, nhưng tất cả ý tưởng khác đều được hoan nghênh!

EDIT: Chỉ cần kiểm tra rằng LinqToExcel, cùng một vấn đề như trên:

Nhà cung cấp 'Microsoft.ACE.OLEDB.12.0' không được đăng ký trên máy cục bộ.

EDIT2: Cuối cùng, dường như giải pháp này giải quyết vấn đề của tôi:

https://stackoverflow.com/a/19065266/3146582

+0

epplus https://epplus.codeplex.com/ – Fredou

+0

@Fredou: không nó tạo bảng tính? Tôi cần phải đọc từ một. Bạn có ví dụ nào về điều đó không? –

+0

nó cũng có thể đọc tệp excel, kiểm tra câu hỏi stackoverflow này http://stackoverflow.com/questions/11685204/reading-excel-spreasheet-using-epplus hoặc mục blog này http://blog.fryhard.com/archive/2010 /10/28/reading-xlsx-files-using-c-and-epplus.aspx – Fredou

Trả lời

14

Nếu bạn đang đọc dữ liệu từ Excel tập tin, bạn có thể sử dụng EPPlus NuGet gói, và sử dụng đoạn mã sau

//using OfficeOpenXml; 
using (ExcelPackage xlPackage = new ExcelPackage(new FileInfo(@"C:\YourDirectory\sample.xlsx"))) 
{ 
    var myWorksheet = xlPackage.Workbook.Worksheets.First(); //select sheet here 
    var totalRows = myWorksheet.Dimension.End.Row; 
    var totalColumns = myWorksheet.Dimension.End.Column; 

    var sb = new StringBuilder(); //this is your your data 
    for (int rowNum = 1; rowNum <= totalRows; rowNum++) //selet starting row here 
    { 
     var row = myWorksheet.Cells[rowNum, 1, rowNum, totalColumns].Select(c => c.Value == null ? string.Empty : c.Value.ToString()); 
     sb.AppendLine(string.Join(",", row)); 
    } 
} 
+0

Cảm ơn! Đó là giải pháp tốt nhất cho tôi. Tôi chỉ thay đổi nó một chút và thay thế phụ thêm vào stringbuilder với foreach. –

+0

@BlackHat vui vì nó đã giúp :) –

+1

EPPlus là GNU GPL v3 được cấp phép. – nyconing

-2

Bạn đang phát triển trên máy tính này quá? Nếu không, tôi khuyên bạn nên sử dụng OpenXml SDK bạn chỉ cần install it trên máy của nhà phát triển.

1

file với nhà cung cấp OLE Reading Excel có thể chỉ khi MS Jet động cơ (MS Access) được cài đặt . Tôi nhận thấy rằng bạn đã quyết định sử dụng .NET interop cho API nhưng đây không phải là một ý tưởng hay: nó đòi hỏi phải cài đặt MS Excel và không được khuyến khích sử dụng để tự động hóa trên máy chủ.

Nếu bạn không cần hỗ trợ các định dạng cũ (nhị phân) Excel (xls) và đọc XLSX là đủ, tôi khuyên bạn nên sử dụng thư viện EPPlus. Nó cung cấp API đơn giản và mạnh mẽ cho cả đọc và ghi các file XLSX (và có rất nhiều ví dụ):

var existingFile = new FileInfo(filePath); 
// Open and read the XlSX file. 
using (var package = new ExcelPackage(existingFile)) { 
    // access worksheets, cells etc 
} 
Các vấn đề liên quan