Net core с Open XML. В моем Excel значение 100%. Я пытаюсь читать, как показано ниже
Метод GetCellValue
public static string GetCellValue(SpreadsheetDocument doc, Cell cell)
{
if (cell.CellValue != null)
{
string value = cell.CellValue.InnerText;
if (cell.DataType != null && cell.DataType.Value == CellValues.SharedString)
{
return doc.WorkbookPart.SharedStringTablePart.SharedStringTable.ChildElements.ElementAt(int.Parse(value)).InnerText;
}
else
{
return value;
}
}
return string.Empty;
}
метод GetCell
public static Cell GetCell(Worksheet worksheet, string columnName, uint rowIndex)
{
Row row = worksheet.GetFirstChild<SheetData>().Elements<Row>().FirstOrDefault(r => r.RowIndex == rowIndex);
if (row != null)
{
return row.Elements<Cell>().FirstOrDefault(c => string.Compare(c.CellReference.Value, columnName + rowIndex, true) == 0);
}
return null;
}
Я читаю, как показано ниже.
var data = OpenXmlReader.GetCellValue(spreadsheetDocument, OpenXmlReader.GetCell(workSheet, "E", 11));
Данные поступают как 1, тогда как фактическое значение в моем Excel составляет 100%. Я не уверен, почему это не читается должным образом. Может кто-нибудь помочь мне? Любая помощь будет оценена по достоинству. Спасибо
В Excel формат отображения ячеек и фактический формат хранимых данных могут отличаться. Когда вы вводите 75% в ячейку, отформатированную в процентах, Excel сохраняет его в десятичном виде, но при отображении оно по-прежнему отображается в процентах.
Мы можем прочитать настроенный таким образом формат из Open XML и увидеть, что чтение NumberFormatId
равно 43, а FormatCode
— это "_ * #,##0.00_ ;_ * \\-#,##0.00_ ;_ * \"-\"??_ ;_ @_ "
Однако этот формат не найден в предопределенном списке NumberFormatId . Таким образом, мы можем установить соответствующий формат для возвращаемого значения, используя OpenXml. Вот пример, который вы можете использовать в качестве справки:
public static string GetCellValue(SpreadsheetDocument doc, Cell cell)
{
if (cell.CellValue != null)
{
string value = cell.CellValue.InnerText;
if (cell.DataType != null && cell.DataType.Value == CellValues.SharedString)
{
return doc.WorkbookPart.SharedStringTablePart.SharedStringTable.ChildElements.ElementAt(int.Parse(value)).InnerText;
}
else if (cell.StyleIndex != null)
{
var styleIndex = (int)cell.StyleIndex.Value;
var cellFormat = (NumberingFormat)doc.WorkbookPart.WorkbookStylesPart.Stylesheet.NumberingFormats.ElementAt(styleIndex);
var numberFormat = doc.WorkbookPart.WorkbookStylesPart.Stylesheet.NumberingFormats.Elements<NumberingFormat>()
.Where(i => i.NumberFormatId.ToString() == cellFormat.NumberFormatId.ToString()).FirstOrDefault().FormatCode;
if (numberFormat != null )
{
var cellValue = double.Parse(value);
value = (cellValue * 100).ToString("0.00") + "%";
}
}
return value;
}
return string.Empty;
}
Возвратные данные:
Посмотрите здесь