2013-02-28 4 views
2

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

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

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 

    } 

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

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

+0

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

+0

Можете ли вы объяснить, что делает ваш код в приведенном выше примере, чтобы вызвать добавление нулей? Похоже, что вы установите ячейку на значение строки, когда длина меньше 9 - как вы делаете нули в этой строке? – Floris

ответ

1

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

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

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

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

  • формат, в котором столбец в Excel в виде текста
  • в C# код не ожидают ведущие нули и вместо того, чтобы добавить их
+0

Excel Не показывает лидирующий ноль при создании листа с помощью OOXML. – user541597

+0

@ user541597, то, изменив мой ответ, вы можете установить тип столбца в текст из OOXML, чтобы Excel не пытался его интерпретировать. –

0

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

+0

уже установил ячейки в текст, однако он все еще обрезает начальный нуль. – user541597

+0

Усечены ли нули до того, как они попадут в Excel? Возможно, вам придется изменить код C#, который получает информацию в этом случае. – GordonsBeard

+0

Нет. Я отлаживал код, который помещается в Excel, и нули есть. – user541597

6

Самый простой способ, чтобы получить результат, который вы хотите, чтобы предварять апостроф к значению вы положили в ячейку - это говорит 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 

результат этого заключается в следующем:

formatting with leading zeros

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

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

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

+0

попробовал это, но на самом деле он помещает апостроф в значение. – user541597

+0

Очень странно - я добавил еще несколько примеров того, как это работает для меня. Надеюсь, поможет! – Floris

0

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

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

ИЛИ cell.DataType = новый EnumValue (CellValues.String);

0

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

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

//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); 
     } 

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