Je perds les zéros non significatifs lorsque je copie des valeurs d'un fichier datable dans une feuille Excel. En effet, Excel traite probablement les valeurs sous forme de nombre et non de texte.
J'ai créé la feuille de calcul en C # et je copie les valeurs comme suit:
myWorksheet.Cells[i + 2, j] = dtCustomers.Rows[i][j - 1].ToString();
Comment formater une colonne entière ou chaque cellule en tant que texte? Une question connexe, comment attribuer myWorksheet.Cells[i + 2, j]
pour afficher une propriété de style dans Intellisense?
Vous trouverez ci-dessous un code permettant de formater les colonnes A et C sous forme de texte dans SpreadsheetGear for .NET qui possède une API similaire à Excel, à la différence que SpreadsheetGear est fréquemment plus typé. Il ne devrait pas être trop difficile de comprendre comment convertir cela en 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);
Disclaimer: Je possède SpreadsheetGear LLC
Si vous définissez la mise en forme de la cellule sur Texte prior pour ajouter une valeur numérique avec un zéro, le zéro restant est conservé sans avoir à biaiser les résultats en ajoutant une apostrophe. Si vous essayez d'ajouter manuellement une valeur zéro de début à une feuille par défaut dans Excel, puis de la convertir en texte, le zéro de début est supprimé. Si vous convertissez d'abord la cellule en texte, puis ajoutez votre valeur, tout va bien. Le même principe s'applique lorsque vous le faites par programmation.
// 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 d’écrire sur Excel, vous devez modifier 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 combattu ce problème également et j'ai appris deux choses sur les suggestions ci-dessus.
L'aspect trompeur de ceci est que vous avez maintenant une valeur différente dans la cellule. Heureusement, lorsque vous copiez/collez ou exportez au format CSV, l'apostrophe n'est pas incluse.
Conclusion: utilisez l'apostrophe, pas le numberFormatting afin de conserver les zéros de tête.
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 être exécuté avant mettre les données dans Excel. Les numéros de colonne et de ligne sont à 1.
Un peu plus de détails. Alors que la réponse acceptée avec référence à SpreadsheetGear semble presque correcte, je craignais deux choses:
if (dtCustomers.Columns[j - 1].DataType != typeof(decimal) && dtCustomers.Columns[j - 1].DataType != typeof(int))
{
myWorksheet.Cells[i + 2, j].NumberFormat = "@";
}
Utilisez votre WorkSheet.Columns.NumberFormat
et réglez-le sur string "@"
, voici l'exemple:
Excel._Worksheet workSheet = (Excel._Worksheet)_Excel.Worksheets.Add();
//set columns format to text format
workSheet.Columns.NumberFormat = "@";
Remarque: ce format de texte s'appliquera à votre feuille Excel trouée!
Si vous souhaitez qu'une colonne particulière applique le format de texte, par exemple la première colonne, procédez comme suit:
workSheet.Columns[0].NumberFormat = "@";
ou cela appliquera la plage 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);