2009-05-22 30 views
11

Tôi đang sử dụng lớp OleDbConnection để lấy dữ liệu từ một bảng tính Excel 2000/2003:Excel tế bào-giá trị được cắt ngắn bởi OLEDB-nhà cung cấp

string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + 
          "Data Source=" + filename + ";" + 
          "Extended Properties=\"Excel 8.0;IMEX=1\";"; 

OleDbConnection connection = new OleDbConnection(connectionString); 
connection.Open(); 

// code to get table name from schema omitted 

var dataAdapter = new OleDbDataAdapter(string.Format("SELECT * FROM [{0}]", name),connection); 
var myDataSet = new DataSet(); 
dataAdapter.Fill(myDataSet, "ExcelInfo"); 

Bây giờ nó chỉ ra rằng các tế bào trong bảng tính với chiều dài lớn hơn hơn 255 ký tự đang bị cắt ngắn. Đây có phải là một hạn chế trong nhà cung cấp Microsoft.Jet.OLEDB hay là tôi có thể làm gì với nó?

Bất kỳ ai?

Trả lời

17

Nhà cung cấp OLEDB cho excel sẽ cố gắng tự động xác định DataTypes dựa trên 8 hàng dữ liệu đầu tiên, điều này có thể được thiết lập với thuộc tính HDR = Yes/No trong chuỗi kết nối. Ngoài ra, có nhiều loại mà nó có thể áp dụng cho các cột văn bản. Loại bản ghi nhớ chứa hơn 255 ký tự, vì vậy nếu không có 8 hàng đầu tiên nào có thì nó sẽ đặt không đúng kiểu dữ liệu.

Cách thay đổi này là bằng cách thay đổi một thiết lập registry gọi TypeGuessRows, như mô tả ở đây: Microsoft Support

Chú ý: Phạm vi hợp lệ của các giá trị cho khóa TypeGuessRows là từ 0 đến 16. Tuy nhiên, nếu giá trị là 0 , số lượng các hàng nguồn được quét là 16384. Vì vậy, nếu bạn có một tệp rất lớn, hãy đảm bảo các hàng lớn nhất trước tiên.

+1

Cảm ơn. Đó là một giải pháp hơi xấu, vì trình cài đặt của tôi sẽ phải sửa đổi sổ đăng ký của người dùng, nhưng tôi hy vọng nó sẽ hoạt động. Vì vậy, miễn là một quản trị viên chạy trình cài đặt .. –

+1

tôi không hiểu microsofts gợi ý ở đây/nếu bạn thay đổi nó đến 16 không nó chỉ cần kiểm tra 16 hàng đầu tiên ?? – leora

+1

@ooo Nếu bạn thay đổi nó thành 0, sau đó nó quét tất cả các hàng. Hãy cẩn thận mặc dù điều này có thể có tác động hiệu suất trên các bảng lớn hơn. – rmoore

1

Hãy thử điều này OleDBAdapter Excel QA Tôi đã đăng qua tràn ngăn xếp.

Tôi dân cư một ô bảng (Rows [0] [4]) w/445 ký tự và nó làm việc tốt ... Thêm phần này vào phần cuối của mã cho ouput

// DataSet:   
Object row0Col3 = ds.Tables["xlsImport"].Rows[0][2]; 
Object row0Col4 = ds.Tables["xlsImport"].Rows[0][4]; 

string rowZeroColumn3 = row0Col3.ToString(); 
string rowZeroColumn4 = row0Col4.ToString(); 

Console.WriteLine("Row 0, Col 4 string length: {0} " + Environment.NewLine + "Excel content: {1}", rowZeroColumn4.Length, rowZeroColumn4);   
Các vấn đề liên quan