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?

28
demandé sur stema 2010-01-15 01:08:28

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

33
répondu Joe Erickson 2014-02-05 15:35:18

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();
            }
        }
13
répondu svenGUTT 2013-12-30 02:50:01

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
6
répondu sansalk 2016-07-01 15:08:13

j'ai récemment fait face à ce problème aussi bien, et j'ai appris deux choses au sujet des suggestions ci-dessus.

  1. 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.
  2. 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.

4
répondu Scott 2014-07-24 21:21:54
   if (dtCustomers.Columns[j - 1].DataType != typeof(decimal) && dtCustomers.Columns[j - 1].DataType != typeof(int))
   {
      myWorksheet.Cells[i + 2, j].NumberFormat = "@";
   }
2
répondu Arsac 2012-12-19 16:44:24

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:

  1. je ne suis pas à l'aide de SpreadsheetGear. Je m'intéressais à Classical Excel communication à travers Excel interop sans 3rdparty bibliothèques,
  2. je cherchais le moyen de formater la colonne par numéro, sans utiliser des plages comme "Un"Un".
2
répondu sarh 2016-02-08 22:41:09

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 = "@";
1
répondu Lester 2016-09-30 17:13:39
//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);
0
répondu KR Akhil 2017-11-10 06:12:25