#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"))) };
решил это для меня.