Декомпилируйте xlsx в C # с помощью Microsoft Open XML SDK Tools.
https://www.microsoft.com/en-us/download/details.aspx?id=30425
Вы увидите, что ваши ячейки имеют тип данных SharedString.Это своего рода идентификатор, ячейка хранит идентификатор, а значения хранятся в таблице sharedstring.Эти странные числа, которые вы видите после изменения типа даты, являются этими идентификаторами в таблице sharedstring.Изменение DataType на самом деле не меняет способ хранения значений, а меняет их интерпретацию.Они по-прежнему будут «Число хранится как строка», если вы измените его тип на числовой.Например, давайте посмотрим на ячейку "E17":
Cell cell261 = new Cell(){ CellReference = "E17", StyleIndex = (UInt32Value)11U, DataType = CellValues.SharedString };
CellValue cellValue90 = new CellValue();
cellValue90.Text = "26";
... Должно быть 50000, не так ли?
SharedStringItem sharedStringItem27 = new SharedStringItem();
Text text45 = new Text();
text45.Text = "50000";
sharedStringItem27.Append(text45);
Чтобы прочитать правильное значение из таблицы, вынеобходимо использовать код GetCellValue из примера MS Docs.
https://docs.microsoft.com/en-us/office/open-xml/how-to-retrieve-the-values-of-cells-in-a-spreadsheet
Затем вы можете написать следующий код для чтения реальных значений ячеек (я немного изменил его и передал документ вместо пути к файлу) проанализируйте его и сохраните в десятичном виде:
var value = GetCellValue(d, "Sheet1", cellRef.CellReference);
if (!string.IsNullOrEmpty(value))
{
if (decimal.TryParse(value, out decimal val))
{
cellRef.CellValue = new
CellValue(DocumentFormat.OpenXml.DecimalValue.FromDecimal(val));
cellRef.StyleIndex = 0U;
}
}
StyleIndex 0U представляется общим форматом, но поскольку у вас правильный тип ячейки, это не имеет значения.Хотя я до сих пор не понял, почему формулы = суммы не вычисляются при открытии фиксированного xlsx.