【问题标题】:Keep excel cell format as text with "date like" data将excel单元格格式保留为带有“日期类似”数据的文本
【发布时间】:2015-11-19 03:40:51
【问题描述】:

这似乎很愚蠢,但我无法以#/#### 的格式获取我的值,以将其写为文字字符串,而不是在 Excel 中格式化为日期。

我正在使用 ClosedXML 写入 excel,并使用以下内容:

// snip
IXLRangeRow tableRow = tableRowRange.Row(1);
tableRow.Cell(1).DataType = XLCellValues.Text;
tableRow.Cell(1).Value = "2/1997";
// snip

查看我在单元格 2/1/1997 中得到的输出 excel 表 - 即使我将格式设置为代码中的文本,我在 excel 表中将其作为“日期”得到 - 我检查了这个右键单击单元格,格式化单元格,将“日期”视为格式。

如果我将内容更改为:

// snip
IXLRangeRow tableRow = tableRowRange.Row(1);
tableRow.Cell(1).Value = "2/1997";
tableRow.Cell(1).DataType = XLCellValues.Text;
// snip

我得到35462 作为我的输出。

我只想在工作表上显示我的文字值2/1997。请告知如何更正。

【问题讨论】:

    标签: c# asp.net excel closedxml


    【解决方案1】:

    试试这个

    ws.Cell(rowCounter, colCounter).SetValue<string>(Convert.ToString(fieldValue));
    

    【讨论】:

    • 这对我有用,但任何人都可以评论为什么会这样吗?
    • 知道我的fieldValue 已经是一个字符串,我还能够将上面的代码缩减为这个:ws.Cell(rowCounter, colCounter).SetValue(fieldValue);
    • @jaredbaszler 这是 Wiki for ClosedXML 中的文档。如果您使用 cell.Value = blah 设置值,它总是会自动为您转换值,因此它会自动将字符串识别为日期并进行转换(就像 Excel 默认情况下对 CSV 文件所做的那样令人讨厌)。但是 cell.SetValue() 专门避免了这种情况,如果该值是一个字符串,它在 Excel 文件中仍然是一个字符串。
    • @KendallBennett github.com/ClosedXML/ClosedXML/wiki/…提到的wiki
    【解决方案2】:

    不确定是否来自 ClosedXML,但可以尝试 Range.NumberFormat (MSDN Link)

    例如...

    Range("A1").NumberFormat = "@"
    

    或者

    Selection.NumberFormat = "#/####"
    

    【讨论】:

    • 这确实有效:worksheet.Range(firstCell, lastCell).Style.NumberFormat.Format = "@";
    【解决方案3】:

    考虑:

    tableRow.Cell(1).Value = "'2/1997";
    

    注意单引号。

    【讨论】:

    • 这非常接近 - 我唯一的问题是如果我按 F2 或在单元格上输入公式栏,则格式会以“mmm/yyyy”的格式更新为日期。有什么想法吗?
    【解决方案4】:
    ws.Cell(rowCounter, colCounter).Value="'"+Convert.ToString(fieldValue));
    

    【讨论】:

      【解决方案5】:

      必须在将值写入单元格之前进行格式化。

      我有以下机制,在我制作工作表之后运行,就在我保存它之前:

          private void SetColumnFormatToText(IXLWorksheet worksheet)
          {
              var wholeSheet = worksheet.Range(FirstDataRowIndexInExcel, StartCellIndex, RowCount, HeaderCount);
              wholeSheet.Style.NumberFormat.Format = "@";
          }
      

      没有做深蹲。

      在我将值写入连续的单元格之前这样做。

      worksheet.Range(RowIndex, StartCellIndex, RowIndex, EndCellIndex).Style.NumberFormat.Format = "@";
      

      紧随其后的是单元格值分配。

      【讨论】:

        猜你喜欢
        • 2019-04-20
        • 2011-11-18
        • 1970-01-01
        • 1970-01-01
        • 2020-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-13
        相关资源
        最近更新 更多