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

49

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

我是这样复制这些值的:

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

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

相关问题,如何将myWorksheet.Cells[i + 2, j]转换为在智能感知中显示样式属性?


请在此处查看 https://dev59.com/zGIj5IYBdhLWcg3wGBbj#49621979 - NoWar
10个回答

53

以下是一些代码,用于在SpreadsheetGear for .NET中将列A和列C格式化为文本。该API类似于Excel,但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


16

如果您在添加带有前导零的数字值之前将单元格格式设置为文本,则不必添加撇号即可保留前导零。如果您尝试手动向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();
            }
        }

14

以下是我在使用Excel Interop时发现有效的解决方案:

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

在放置数据到Excel之前,应该运行这段代码。 行和列的编号是从1开始计数的。

更详细的说明。尽管具有SpreadsheetGear参考资料的已接受响应看起来几乎正确,但我对其有两个关注点:

  1. 我没有使用SpreadsheetGear。 我对通过Excel interop进行常规Excel通信而不使用任何第三方库感兴趣,
  2. 我正在寻找按列号格式化列的方法,而不是使用类似于“ A:A”之类的范围。

7

在写入 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

4

我最近也遇到了这个问题,并且从上述建议中学到了两件事情。

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

误导人的是,现在单元格中有一个不同的值。幸运的是,当您复制/粘贴或导出到CSV时,撇号不会被包含。

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


4
将NumberFormat设置为"@"并在值前加上撇号,可以保留我所需的前导零。使用NumberFormat方法时,若要保持列中的右对齐,请添加以下内容:rng.NumberFormat = "@"; rng.HorizontalAlignment = Excel.XlHAlign.xlHAlignRight;或使用此处找到的其他对齐方法: [链接]http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=EN-US&k=k(MICROSOFT.OFFICE.INTEROP.EXCEL.RANGE.HORIZONTALALIGNMENT);k(TargetFrameworkMoniker-%22.NETFRAMEWORK%2cVERSION%3dV4.0%22);k(DevLang-CSHARP)&rd=true - Ted

3
使用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 = "@";

或者,这将把指定的工作表范围应用于文本格式。
workSheet.get_Range("A1", "D1").NumberFormat = "@";

2
   if (dtCustomers.Columns[j - 1].DataType != typeof(decimal) && dtCustomers.Columns[j - 1].DataType != typeof(int))
   {
      myWorksheet.Cells[i + 2, j].NumberFormat = "@";
   }

如何在不使用Excel互操作的情况下实现上述请求。 - Rizwan Patel

2
我知道这个问题有点老了,但我还是想做出贡献。
应用Range.NumberFormat = "@"只能部分解决问题:
  • 是的,如果你将焦点放在范围内的单元格上,你会在格式菜单中读取文本
  • 是的,它将数据对齐到左边
  • 但是,如果你使用type公式来检查单元格中值的类型,它将返回1表示数字
应用撇号会更好。它将格式设置为文本,将数据对齐到左侧,如果你使用type公式检查单元格中值的格式,它将返回2表示文本

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

1
我正在遇到逗号分隔数据的问题,例如 12345,1234,1234,3456,这会解决我的问题吗? - user8887761
2
@DeepakJain - 你的问题解决了吗?如果没有,更新一下我,我会帮忙。 - KR Akhil
不行。我正在将数据集导入Excel,其中一个Excel表格包含一个列,该列具有像123、124、12534、123450、876这样的数据,但Excel无法正确显示数据。 - user8887761
我的代码 https://stackoverflow.com/questions/48891182/garbage-data-coming-while-importing-dataset-to-excel-for-number-with - user8887761
1
你只需要将该列或单元格的格式更改为文本即可。'//格式化为文本 ExcelWorksheet.Columns[1].NumberFormat = "@";'如果您仍然遇到问题,请告诉我。因为我已经在我的端上解决了这个问题。 - KR Akhil
ExcelWorksheet.Columns[1].NumberFormat = "@"; - KR Akhil

0

目前您的回答尚不清晰,请[编辑]以添加更多细节,帮助其他人了解它是如何回答问题的。您可以在帮助中心找到有关编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接