【问题标题】:C# Excel Date value is coming as numeric valueC# Excel 日期值以数值形式出现
【发布时间】:2016-10-08 10:56:45
【问题描述】:

Excel 文件由第三方应用程序生成。我正在编写一个实用程序来进一步处理该 Excel 文件。当我读取包含日期值的列时,我得到一个数字字符串,例如 05/02/2016 (dd/MM/yyyy) 为 42405。

我尝试过使用 .Text、.Formula、.Value、.Value2 - 所有方法都返回数值。

我知道 FromOADateTime,但我的要求是将日期值作为字符串读取,与它在屏幕上的显示方式完全相同。

谢谢。

编辑 1: 当我在 Excel 中将列转换为文本时,通过使用单元格格式并选择文本,即使在 Excel 中,所有日期值也会转换为数值!这有什么线索吗?第三方应用程序可能将数据存储为数值,但 Excel 将其显示为屏幕上的日期字符串。我想读取屏幕上显示的值。

编辑 2:

该列中的所有日期值都不会出现此问题。我的第一印象是第三方应用程序在将日期值写入 Excel 时不一致。但我无法控制它。

编辑 3: 这是下载文件的链接:http://wikisend.com/download/316956/Prob.xls。在这个文件中,我需要将 B 列中的所有日期值读取为从第 13 行开始的文本

这里是它在我机器上的截图的链接:http://wikisend.com/download/443994/Screenshot1.jpg

编辑 4: 在 NineBerry 的回答的帮助下,在我的代码中找到了罪魁祸首:在阅读 Text 属性之前的几行,我调用了 ws.Columns.ClearFormats() 和 ws.Rows.ClearFormats();

我需要这样做:How to get the range of occupied cells in excel sheet...,以便正确获取工作表中使用的范围!

原来的问题解决了。现在的问题是如何在不调用 ClearFormats() 的情况下使用 ws.UsedRange 来正确获取已使用单元格的范围。

我的具体要求是在任何单元格中获取包含数据的已用 ROWS 的范围,直到 Col H。我不需要 Excel 中的整个 UsedRange,Col H 中的 UsedRange 对我来说已经足够了。

有什么解决办法吗?还是我应该发布一个新主题?

【问题讨论】:

  • exactly the way it is displayed on the screen - 那么.Text 应该适合你。
  • 但它不起作用!我也被难住了!
  • 我也尝试将 NumberFormat 设置为“@”。但我仍然得到数值。如果我将 NumberFormat 设置为“dd/MM/yyyy”,我会得到日期时间值,但与单元格可能显示的方式不同;示例单元格可能显示 05/02/2016 或 05-02-2016 等。仅供参考,该列包含混合数据;比如有些单元格包含文本字符串,有些单元格包含日期值,如果有帮助的话。
  • 但是它的显示方式是可变的,取决于客户端的区域设置,所以有这个要求是没有意义的
  • 在我的错误消息中,如果他打开 Excel 文件并检查,我想以他看到的方式(取决于他的语言环境)向他显示文本!

标签: c# excel date


【解决方案1】:

使用Text 属性确实给出将显示给用户的字符串。

      private void button_Click(object sender, EventArgs e)
      {
           string path = @"C:\Test.xlsx";

           Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
           Workbook wb = excel.Workbooks.Open(path);
           Worksheet excelSheet = wb.ActiveSheet;

           //Read a specific cell
           Range cell = excelSheet.Cells[1, 3] as Range;

           // Show text content
           MessageBox.Show(cell.Text);

           wb.Close();
      }

如果您在此处没有看到您在 Excel 中看到的内容,则必须向我们提供更多详细信息。也许提供一个示例 Excel 文件,其中单元格的行为与预期不符。


此代码确实输出提供的文件中第二列的内容,与 Excel 中显示的内容完全相同:

  private void button1_Click(object sender, EventArgs e)
  {
       string path = @"D:\Downloads\Windows\Prob.xls";

       Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
       Workbook wb = excel.Workbooks.Open(path);
       Worksheet excelSheet = wb.ActiveSheet;

       //Read a specific cell
       for (int i = 1; i <= 150; i++ )
       {
            Range cell = excelSheet.Cells[i + 1, 2] as Range;
            textBox1.AppendText(cell.Text + Environment.NewLine);

       }
       wb.Close();
  }

如果你没有看到,你应该检查你是否真的在读取正确的文件,并且在阅读之前你没有从代码中修改文件。

【讨论】:

  • 是的,即使我想分享 Excel 文件。我该如何分享? StackOverflow 中没有附件工具。
  • 使用 Dropbox、Microsoft OneDrive、Google Drive 或类似服务,然后在此处发布链接。
  • 好的。这是下载文件的链接:wikisend.com/download/316956/Prob.xls。在这个文件中,我需要将 B 列中的所有日期值读取为从第 13 行开始的文本。
  • 您使用的是哪个库?对我来说,你的代码甚至没有编译。遇到一些错误,例如:“Open”方法没有重载需要“1”个参数,并且不能将类型“object”隐式转换为“Microsoft.Office.Interop.Excel.Worksheet”
  • 我使用的是标准的 Microsoft.Office.Interop.Excel。你在用什么?!?到目前为止,您还没有显示任何代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-01
相关资源
最近更新 更多