【问题标题】:Converting non-standard date format (e.g., "5 Sep") to dd/mm (e.g., 05/09)将非标准日期格式(例如“5 Sep”)转换为 dd/mm(例如 05/09)
【发布时间】:2021-09-27 14:35:16
【问题描述】:

我有一个 VB.NET 问题,我想将 Excel 电子表格标题行中的非标准日期转换为不同的格式。具体来说,工作表带有一个字母数字字符串变量日和月(例如,“5 Sep”),但我需要将其转换为另一个字符串,如“05/09”。

不幸的是,我既没有创建这些工作表,也没有定义自己的输出格式应该是什么——因此陷入了困境。任何帮助将不胜感激,因为到目前为止我已经浪费了两天时间!非常感谢。

                Try
                    xlWorkBook = xlApp.Workbooks.Open(result2)
                    xlWorkSheet = xlWorkBook.Worksheets("Attendances")

                    xlWorkBook.Activate()
                    If xlWorkSheet.Cells(1, 1).Value = "Course" Then
                        xlWorkSheet.Rows(1 & ":" & 3).Delete()
                        xlWorkBook.Save()



                        For t As Integer = 6 To 75
                            If xlWorkSheet.Cells(1, t).Value <> "" And Len(xlWorkSheet.Cells(1, t).Value) > 25 Then
                                xlWorkSheet.Cells(1, t).Value = Microsoft.VisualBasic.Left(xlWorkSheet.Cells(1, t).Value, InStr(xlWorkSheet.Cells(1, t).Value, " 20") - 1)
                            End If
                        Next                           

                        xlWorkBook.Save()
                        xlWorkBook.Close()
                    End If
                    xlApp.Quit()
                Catch ex As Exception
                    lblPath.Text = "Exception"
                End Try

【问题讨论】:

  • 您确定日期实际上是 5 Sep 还是 Excel 的显示方式?
  • 请在您的问题中添加一些代码,显示用于读取 Excel 文档的 vb.net 以及您尝试读取和转换日期单元格的尝试
  • 您必须知道可能的日期格式是什么才能解析文本。您可以调用ParseExactTryParseExact 并指定多种格式以转换为Date,然后使用您想要的任何最终格式调用ToString
  • 日期实际上是“5 Sep”,因为它的开头是“5 Sep 2021 2.20PM All students”。我已经解析了字符串并删除了“5 Sep”右侧的所有内容,但这仍然给我留下了我所描述的问题。
  • jmcilhinney 它确实以日期开头,但字符串“2021 年 9 月 6 日 2.20PM 所有学生”,这是非常没用的。就像我对 djv 说的那样,我可以将其删除至“6 Sep”,但这不是公认的日期格式。我正在考虑通过 if-then 语句蛮力解析它,然后重建它。

标签: excel vb.net date


【解决方案1】:

如果保留年份部分,则可以使用 DateTime.Parse 函数。然后您可以将生成的 DateTime 转换为仅包含您想要的部分的字符串。

For t As Integer = 6 To 75
    Dim v = xlWorkSheet.Cells(1, t).Value
    If (Not String.IsNullOrWhiteSpace(v)) AndAlso Len(v) > 25 Then
        Dim sd = String.Join(" ", v.Split({" "c}, 4).Take(3))
        Dim d = DateTime.Parse(sd, New Globalization.CultureInfo("en-GB"))
        xlWorkSheet.Cells(1, t).Value = $"=""{d.ToString("dd/MM")}"""
    End If
Next

该值的格式为="05/09",因此 Excel 不会像日期那样对其进行格式化,也不会进行除法。也许你不需要那样强迫它。

我建议将原始数据保存在某个地方,也许通过隐藏列,并使用新列进行显示。

【讨论】:

  • 嗨 Andrew,我通过暴力破解 split(" ",c) 然后 if-thening 十二个月的所有组合(这总是这样做的可怕方式)来让它工作。但我会尝试你的代码,因为它是“正确”的方式。我的问题是输入数据来自 Moodle LMS 系统中的出勤名册,他们刚刚重新格式化了所有这些,所以我的旧代码不仅不起作用,而且我必须尝试将他们的新格式适应旧软件——这比从头开始更难!但是,非常感谢。我会发布我的进展情况。 - 彼得
  • @user8226676 不客气 :) 您可能想改用 DateTime.TryParse,因为如果数据格式错误,这提供了一种避免异常的干净方法 - 您可以保存行号出错了,然后将它们显示给用户进行手动干预。
【解决方案2】:

也许这对你有帮助:

Private Function GetMonthNumber%(s$)

Select Case UCase(Trim(s$))
    Case "JAN"
     Return 1
    Case "FEB"
     Return 2
    '...
    Case Else
    'bad argument
    Return 0 
End Select
End Function

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-25
    • 2012-03-05
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多