2012-03-14 6 views
6

Tôi đang cố gắng đọc dữ liệu từ tài liệu Excel trong C# bằng cách sử dụng Microsofts COM Interop.Đọc dữ liệu từ các cột/hàng Excel kết hợp bằng C#

Cho đến giờ, tôi có thể tải tài liệu và đọc một số dữ liệu từ đó. Tuy nhiên, tôi cần phải đọc dữ liệu từ hai cột khác nhau và xuất chúng dưới dạng json (cho cuộc gọi jquery ajax)

Tôi đã tạo một nguyên mẫu nhanh về cách tài liệu Excel của tôi được cấu trúc với hy vọng rằng nó dễ dàng hơn một chút giải thích ;-)

enter image description here

phương pháp tôi có được gọi là GetExcelDataByCategory(string categoryName) nơi tham số CategoryName sẽ được sử dụng để tìm mà cột để lấy dữ liệu từ. Vì vậy, tức là, nếu tôi thực hiện cuộc gọi với "Danh mục 2" làm thông số, tôi cần phải nhận tất cả các giá trị trong các cột C hàng ngày tương ứng từ cột A, vì vậy đầu ra sẽ giống như thế này:

enter image description here

nào sau đó cần phải được chuyển đổi/phân tích thành JSON.

Tôi đã tìm kiếm cao và thấp về cách đạt được điều này, nhưng không có may mắn cho đến nay :-(Tôi biết rằng tôi có thể sử dụng phương thức get_Range() để chọn phạm vi, nhưng có vẻ như bạn cần một cách rõ ràng cho biết phương thức nào có hàng và cột nào để lấy dữ liệu từ đó: Ie: get_Range ("A1, C1")

Đây là kinh nghiệm đầu tiên của tôi về đọc dữ liệu từ tài liệu Excel, vì vậy tôi đoán có rất nhiều điều cần tìm hiểu ;-) Có cách nào để có được đầu ra trên hình ảnh thứ hai của tôi không?

Bất kỳ trợ giúp/gợi ý nào được đánh giá cao! :-)

Xin cảm ơn trước.

All the best,

Bo

+0

Một trong những cách tốt nhất để tìm hiểu Mô hình đối tượng Excel là ghi lại Macro trong Excel nơi bạn thực hiện tác vụ thủ công một cách thủ công. Sau đó, xem lại mã VBA kết quả trong macro để có ý tưởng hay về cách cấu trúc mã của bạn để thực hiện tác vụ tương tự. –

Trả lời

4

Đây là những gì tôi sẽ làm:

using Excel = Microsoft.Office.Interop.Excel; 

Excel.Application xlApp = new Excel.Application(); 
Excel.Workbook xlWorkbook = xlApp.Workbooks.Open("path to book"); 
Excel.Worksheet xlSheet = xlWorkbook.Sheets[1]; // get first sheet 
Excel.Range xlRange = xlSheet.UsedRange; // get the entire used range 

int numberOfRows = xlRange.Rows.Count; 
int numberOfCols = xlRange.Columns.Count; 
List<int> columnsToRead = new List<int>(); 
// find the columns that correspond with the string columnName which 
// would be passed into your method 
for(int i=1; i<=numberOfCols; i++) 
{ 
    if(xlRange.Cells[1,i].Value2 != null) // ADDED IN EDIT 
    { 
     if(xlRange.Cells[1,i].Value2.ToString().Equals(categoryName)) 
     { 
      columnsToRead.Add(i); 
     } 
    } 
} 
List<string> columnValue = new List<string>(); 
// loop over each column number and add results to the list 
foreach(int c in columnsToRead) 
{ 
    // start at 2 because the first row is 1 and the header row 
    for(int r = 2; r <= numberOfRows; r++) 
    { 
     if(xlRange.Cells[r,c].Value2 != null) // ADDED IN EDIT 
     { 
      columnValue.Add(xlRange.Cells[r,c].Value2.ToString()); 
     } 
    } 
} 

Đây là mã tôi sẽ sử dụng để đọc Excel. Ngay bây giờ nó đọc mỗi cột có tiêu đề (được chỉ định bởi bất cứ điều gì là trong hàng đầu tiên) và sau đó tất cả các hàng ở đó. Nó không phải là chính xác những gì bạn yêu cầu (nó không định dạng thành JSON) nhưng tôi nghĩ rằng nó là đủ để giúp bạn vượt qua bướu.


EDIT: Có vẻ như có một vài ô trống đang gây ra sự cố. Một ô trống sẽ là NULL trong Interop và do đó chúng ta sẽ gặp lỗi nếu chúng ta cố gắng gọi Value2 hoặc Value2.ToString() vì chúng không tồn tại. Tôi đã thêm mã để kiểm tra để đảm bảo rằng ô không phải là rỗng trước khi làm bất cứ điều gì với nó. Nó ngăn chặn các lỗi.

+0

Hi Jetti, cảm ơn rất nhiều cho đầu vào của bạn! Được đánh giá cao :) Tuy nhiên, khi tôi thử mã với excel tập tin (.xls) Tôi tiếp tục nhận được ngoại lệ "Không thể thực hiện ràng buộc thời gian chạy trên một tham chiếu null" và khi tôi xem xét trình gỡ lỗi, có ngoại lệ này trên tất cả: "Mô tả: Old Format hoặc Thư viện kiểu không hợp lệ" ngay cả khi tôi đặt CurrentCulture như Microsoft đề xuất: -/ – bomortensen

+0

@bomortensen Vấn đề rất có thể là do ô của bạn trống. Tôi đã thêm một số mã vào câu trả lời của tôi sẽ kiểm tra để chắc chắn rằng một ô không trống trước khi làm bất cứ điều gì với nó. Điều đó sẽ khắc phục vấn đề – Jetti

0

cho Excel-phân tích và sáng tạo bạn có thể sử dụng ExcelDataReader: http://exceldatareader.codeplex.com/

và cho json bạn có thể sử dụng json.net: http://json.codeplex.com/

Cả hai đều khá dễ sử dụng. Chỉ cần có một cái nhìn tại các trang web.

+0

Xin chào Stephan, cảm ơn rất nhiều! :) Tôi đã thử nó, nhưng tôi nhận được một chỉ số ra khỏi giới hạn ngoại lệ ngay cả khi kết quả đếm tôi 252 :(Đã lừa xung quanh với nó một thời gian và tôi đang có một thời gian khó khăn để tìm hiểu lý do tại sao. khi tôi cố gắng tạo một GetValue (0) trên đầu đọc, tôi đã thử với các chỉ mục khác, với cùng kết quả .. – bomortensen