Форматировать столбец Excel (или ячейку) как текст в C #? - PullRequest
33 голосов
/ 15 января 2010

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

Я создал лист в C # и копирую значения следующим образом:

myWorksheet.Cells[i + 2, j] = dtCustomers.Rows[i][j - 1].ToString();

Как мне отформатировать целый столбец или каждую ячейку как текст? Связанный вопрос, как привести myWorksheet.Cells[i + 2, j], чтобы показать свойство стиля в Intellisense?

Ответы [ 9 ]

38 голосов
/ 15 января 2010

Ниже приведен код для форматирования столбцов A и C в виде текста в SpreadsheetGear для .NET , API-интерфейс которого аналогичен Excel, за исключением того факта, что SpreadsheetGear часто более строго типизирован. Не должно быть слишком сложно понять, как преобразовать это для работы с Excel / COM:

IWorkbook workbook = Factory.GetWorkbook();
IRange cells = workbook.Worksheets[0].Cells;
// Format column A as text.
cells["A:A"].NumberFormat = "@";
// Set A2 to text with a leading '0'.
cells["A2"].Value = "01234567890123456789";
// Format column C as text (SpreadsheetGear uses 0 based indexes - Excel uses 1 based indexes).
cells[0, 2].EntireColumn.NumberFormat = "@";
// Set C3 to text with a leading '0'.
cells[2, 2].Value = "01234567890123456789";
workbook.SaveAs(@"c:\tmp\TextFormat.xlsx", FileFormat.OpenXMLWorkbook);

Отказ от ответственности: я владею SpreadsheetGear LLC

13 голосов
/ 30 декабря 2013

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

        // Pull in all the cells of the worksheet
        Range cells = xlWorkBook.Worksheets[1].Cells;
        // set each cell's format to Text
        cells.NumberFormat = "@";
        // reset horizontal alignment to the right
        cells.HorizontalAlignment = XlHAlign.xlHAlignRight;

        // now add values to the worksheet
        for (i = 0; i <= dataGridView1.RowCount - 1; i++)
        {
            for (j = 0; j <= dataGridView1.ColumnCount - 1; j++)
            {
                DataGridViewCell cell = dataGridView1[j, i];
                xlWorkSheet.Cells[i + 1, j + 1] = cell.Value.ToString();
            }
        }
6 голосов
/ 06 августа 2014

Перед записью в Excel необходимо изменить формат:

xlApp = New Excel.Application
xlWorkSheet = xlWorkBook.Sheets("Sheet1")

Dim cells As Excel.Range = xlWorkSheet.Cells

'set each cell's format to Text
cells.NumberFormat = "@"

'reset horizontal alignment to the right
cells.HorizontalAlignment = Excel.XlHAlign.xlHAlignRight
4 голосов
/ 04 апреля 2012

Недавно я тоже боролся с этой проблемой и узнал две вещи о вышеупомянутых предложениях.

  1. Если задать для параметра NumberFormatting значение @, Excel выровняет значение по левому краю и прочитает его, как если бы он был текстом, однако он все еще усекает начальный ноль.
  2. Добавление апострофа в начале приводит к тому, что Excel обрабатывает его как текст и сохраняет ноль, а затем применяет текстовый формат по умолчанию, решая обе проблемы.

Вводящий в заблуждение аспект заключается в том, что теперь у вас есть другое значение в ячейке. К счастью, при копировании / вставке или экспорте в CSV апостроф не включается.

Вывод: используйте апостроф, а не форматирование числа, чтобы сохранить начальные нули.

2 голосов
/ 09 февраля 2016

Решение, которое работало для меня для Excel Interop:

myWorksheet.Columns[j].NumberFormat = "@";      // column as a text
myWorksheet.Cells[i + 2, j].NumberFormat = "@"; // cell as a text

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

Немного подробнее. Принимая во внимание, что принятый ответ со ссылкой на SpreadsheetGear выглядит почти правильно, у меня было две проблемы по этому поводу:

  1. Я не использую SpreadsheetGear. Меня заинтересовал обычный Excel общение через Excel без каких-либо сторонних библиотек,
  2. Я искал способ отформатировать столбец по номеру, не используя диапазоны как "A: A".
2 голосов
/ 19 декабря 2012
   if (dtCustomers.Columns[j - 1].DataType != typeof(decimal) && dtCustomers.Columns[j - 1].DataType != typeof(int))
   {
      myWorksheet.Cells[i + 2, j].NumberFormat = "@";
   }
1 голос
/ 30 сентября 2016

Используйте ваш WorkSheet.Columns.NumberFormat и установите его на string "@", вот пример:

Excel._Worksheet workSheet = (Excel._Worksheet)_Excel.Worksheets.Add();
//set columns format to text format
workSheet.Columns.NumberFormat = "@";

Примечание: этот текстовый формат будет применяться к вашему листу Excel!

Если вы хотите, чтобы к конкретному столбцу применялся текстовый формат, например, к первому столбцу, вы можете сделать это:

workSheet.Columns[0].NumberFormat = "@";

или применит указанный диапазон woorkSheet к текстовому формату:

workSheet.get_Range("A1", "D1").NumberFormat = "@";
0 голосов
/ 08 марта 2019

Я знаю, что этот вопрос устарел, но я бы хотел внести свой вклад.

Применение Range.NumberFormat = "@" лишь частично решит проблему:

  • Да, если вы поместите фокусв ячейке диапазона вы прочтете текст в меню формата
  • Да, данные будут выровнены по левому краю
  • Но если вы используете введите формулу, чтобы проверить тип значения в ячейке, он вернет 1, означающее число

Применение апостроф ведет себя лучше.Он устанавливает формат text , выравнивает данные по левому краю, и если вы проверяете формат значения в ячейке с использованием формулы type , он возвращает 2, означающий текст

0 голосов
/ 10 ноября 2017
//where [1] - column number which you want to make text

ExcelWorksheet.Columns[1].NumberFormat = "@";


//If you want to format a particular column in all sheets in a workbook - use below code. Remove loop for single sheet along with slight changes.

  //path were excel file is kept


     string ResultsFilePath = @"C:\\Users\\krakhil\\Desktop\\TGUW EXCEL\\TEST";

            Excel.Application ExcelApp = new Excel.Application();
            Excel.Workbook ExcelWorkbook = ExcelApp.Workbooks.Open(ResultsFilePath);
            ExcelApp.Visible = true;

            //Looping through all available sheets
            foreach (Excel.Worksheet ExcelWorksheet in ExcelWorkbook.Sheets)
            {                
                //Selecting the worksheet where we want to perform action
                ExcelWorksheet.Select(Type.Missing);
                ExcelWorksheet.Columns[1].NumberFormat = "@";
            }

            //saving excel file using Interop
            ExcelWorkbook.Save();

            //closing file and releasing resources
            ExcelWorkbook.Close(Type.Missing, Type.Missing, Type.Missing);
            Marshal.FinalReleaseComObject(ExcelWorkbook);
            ExcelApp.Quit();
            Marshal.FinalReleaseComObject(ExcelApp);
...