【问题标题】:Excel not inserting leading zeroExcel不插入前导零
【发布时间】:2013-02-28 19:12:59
【问题描述】:

我正在使用 Office OpenXml 写入 Excel 文件。该文件是一个模板,因此它已经包含了我的所有标题和列的格式。我正在将前导零的数字插入“特殊”列,该列基本上是一个 10 位数字。但是在我的代码中,我可以看到它将值设置为例如0000000004。工作表中该单元格中值为4 的结果以及显示0000000004 的实际单元格。

这是我要写入单元格的代码。

  if (reader[2].ToString().Length < 9)
  {


        myworksheet.Cell(firstrow, 12).Value = reader[2].ToString(); //0045678945

  }
  else
  {
        myworksheet.Cell(firstrow, 12).Value = reader[2].ToString().Substring(0, 9); //0045678945

  }

当我像上面所说的那样打开 excel 表时,我的值是 45678945 而不是 0045678945

任何帮助将不胜感激。

【问题讨论】:

  • 您是否尝试过对 Excel 内部的值进行一些验证?也许编写一个宏来解析输入的值以确保它具有正确的字符数,如果它不符合您的标准,则添加前导零。甚至可以为该列定义自定义数据类型。
  • 你能解释一下你的代码在上面做了什么来导致前面加零吗?当长度小于 9 时,您似乎会将单元格设置为字符串的值 - 如何使零出现在该字符串中?

标签: c# openxml openxml-sdk spreadsheetml


【解决方案1】:

获得所需结果的最简单方法是在单元格中输入的值前面加上一个撇号 - 这告诉 Excel 这是一个字符串:

Cell.Value= "'" & "000123"

将显示为000123

这里有一些代码来展示事情是如何工作的(至少在 Excel 2010 中它们对我来说是如何工作的):

Sub testFormat()
[A1].Value = "000123"
[A2].Value = "'000123"
[A3].Value = "000123"
[A3].NumberFormat = "@"
[A4].Value = "'000123"
[A4].NumberFormat = "@"
End Sub

这样的结果如下:

如您所见,三个单元格显示前导零:

  1. 我在其中输入前面带有撇号的字符串的单元格
  2. 采用"@" (="text") 格式格式化的单元格
  3. 具有撇号和文本格式的单元格

我不确定您做了什么让撇号出现在电子表格中...但我希望以上内容能激发您解决问题。

【讨论】:

  • 很奇怪 - 我添加了更多示例来说明这对我来说是如何工作的。希望对您有所帮助!
【解决方案2】:

如果我理解正确:

Excel 显示带有前导零的数字,通过 OOXML 从 C# 读取它们你看不到前导零。

Excel 可能会设置一些格式规则,而不是存储实际的前导零。

有几种方法可以抵消这种情况。以下是想到的“最便宜”的,选择一个:

  • 将 Excel 中的列格式化为文本
  • 在 C# 代码中不要期望前导零,而是添加它们

【讨论】:

  • Excel 在使用 OOXML 创建工作表时不显示前导零。
  • @user541597 然后,通过反转我的答案,您可以将列类型设置为 OOXML 中的文本,以便 Excel 不会尝试解释它
【解决方案3】:

为了在 Excel 中不截断前导零,您需要将单元格的数字格式设置为 Text

【讨论】:

  • 已经将单元格设置为文本,但它仍在截断前导零。
  • 零在输入 Excel 之前是否被截断?在这种情况下,您可能需要更改获取信息的 C# 代码。
  • 不,我调试了放入 Excel 中的代码,零就在那里。
【解决方案4】:

我相信,如果您将单元格的 DataType 设置为 String 或 SharedString,则会保留前导 0。 Excel 会将其视为文本并仅按字面意思处理该值,而不尝试应用任何格式规则。

cell.DataType = new EnumValue<CellValues>( CellValues.SharedString );

或 cell.DataType = new EnumValue( CellValues.String );

【讨论】:

    【解决方案5】:

    如果您使用的是 DataTable,则需要获取另一个 DataTable,然后您需要遍历数据表中的整个单元格,并在单元格文本前面加上空格,即 '&nbsp';。我们无法修改同一张表中的行因为它会抛出一个异常说“Collection was Modified”。我们必须采用一个新的数据表。

    考虑下面的代码。

        //To get the result with leading zero's in excel this code is written.
        DataTable dtUpdated=new DataTable();
        //This gives similar schema to the new datatable
        dtUpdated = dtReports.Clone();
            foreach (DataRow row in dtReports.Rows)
            {
                for (int i = 0; i < dtReports.Columns.Count; i++)
                {
                    string oldVal = row[i].ToString();
                    string newVal = "&nbsp;"+oldVal;
                    row[i] = newVal;
                }
                dtUpdated.ImportRow(row); 
            }
    

    我们可以将此更新后的表格绑定到数据网格,以便它可以用于 Excel 转换。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-14
      • 1970-01-01
      • 1970-01-01
      • 2013-09-22
      • 2014-09-01
      • 2022-11-17
      • 2011-10-07
      相关资源
      最近更新 更多