Formater une colonne Excel (ou une cellule) comme Texte en C#?
je perds les zéros de tête lorsque je copie des valeurs d'une datatable vers une feuille Excel. C'est parce que probablement Excel traite les valeurs comme un nombre au lieu du texte.
j'ai créé la feuille de travail en C# et je copie les valeurs comme ceci:
myWorksheet.Cells[i + 2, j] = dtCustomers.Rows[i][j - 1].ToString();
comment formater une colonne entière ou chaque cellule en texte? Une question connexe, Comment lancer myWorksheet.Cells[i + 2, j]
pour montrer une propriété de style à Intellisense?
8 réponses
ci-dessous est un code pour formater les colonnes A et C en texte dans Tableatgear for .NET qui a une API qui est similaire à Excel - sauf que les feuilles de calcul sont souvent plus fortement dactylographiées. Il ne devrait pas être trop difficile à comprendre comment faire pour convertir ce de travailler avec 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);
avertissement: je possède SpreadsheetGear LLC
si vous définissez le formatage de la cellule au texte avant pour l'ajout d'une valeur numérique avec un zéro, le zéro initial est conservé sans avoir à fausser les résultats en ajoutant une apostrophe. Si vous essayez d'ajouter manuellement un zéro de la valeur à une feuille par défaut dans Excel puis de le convertir en texte, le zéro est supprimé. Si vous convertissez la cellule en texte d'abord, puis ajouter votre valeur, il est très bien. Le même principe s'applique lorsqu'on le fait de façon programmatique.
// 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();
}
}
avant votre écriture à Excel besoin de changer le format:
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
j'ai récemment fait face à ce problème aussi bien, et j'ai appris deux choses au sujet des suggestions ci-dessus.
- paramétrer le numéroformatting à @ causes Excel à gauche-aligner la valeur, et la lire comme si elle était du texte, cependant, il tronque toujours le zéro de tête.
- en ajoutant une apostrophe au début, Excel la traite comme du texte et conserve le zéro, puis applique le format de texte par défaut, résolvant les deux problèmes.
L'aspect trompeur de cette est que vous avez maintenant une autre valeur dans la cellule. Par contre, lorsque vous copiez / collez ou exportez vers CSV, l'apostrophe n'est pas incluse.
Conclusion: utilisez l'apostrophe, pas le numéroformat pour conserver les zéros de tête.
if (dtCustomers.Columns[j - 1].DataType != typeof(decimal) && dtCustomers.Columns[j - 1].DataType != typeof(int))
{
myWorksheet.Cells[i + 2, j].NumberFormat = "@";
}
la Solution qui a fonctionné pour moi pour Excel Interop:
myWorksheet.Columns[j].NumberFormat = "@"; // column as a text
myWorksheet.Cells[i + 2, j].NumberFormat = "@"; // cell as a text
ce code doit êtreavant mettre les données vers Excel. Les numéros de colonne et de ligne sont basés sur 1.
Un peu plus de détails. Alors que la réponse acceptée avec référence pour le chiffrier semble presque correcte, j'ai eu deux préoccupations à ce sujet:
- je ne suis pas à l'aide de SpreadsheetGear. Je m'intéressais à Classical Excel communication à travers Excel interop sans 3rdparty bibliothèques,
- je cherchais le moyen de formater la colonne par numéro, sans utiliser des plages comme "Un"Un".
utilisez votre WorkSheet.Columns.NumberFormat
et string "@"
, voici un exemple:
Excel._Worksheet workSheet = (Excel._Worksheet)_Excel.Worksheets.Add();
//set columns format to text format
workSheet.Columns.NumberFormat = "@";
Note: ce format de texte s'appliquera à votre feuille excel de trou!
si vous voulez qu'une colonne particulière applique le format texte, par exemple, la première colonne, vous pouvez faire ceci:
workSheet.Columns[0].NumberFormat = "@";
ou cela s'applique de la gamme spécifiée de woorkSheet au format texte:
workSheet.get_Range("A1", "D1").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);