Nano Hash - криптовалюты, майнинг, программирование

Можно ли получить int из Range.Value в VSTO?

У меня есть надстройка VSTO, и я читаю данные с листа Excel.

Кажется, что почти все числовые данные читаются как double. Можно ли когда-нибудь получить значение int из Range.Value?

Вот некоторый код, чтобы продемонстрировать, что я имею в виду.

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;

Независимо от того, какой формат я использую на листе Sheet1, ячейка A1, isInt всегда возвращается false.

Есть ли какой-то формат, который я должен использовать для получения int? Я думал, может быть, General или 0 сработают, но, похоже, нет.

09.07.2012

  • Я не думаю, что вы когда-нибудь получите int - Excel никогда не хранит числа как int внутри, всегда как двойное число. 09.07.2012
  • @Govert Хорошо, это то, что я подозревал, но я хотел подтверждения. Если вы опубликуете ответ (желательно с источником об этом лакомом кусочке Excel), я приму его. 09.07.2012

Ответы:


1

Из документов при вызове var value = ((Range)w.Cells[1,1]).Value тип Value является производным от типа значения из рабочего листа. Таким образом, может показаться, что на вашем листе Excel значения отформатированы как doubles, а не ints. Для Excel не существует «целочисленного» форматирования, которое будет преобразовано в C#, лучше всего было бы преобразовать значение как integer, когда вы его читаете. Тип Value приходит в любом формате, который он был на листе Excel.

В этой статье показано, как Excel обрабатывает значения двойной точности с плавающей запятой.

09.07.2012
  • Верно, но мой вопрос по существу: какой формат рабочего листа даст мне int? Общие, Числа без десятичных знаков, Текст, Бухгалтерский учет дают мне двойные значения. Я что-то пропустил или такого формата нет? 09.07.2012
  • Ах, небольшое исследование показывает, что числа всегда хранятся в Excel как двойные числа. Вы можете создать собственный формат, который выглядит как int на листе, но когда вы запрашиваете значения из C#, они будут возвращены как двойные. Если вы сделаете это, хотя вы можете гарантировать, что значения (как двойные) будут действительно целыми числами, тогда вы можете просто привести их к типу int. 09.07.2012
  • Понятно. Можете ли вы предоставить источник о том, что в Excel хранятся только двойные числа? 09.07.2012
  • @ root45 Я не смог найти источник, в котором конкретно говорится об этом, я отредактировал свой ответ тем, в котором говорится о том, как они хранятся, однако подтекст есть. На самом деле это не удваивается, а скорее Excel имеет то, что он называет просто числом, которое хранит число в значении двойной точности с плавающей запятой. 09.07.2012

  • 2

    Числовые значения, возвращаемые Range.Value, являются двойными (возможно, из-за того, что все они хранятся как двойные в Excel, число, похожее на целое число или нет, является результатом форматирования)

    Единственные целые числа, которые я видел через GetValue, — это ErrorCodes для ошибок.

    например

    • ДЕЛ/0! является Int32 со значением -2146826281
    09.07.2012

    3

    Говерт прав, говоря, что Excel никогда не хранит числа как целые числа.

    Excel хранит числовые значения в виде Double Precision Floating Point чисел, или, как вы знаете, Doubles для краткости.

    Doubles — это 8-байтовые переменные, которые могут хранить числа с точностью примерно до 15 знаков после запятой.

    ИЗМЕНИТЬ:

    Поскольку вы ищете ссылку, см.

    Ссылка: http://support.microsoft.com/kb/78113

    09.07.2012

    4

    Я почти уверен, что все числа удваиваются в Excel. Например, следующий код VBA устанавливает значение ячейки в длинное целое число (Int32), а затем считывает его обратно.

    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)
    
    • Вход: VarType(n) = 3 = vbLong (Int32)
    • Выход: VarType(v) = 5 = vbDouble
    09.07.2012
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..