c # open xml переформатирует существующую ячейку в число - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть существующая таблица.Я хотел бы переформатировать некоторые ячейки от general или custom до Number.Но по какой-то причине, когда я переформатирую их для нумерации, значения ячеек меняются на случайные числа.

Вот как выглядит мой код

           using (var d = SpreadsheetDocument.Open(_docPath, true))
            {
                var workSheet = GetWorksheetPart(d.WorkbookPart.Workbook.WorkbookPart, "Project Summary");

                foreach (var cellRef in _ProjectRequirementsFormService.NumberCellReferences)
                {
                    Cell theCell = workSheet.Worksheet.Descendants<Cell>().Where(c => c.CellReference == cellRef).FirstOrDefault();
                    if (theCell != null) {
                        //For some reason This line of code replaces the cell value with a value 5197
                        //and every iteration of the loop increments the value of the next cell found 5198, 5199, etc....
                        theCell.DataType = CellValues.Number;
                    }
                }
...
}

    public WorksheetPart GetWorksheetPart(WorkbookPart workbookPart, string sheetName)
    {
        string relId = workbookPart.Workbook.Descendants<Sheet>().First(s => sheetName.Equals(s.Name)).Id;
        return (WorksheetPart)workbookPart.GetPartById(relId);
    }

Теперь по какой-то причине Эта строка кода theCell.DataType = CellValues.Number; заменяет значение ячейки значением 5197, и каждая итерация цикла увеличивает значение следующей найденной ячейки 5198, 5199 и т. Д. *

Когда я комментирую эту дефектную строку, я получаю правильные значенияв ячейке, но формат не является Number

enter image description here

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

enter image description here

Ссылка на файл примера

https://drive.google.com/file/d/0B7UImeY4gR3VdnBBZmdWSHJqN2lhRmFqY1N6THJXNmIzZDhF/view?usp=sharing

1 Ответ

0 голосов
/ 19 сентября 2018

Декомпилируйте 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.

...