web-dev-qa-db-fra.com

Mettre en forme une colonne (ou une cellule) Excel en tant que texte en C #?

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? 

29
Tony_Henrich

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

34
Joe Erickson

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();
            }
        }
13
svenGUTT

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
6
sansalk

J'ai récemment combattu ce problème également et j'ai appris deux choses sur les suggestions ci-dessus. 

  1. Si vous définissez numberFormatting sur @, Excel aligne la valeur à gauche et la lit comme s'il s'agissait de texte. Toutefois, il tronque toujours le zéro non significatif. 
  2. Si vous ajoutez une apostrophe au début, Excel le traite en tant que texte et conserve le zéro, puis applique le format de texte par défaut, ce qui résout les deux problèmes. 

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.

4
Scott

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:

  1. Je n'utilise pas SpreadsheetGear. Je me suis intéressé à Excel Communication régulière via Excel interop sans aucune bibliothèque tierce partie,
  2. Je cherchais le moyen de formater la colonne par numéro, en n’utilisant pas les plages Comme "A: A".
2
sarh
   if (dtCustomers.Columns[j - 1].DataType != typeof(decimal) && dtCustomers.Columns[j - 1].DataType != typeof(int))
   {
      myWorksheet.Cells[i + 2, j].NumberFormat = "@";
   }
2
Arsac

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 = "@";
1
Lester
//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
KR Akhil