在 C# 中将 Excel 列(或单元格)格式化为文本?

Posted

技术标签:

【中文标题】在 C# 中将 Excel 列(或单元格)格式化为文本?【英文标题】:Format an Excel column (or cell) as Text in C#? 【发布时间】:2010-01-14 22:08:28 【问题描述】:

当我将值从数据表复制到 Excel 工作表时,我丢失了前导零。那是因为可能 Excel 将值视为数字而不是文本。

我正在复制这样的值:

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

如何将整列或每个单元格格式化为文本?

一个相关的问题,如何转换myWorksheet.Cells[i + 2, j] 以在 Intellisense 中显示样式属性?

【问题讨论】:

看这里***.com/questions/20648149/… 【参考方案1】:

下面是一些将列 A 和 C 格式化为 SpreadsheetGear for .NET 中的文本的代码,它具有类似于 Excel 的 API - 除了 SpreadsheetGear 经常被强类型化。弄清楚如何将其转换为与 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);

免责声明:我拥有 SpreadsheetGear LLC

【讨论】:

【参考方案2】:

如果在添加带有前导零的数值之前将单元格格式设置为文本,则会保留前导零,而无需通过添加撇号来扭曲结果。如果您尝试手动将前导零值添加到 Excel 中的默认工作表,然后将其转换为文本,则会删除前导零。如果您先将单元格转换为文本,然后添加您的值,就可以了。以编程方式执行此操作时适用相同的原则。

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

【讨论】:

【参考方案3】:

对我来说适用于 Excel 互操作的解决方案:

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

此代码应将数据放入 Excel 之前运行。列号和行号从 1 开始。

更多细节。尽管已接受的对 SpreadsheetGear 参考的响应看起来几乎正确,但我对此有两个担忧:

    我没有使用 SpreadsheetGear。我对常规 Excel 感兴趣 通过 Excel 互操作进行通信,无需任何 3rdparty 库, 我正在寻找按数字格式化列的方法,而不是使用 范围如“A:A”。

【讨论】:

【参考方案4】:

在您写入 Excel 之前需要更改格式:

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

【讨论】:

【参考方案5】:

我最近也在与这个问题作斗争,我从上述建议中学到了两点。

    将 numberFormatting 设置为 @ 会导致 Excel 将值左对齐,并像读取文本一样读取它,但是,它仍会截断前导零。 在开头添加撇号会导致 Excel 将其视为文本并保留零,然后应用默认文本格式,从而解决这两个问题。

这种误导的方面是您现在在单元格中具有不同的值。幸运的是,当您复制/粘贴或导出为 CSV 时,撇号不包括在内。

结论:使用撇号而不是 numberFormatting 以保留前导零。

【讨论】:

设置 NumberFormat = "@" 并在值前面加上撇号为我保留了前导零。使用 NumberFormat 方法时,要在列中保持右对齐,只需添加以下内容:rng.NumberFormat = "@"; rng.HorizontalAlignment = Excel.XlHAlign.xlHAlignRight;或此处找到的其他对齐方法之一:[link]msdn.microsoft.com/query/…【参考方案6】:
   if (dtCustomers.Columns[j - 1].DataType != typeof(decimal) && dtCustomers.Columns[j - 1].DataType != typeof(int))
   
      myWorksheet.Cells[i + 2, j].NumberFormat = "@";
   

【讨论】:

如何在没有excel互操作的情况下实现上述请求【参考方案7】:

使用您的WorkSheet.Columns.NumberFormat,并将其设置为string "@",示例如下:

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

注意:此文本格式将适用于您的孔 Excel 表!

如果您希望特定列应用文本格式,例如第一列,您可以这样做:

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

或者这会将指定范围的 woorkSheet 应用于文本格式:

workSheet.get_Range("A1", "D1").NumberFormat = "@";

【讨论】:

【参考方案8】:

我知道这个问题已经过时了,但我还是想贡献一下。

申请Range.NumberFormat = "@"只是部分解决问题:

是的,如果您将焦点放在范围内的某个单元格上,您将在格式菜单中阅读文本 是的,它将数据向左对齐 但是如果你使用type公式来检查单元格中值的类型,它会返回1表示数字

应用撇号会表现得更好。它将格式设置为 text,它将数据左对齐,如果您使用 type 公式检查单元格中值的格式,它将返回 2含义文字

【讨论】:

【参考方案9】:
//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);

【讨论】:

我在使用逗号分隔符数据时遇到问题 12345,1234,1234,3456 会解决我的问题吗? @DeepakJain - 你的问题解决了吗?如果没有,请更新我,我会帮忙 nope.i 正在将数据集导入到 excel 中,其中一个 excel 工作表包含一列,其中包含类似 123,124,12534,123450,876 的数据,而 Excel 无法正确显示数据。 我的代码***.com/questions/48891182/… 您只需将该列或单元格的格式更改为文本。 '//格式为文本 ExcelWorksheet.Columns[1].NumberFormat = "@";'如果您仍然遇到问题,请告诉我。因为我能够最终解决这个问题。

以上是关于在 C# 中将 Excel 列(或单元格)格式化为文本?的主要内容,如果未能解决你的问题,请参考以下文章

在EXCEL中将数字转换为文本时怎样在单元格前边自动加0

excel中将两个单元格的内容合并

c#导出EXCEL设置单元格格式?

导出到 Excel 时将所有数据格式化为文本(非通用)

在 Excel 2013 中将条形码的数字格式化为文本以提高可读性

如何在C#中使用EPPlus设置xlsx单元格宽度