texto - dar formato a una hoja de excel desde c#
¿Formatea una columna de Excel(o una celda) como Texto en C#? (8)
A continuación se muestra un código para formatear las columnas A y C como texto en SpreadsheetGear para .NET que tiene una API que es similar a Excel, excepto por el hecho de que SpreadsheetGear con frecuencia se tipea con más fuerza. No debería ser demasiado difícil descubrir cómo convertir esto para trabajar con 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);
Descargo de responsabilidad: soy dueño de SpreadsheetGear LLC
Estoy perdiendo los ceros a la izquierda cuando copio valores de una tabla de datos en una hoja de Excel. Eso es porque probablemente Excel trate los valores como un número en lugar de texto.
Creé la hoja de trabajo en C # y estoy copiando los valores de esta manera:
myWorksheet.Cells[i + 2, j] = dtCustomers.Rows[i][j - 1].ToString();
¿Cómo formateo una columna completa o cada celda como texto? Una pregunta relacionada, ¿cómo lanzar myWorksheet.Cells[i + 2, j]
para mostrar una propiedad de estilo en Intellisense?
Antes de escribir en Excel necesita cambiar el formato:
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
Recientemente también he luchado con este problema y he aprendido dos cosas sobre las sugerencias anteriores.
- Establecer el número de formato en @ hace que Excel alinee a la izquierda el valor, y lo lea como si fuera texto, sin embargo, aún trunca el cero inicial.
- Agregar un apóstrofo al principio hace que Excel lo trate como texto y retiene el cero, y luego aplica el formato de texto predeterminado, resolviendo ambos problemas.
El aspecto engañoso de esto es que ahora tiene un valor diferente en la celda. Afortunadamente, al copiar / pegar o exportar a CSV, el apóstrofo no está incluido.
Conclusión: utilice el apóstrofo, no el número de formato para retener los ceros a la izquierda.
Si establece el formato de celda en Texto antes de agregar un valor numérico con un cero inicial, el cero inicial se conserva sin tener que sesgar los resultados al agregar un apóstrofo. Si intenta y agrega manualmente un valor cero inicial a una hoja predeterminada en Excel y luego lo convierte en texto, se elimina el cero inicial. Si convierte la celda a Texto primero, luego agregue su valor, está bien. El mismo principio se aplica al hacerlo programáticamente.
// 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();
}
}
Solución que funcionó para Excel Interop:
myWorksheet.Columns[j].NumberFormat = "@"; // column as a text
myWorksheet.Cells[i + 2, j].NumberFormat = "@"; // cell as a text
Este código debería ejecutarse antes de poner datos en Excel. Los números de columnas y filas están basados en 1.
Un poco más detalles. Mientras que la respuesta aceptada con referencia para SpreadsheetGear parece casi correcta, tenía dos preocupaciones al respecto:
- No estoy usando SpreadsheetGear. Me interesaba la comunicación regular de Excel a través de interoperabilidad de Excel sin ninguna biblioteca de terceros,
- Estaba buscando la forma de formatear columna por número, sin usar rangos como "A: A".
Use su WorkSheet.Columns.NumberFormat
, y WorkSheet.Columns.NumberFormat
en la string "@"
, aquí está la muestra:
Excel._Worksheet workSheet = (Excel._Worksheet)_Excel.Worksheets.Add();
//set columns format to text format
workSheet.Columns.NumberFormat = "@";
Nota: este formato de texto se aplicará a la hoja de Excel de tu agujero.
Si desea que una columna en particular aplique el formato de texto, por ejemplo, la primera columna, puede hacer esto:
workSheet.Columns[0].NumberFormat = "@";
o esto aplicará el rango especificado de woorkSheet a formato de texto:
workSheet.get_Range("A1", "D1").NumberFormat = "@";
if (dtCustomers.Columns[j - 1].DataType != typeof(decimal) && dtCustomers.Columns[j - 1].DataType != typeof(int))
{
myWorksheet.Cells[i + 2, j].NumberFormat = "@";
}
//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);