2012-07-09 26 views
5

Tôi có phần bổ trợ VSTO và tôi đang đọc dữ liệu từ trang tính Excel.Có thể lấy int từ Range.Value trong VSTO không?

Dường như hầu như tất cả dữ liệu số được đọc là double. Có bao giờ có thể nhận được giá trị int từ Range.Value không?

Dưới đây là một số mã để minh họa ý tôi.

Worksheet w = (Worksheet)Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets["Sheet1"]; 
var value = ((Range)w.Cells[1, 1]).Value; 
bool isInt = value is int; 
bool isDouble = value is double; 

Bất kể định dạng nào tôi sử dụng trong trang tính Bảng1, ô A1, isInt luôn quay trở lại sai.

Có định dạng nào tôi nên sử dụng để nhận int không? Tôi nghĩ có lẽ General hoặc 0 sẽ hoạt động, nhưng có vẻ như không.

+1

Tôi không nghĩ rằng bạn muốn bao giờ có được một int - Excel không bao giờ lưu trữ các số như là một int nội bộ, luôn luôn là một đôi. – Govert

+0

@Govert Được rồi, đó là những gì tôi nghi ngờ nhưng tôi muốn xác nhận. Nếu bạn đăng một câu trả lời (tốt nhất là với một nguồn thông tin về Tidbit của Excel), tôi sẽ chấp nhận nó. –

Trả lời

0

Từ docs khi bạn gọi var value = ((Range)w.Cells[1,1]).Value loại Value có nguồn gốc từ loại giá trị từ Bảng tính. Vì vậy, có vẻ như bảng tính Excel của bạn có các giá trị được định dạng là doubles, không phải là int s. Không có định dạng "số nguyên" cho Excel sẽ dịch sang C#, đặt cược tốt nhất sẽ là truyền giá trị dưới dạng integer khi bạn đọc nó. Loại Value có bất kỳ định dạng nào trong bảng tính Excel.

This article cho biết cách Excel xử lý các giá trị dấu phẩy động chính xác kép.

+0

Đúng, nhưng câu hỏi của tôi về cơ bản là "Định dạng bảng tính nào sẽ cho tôi' int'? " Nói chung, số không có số thập phân, văn bản, kế toán tất cả cho tôi tăng gấp đôi. Tôi có thiếu cái gì đó hay không có định dạng như vậy? –

+1

Ah, thực hiện một nghiên cứu nhỏ cho thấy có vẻ như những con số này luôn được lưu trữ gấp đôi trong Excel. Bạn có thể tạo một định dạng tùy chỉnh _looks_ như một int trong trang tính, nhưng khi bạn truy vấn các giá trị từ C#, chúng sẽ được trả về gấp đôi. Nếu bạn làm điều này mặc dù bạn có thể đảm bảo rằng các giá trị (như tăng gấp đôi) sẽ ** thực sự ** là số nguyên, thì bạn chỉ có thể truyền dưới dạng int. – NominSim

+0

OK. Bạn có thể cung cấp nguồn về chỉ tăng gấp đôi được lưu trữ trong Excel không? –

2

Các giá trị số được trả về bởi Range.Value là đôi (có thể vì họ đều được lưu trữ như tăng gấp đôi trong Excel, một số trông giống như một số nguyên hay không là kết quả của định dạng)

Các ints duy nhất mà tôi đã thấy đến qua GetValue là Mã lỗi cho lỗi

ví dụ

  • DIV/0! là một Int32 có giá trị là -2146826281
1

Govert đúng khi nói Excel không bao giờ lưu trữ số làm số nguyên.

Excel lưu trữ các giá trị số dưới dạng số Double Precision Floating Point hoặc như bạn biết Doubles cho ngắn.

Doubles là các biến 8 byte có thể lưu trữ số chính xác đến khoảng 15 chữ số thập phân.

EDIT:

Vì bạn đang tìm kiếm một liên kết, xem này

Link: http://support.microsoft.com/kb/78113

1

Tôi khá chắc chắn rằng tất cả các số là đôi trong Excel. Ví dụ, mã VBA sau đặt giá trị ô thành một số nguyên dài (Int32), sau đó đọc lại nó.

Dim n As Long 
n = 123 
Range("A1").Value = n 
Debug.Print VarType(n) 

Dim v As Variant 
v = Range("A1").Value 
Debug.Print VarType(v) 
  • Input là VarType (n) = 3 = vbLong (Int32)
  • Output là VarType (v) = 5 = vbDouble
Các vấn đề liên quan