Форматировать столбец (или ячейку) Excel как текст в С#?
Я теряю ведущие нули, когда копирую значения из листа данных в лист Excel. Это потому, что, возможно, Excel обрабатывает значения как число, а не текст.
Я создал рабочий лист в С#, и я копирую такие значения:
myWorksheet.Cells[i + 2, j] = dtCustomers.Rows[i][j - 1].ToString();
Как мне форматировать весь столбец или каждую ячейку в виде текста? Связанный вопрос, как отличить myWorksheet.Cells[i + 2, j]
, чтобы показать свойство стиля в Intellisense?
Ответы
Ответ 1
Ниже приведен код для форматирования столбцов 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
Ответ 2
Если вы настроили форматирование ячейки на Text ранее на добавление числового значения с начальным нулем, начальный нуль сохраняется без искажения результатов, добавляя апостроф. Если вы попытаетесь вручную добавить начальное нулевое значение к листу по умолчанию в Excel, а затем преобразовать его в текст, то начальный нуль будет удален. Если вы сначала конвертируете ячейку в текст, добавьте свое значение, это нормально. Этот же принцип применяется при выполнении программно.
// Pull in all the cells of the worksheet
Range cells = xlWorkBook.Worksheets[1].Cells;
// set each cell 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();
}
}
Ответ 3
Недавно я столкнулся с этой проблемой, и я узнал две вещи об этих предложениях.
- Установка числаFormatting в @приводит к тому, что Excel слева выравнивает значение и читает его, как если бы это был текст, однако он все же усекает нулевой.
- Добавление апострофа в начале приводит к тому, что Excel обрабатывает его как текст и сохраняет нуль, а затем применяет текстовый формат по умолчанию, решая обе проблемы.
Обманчивый аспект этого заключается в том, что теперь у вас есть другое значение в ячейке. Когда вы копируете/вставляете или экспортируете в CSV, апостроф не включается.
Заключение: используйте апостроф, а не числоформирование, чтобы сохранить начальные нули.
Ответ 4
Перед записью в Excel необходимо изменить формат:
xlApp = New Excel.Application
xlWorkSheet = xlWorkBook.Sheets("Sheet1")
Dim cells As Excel.Range = xlWorkSheet.Cells
'set each cell format to Text
cells.NumberFormat = "@"
'reset horizontal alignment to the right
cells.HorizontalAlignment = Excel.XlHAlign.xlHAlignRight
Ответ 5
if (dtCustomers.Columns[j - 1].DataType != typeof(decimal) && dtCustomers.Columns[j - 1].DataType != typeof(int))
{
myWorksheet.Cells[i + 2, j].NumberFormat = "@";
}
Ответ 6
Решение, которое работало для меня в Excel Interop:
myWorksheet.Columns[j].NumberFormat = "@"; // column as a text
myWorksheet.Cells[i + 2, j].NumberFormat = "@"; // cell as a text
Этот код должен запускать до, помещая данные в Excel. Номера столбцов и строк основаны на 1.
Немного больше деталей. Принимая во внимание, что принятый ответ со ссылкой на SpreadsheetGear выглядит почти корректно, у меня было две проблемы:
- Я не использую SpreadsheetGear. Меня интересовал обычный Excel
связь через интерфейс Excel без каких-либо библиотек 3rdparty,
- Я искал способ форматирования столбца по номеру, не используя
диапазоны, такие как "A: A".
Ответ 7
Используйте 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 = "@";
Ответ 8
//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);