Изменение типа данных ячейки на Double

#c# #openxml

#c# #openxml

Вопрос:

Я использую OpenXML для создания файла Microsoft Excel. Я пытаюсь вставить переменную двойного типа (пример: 4.987456789) в Excel с помощью

 Cell cell = new Cell()
{
    CellReference = "A2",
    DataType = CellValues.String,
    CellValue = new CellValue(Convert.ToString(value))
};
  

Но, когда создается ячейка, она находится в текстовой форме, и Excel сообщает: «Число в этой ячейке отформатировано как текст или перед ним стоит апостроф». Как можно отформатировать ячейку для вставки double?

Редактировать: Извините, это double? введите, и я следую этому руководству

Комментарии:

1. Тип данных = значения ячейки. Возможно, двойное?

2. Нееет.’Формат документа. OpenXML. Электронная таблица. CellValues’ не содержит определения для ‘Double’

3. Возможно, DataType = CellValues . Число

4. Нет…. Он сказал мне (локальная переменная) double? Ошибка: наилучший перегруженный метод соответствует ‘DocumentFormat. OpenXML. Электронная таблица. Значение ячейки (строка)’ имеет некоторые недопустимые аргументы.

5. Только измените DataType значение и продолжайте передавать string -вместо Double CellValue конструктору

Ответ №1:

CellValues.Number Для меня, например, использование работает нормально :

 double? value = 4.9874567891;
Cell cell2 = new Cell()
{
    CellReference = "A2",
    DataType = CellValues.Number,
    CellValue = new CellValue(Convert.ToString(value))
};
  

Двойное значение, напечатанное в Excel без предупреждения, которое вы получили.

Комментарии:

1. Я не знаю OpenXML или C #, но мне кажется странным, что вы не можете просто присвоить номер без преобразования в строку. Например: CellValue = value разве OpenXML не работает таким образом?

2. @D_Bester Не совсем, CellValue свойству должен быть присвоен CellValue объект. И CellValue у класса нет конструктора, который принимает число напрямую

3. Спасибо, чувак. Это работает. Я только что удалил свою общую строку. Я думаю, что это источник, из-за которого возникла проблема.

4. @har07 Спасибо. Я вижу, как это работает. По сути, XML в любом случае является текстом, тогда Excel интерпретирует текст для создания электронной таблицы для пользователя. Имеет смысл.

Ответ №2:

У меня была та же проблема. Я следовал советам из различных сообщений и ответов, применяя стиль к ячейке… безуспешно.

Наконец-то я нашел причину проблемы и, следовательно, решение :

В моем цикле я вставил все данные таким же образом, т. Е. Используя InsertSharedStringItem() функцию.

Если вы таким образом вставите число в свою электронную таблицу, форматирование ячейки будет бесполезным, и ваш номер не будет рассматриваться как число.

Что вам нужно сделать, так это вставить его «напрямую».


 index =InsertSharedStringItem(myStringNumber, shareStringPart);
cell = InsertCellInWorksheet("A", 1, worksheetPart);
cell.CellValue = new CellValue(index.ToString());
cell.DataType = new EnumValue<CellValues>(CellValues.SharedString);
cell.StyleIndex = _doubleStyleId;
  

не будет работать.


 cell = InsertCellInWorksheet("A", 1, worksheetPart);
cell.CellValue = new CellValue(myStringNumber);
cell.DataType = new EnumValue<CellValues>(CellValues.Number);
cell.StyleIndex = _doubleStyleId;
  

нормально

с помощью, как писал Клэйс :

 Stylesheet styleSheet = workbook.WorkbookStylesPart.Stylesheet; 
_doubleStyleId = createCellFormat(styleSheet, null,null, UInt32Value.FromUInt32(4));
  

код для createCellFormat() можно найти здесь

Комментарии:

1. Я отредактировал свой ответ, который теперь стал более полным и полностью актуальным.

2. Ссылка на createCellFormat изменилась: lateral8.com/articles/openxml-format-excel-values.html

Ответ №3:

OpenXML всегда создает ячейку в виде встроенного текста и использует форматирование для определения правильного формата отображения в Excel. Каждому числовому формату в Excel соответствует уникальный код, и к ячейке может быть применен стиль, точно так же, как вы можете изменить стиль в Excel.

Стандарт OpenXML определяет серию кодов, которые могут быть назначены без создания пользовательской таблицы стилей.

Подразумеваемый формат для double равен 4 #,##0.00

итак, сначала вы создаете styleId:

 Stylesheet styleSheet = workbook.WorkbookStylesPart.Stylesheet; 
_doubleStyleId = createCellFormat(styleSheet, null, null, UInt32Value.FromUInt32(4));
  

затем установите идентификатор стиля для ячейки:

 cell.StyleIndex = _doubleStyleId;
  

Ответ №4:

Очень поздно для этой вечеринки, но я столкнулся с этой проблемой, и для меня решение заключалось в стандартной настройке моего локального языка, предположительно, в использовании ‘,’ в качестве десятичного разделителя

 Cell cell = new Cell() {
    DataType = CellValues.Number,
    CellValue = new CellValue(value.ToString(new CultureInfo("en-US"))) };
  

решил это для меня.