wake-up-neo.com

Formatieren einer Excel-Spalte (oder Zelle) als Text in C #?

Ich verliere die führenden Nullen, wenn ich Werte von einer Datentabelle in eine Excel-Tabelle kopiere. Das liegt daran, dass Excel die Werte wahrscheinlich nicht als Text, sondern als Zahl behandelt.

Ich habe das Arbeitsblatt in C # erstellt und kopiere die Werte wie folgt:

myWorksheet.Cells[i + 2, j] = dtCustomers.Rows[i][j - 1].ToString();

Wie formatiere ich eine ganze Spalte oder jede Zelle als Text? Eine verwandte Frage, wie myWorksheet.Cells[i + 2, j] umgewandelt werden soll, um eine Stileigenschaft in Intellisense anzuzeigen? 

29
Tony_Henrich

Nachfolgend finden Sie Code zum Formatieren der Spalten A und C als Text in SpreadsheetGear für .NET , das über eine API verfügt, die der von Excel ähnelt - mit der Ausnahme, dass SpreadsheetGear häufig stärker typisiert wird. Es sollte nicht zu schwer sein, herauszufinden, wie dies für die Arbeit mit Excel/COM konvertiert werden kann:

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);

Haftungsausschluss: Ich besitze SpreadsheetGear LLC

34
Joe Erickson

Wenn Sie die Zellenformatierung auf Text prior setzen, um einen numerischen Wert mit einer führenden Null hinzuzufügen, wird die führende Null beibehalten, ohne dass Sie die Ergebnisse durch Hinzufügen eines Apostroph verzerren müssen. Wenn Sie versuchen, einem Standardblatt in Excel einen führenden Nullwert manuell hinzuzufügen und ihn dann in Text umzuwandeln, wird der führende Nullpunkt entfernt. Wenn Sie die Zelle zuerst in Text konvertieren, fügen Sie Ihren Wert hinzu, es ist in Ordnung. Dasselbe Prinzip gilt, wenn es programmgesteuert gemacht wird. 

        // 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

Bevor Sie in Excel schreiben, müssen Sie das Format ändern:

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

Ich habe kürzlich auch mit diesem Problem gekämpft, und ich habe zwei Dinge über die oben genannten Vorschläge gelernt. 

  1. Wenn Sie numberFormatting auf @ setzen, wird der Wert von Excel nach links ausgerichtet und als Text interpretiert. Die führende Null wird jedoch abgeschnitten. 
  2. Wenn Sie am Anfang einen Apostroph hinzufügen, wird der Text von Excel als Text behandelt und die Null beibehalten. Anschließend wird das Standardtextformat angewendet, wodurch beide Probleme gelöst werden. 

Der irreführende Aspekt dabei ist, dass Sie jetzt einen anderen Wert in der Zelle haben. Beim Kopieren/Einfügen oder Exportieren nach CSV ist der Apostroph leider nicht enthalten.

Fazit: Verwenden Sie den Apostroph, nicht die Zahlformatierung, um die führenden Nullen beizubehalten.

4
Scott

Lösung, die für mich bei Excel Interop funktioniert hat:

myWorksheet.Columns[j].NumberFormat = "@";      // column as a text
myWorksheet.Cells[i + 2, j].NumberFormat = "@"; // cell as a text

Dieser Code sollte vor dem Einfügen von Daten in Excel ausgeführt werden. Spalten- und Zeilennummern basieren auf 1.

Ein bisschen mehr Details. Während die akzeptierte Antwort mit Bezug für SpreadsheetGear fast richtig aussieht, hatte ich zwei Bedenken:

  1. Ich benutze nicht SpreadsheetGear. Ich interessierte mich für die regelmäßige Kommunikation mit Excel .__ durch Excel-Interop ohne Drittanbieter-Bibliotheken.
  2. Ich habe nach dem Weg gesucht, Spalte nach Nummer zu formatieren, und __. Bereiche wie "A: A" nicht verwenden.
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

Verwenden Sie Ihren WorkSheet.Columns.NumberFormat und setzen Sie ihn auf string "@". Hier ist das Beispiel:

Excel._Worksheet workSheet = (Excel._Worksheet)_Excel.Worksheets.Add();
//set columns format to text format
workSheet.Columns.NumberFormat = "@";

Hinweis: Dieses Textformat gilt für Ihre Excel-Tabelle.

Wenn Sie möchten, dass eine bestimmte Spalte das Textformat anwendet, z. B. die erste Spalte, können Sie Folgendes tun:

workSheet.Columns[0].NumberFormat = "@";

oder dies wird den angegebenen Bereich von woorkSheet auf das Textformat anwenden:

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

Ich weiß, dass diese Frage in die Jahre gekommen ist, trotzdem möchte ich dazu beitragen.

Bewirbt sich Range.NumberFormat = "@" nur teilweise das Problem lösen:

  • Ja, wenn Sie den Fokus auf eine Zelle des Bereichs legen, wird im Format-Menü Text angezeigt
  • Ja, die Daten werden nach links ausgerichtet
  • Wenn Sie jedoch die Formel Typ verwenden, um den Typ des Werts in der Zelle zu überprüfen, wird 1 bedeutet Zahl zurückgegeben

Das Anwenden des Apostrophs verhält sich besser. Es setzt das Format auf Text, richtet Daten nach links aus und wenn Sie das Format des Werts in der Zelle mit der Formel Typ überprüfen, wird 2 Bedeutungstext

0
Patrik