Excel не вставляет начальный ноль

Я использую Office OpenXml для записи в файл Excel. Файл является шаблоном, поэтому в нем уже есть все мои заголовки и форматирование для моих столбцов. Я вставляю числа с ведущими нулями в «специальный» столбец, который в основном представляет собой 10-значное число. Однако в моем коде я вижу, что он устанавливает значение, например, 0000000004. Результат на листе со значением 4 в этой ячейке и фактической ячейкой, показывающей 0000000004.

Вот мой код для записи в ячейку.

  if (reader[2].ToString().Length < 9)
  {


        myworksheet.Cell(firstrow, 12).Value = reader[2].ToString(); //0045678945

  }
  else
  {
        myworksheet.Cell(firstrow, 12).Value = reader[2].ToString().Substring(0, 9); //0045678945

  }

когда я открываю лист Excel, как я указал выше, мое значение равно 45678945 вместо 0045678945

Любая помощь будет оценена по достоинству.


person user541597    schedule 28.02.2013    source источник
comment
Вы пытались выполнить некоторую проверку значения внутри Excel? Может быть, написать макрос, который анализирует введенное значение, чтобы убедиться, что оно имеет правильное количество символов, и добавляет ведущие нули, если оно не соответствует вашим критериям. Возможно, даже определить пользовательский тип данных для этого столбца.   -  person sean_m    schedule 01.03.2013
comment
Можете ли вы объяснить, что делает ваш код в приведенном выше примере, чтобы добавить нули? Похоже, вы установите в ячейке значение строки, когда длина меньше 9 - как сделать так, чтобы в этой строке отображались нули?   -  person Floris    schedule 01.03.2013


Ответы (5)


Если я правильно понимаю:

Excel показывает числа с начальными нулями, читая их с С# через OOXML, вы не видите начальных нулей.

Скорее всего, Excel устанавливает некоторые правила форматирования вместо того, чтобы хранить фактические начальные нули.

Несколько способов противостоять этому. Вот самые «дешевые», которые приходят на ум, выберите один:

  • отформатировать столбец в Excel как текст
  • в коде C# не ожидайте начальных нулей и вместо этого добавляйте их
person Sten Petrov    schedule 28.02.2013
comment
Excel не показывает начальный нуль, когда лист создан с помощью OOXML. - person user541597; 01.03.2013
comment
@user541597 user541597, тогда, изменив мой ответ, вы можете установить тип столбца на текст из OOXML, чтобы Excel не пытался его интерпретировать. - person Sten Petrov; 01.03.2013

Самый простой способ получить желаемый результат - добавить апостроф к значению, которое вы поместили в ячейку - это сообщает Excel, что это строка:

Cell.Value= "'" & "000123"

Будет отображаться как 000123

Вот немного кода, чтобы показать, как все работает (по крайней мере, как это работает для меня в Excel 2010):

Sub testFormat()
[A1].Value = "000123"
[A2].Value = "'000123"
[A3].Value = "000123"
[A3].NumberFormat = "@"
[A4].Value = "'000123"
[A4].NumberFormat = "@"
End Sub

Результат этого таков:

форматирование с ведущими нулями

Как видите, есть три ячейки, в которых показаны начальные нули:

  1. Ячейка, в которую я ввел строку с апострофом впереди
  2. Ячейка, отформатированная в формате "@" ("текст")
  3. Ячейка с апострофом И форматированием текста

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

person Floris    schedule 28.02.2013
comment
Очень странно - я добавил еще несколько примеров того, как это работает у меня. Надеюсь, поможет! - person Floris; 01.03.2013

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

person GordonsBeard    schedule 28.02.2013
comment
уже установил для ячеек текст, однако он все еще усекает начальный ноль. - person user541597; 01.03.2013
comment
Усекаются ли нули перед тем, как они будут помещены в Excel? В этом случае вам может потребоваться изменить код C#, который получает информацию. - person GordonsBeard; 01.03.2013
comment
Нет, я отлаживал код, который помещается в Excel, и там есть нули. - person user541597; 01.03.2013

Я считаю, что если вы установите DataType ячейки либо в String, либо в SharedString, ведущие 0 будут сохранены. Excel увидит это как текст и просто обработает значение буквально, не пытаясь применить какие-либо правила форматирования.

cell.DataType = new EnumValue<CellValues>( CellValues.SharedString );

ИЛИ cell.DataType = new EnumValue( CellValues.String );

person MadMoai    schedule 03.10.2013

Если вы используете DataTable, вам нужно взять другую DataTable, а затем вам нужно перебрать целые ячейки в datatable и добавить текст ячеек с пробелом, т.е. с « ». Мы не можем изменить строки в той же таблице, потому что это будет выдать исключение, говорящее: «Коллекция была изменена». Мы должны взять новую таблицу данных.

Рассмотрим следующий код.

    //To get the result with leading zero's in excel this code is written.
    DataTable dtUpdated=new DataTable();
    //This gives similar schema to the new datatable
    dtUpdated = dtReports.Clone();
        foreach (DataRow row in dtReports.Rows)
        {
            for (int i = 0; i < dtReports.Columns.Count; i++)
            {
                string oldVal = row[i].ToString();
                string newVal = "&nbsp;"+oldVal;
                row[i] = newVal;
            }
            dtUpdated.ImportRow(row); 
        }

Мы можем привязать эту обновленную таблицу к сетке данных, чтобы ее можно было использовать для преобразования Excel.

person Deepak Kothari    schedule 16.01.2014