从每列中搜索并删除“00:00”值
Search and remove "00:00" values from each column
我试图让我的代码遍历每个 DateTime 列并搜索包含“00:00”的单元格作为小时和分钟。如果该值存在,则删除 00:00 并仅保留日期。对于不包含该值的单元格,将单元格保留原样。例如,如果“3/22/2017 00:00”,则将其格式化为“3/22/2017”。否则,如果“3/22/2017 09:16”,请不要管它。提前致谢!
dataGrid.DataSource = dataSet.Tables(0)
dataGrid.DataBind()
ws.Cells(1, 1).LoadFromDataTable(dataGrid.DataSource, True)
Dim data = dataGrid.DataSource
Dim columnCount = data.Columns.Count
For i = 0 To columnCount - 1
If data.Columns(i).DataType Is GetType(DateTime) Then
If Not data.Columns(i).ToString.Contains("00:00") Then
ws.Column(i + 1).Style.Numberformat.Format = "mm/dd/yyyy hh:mm"
Else
ws.Column(i + 1).Style.Numberformat.Format = "mm/dd/yyyy"
End If
End If
Next
要使您的解决方案生效,您需要为每个单独的单元格设置样式。这是一个低效的解决方案,因为会为每个单元格创建一个样式。通过定义两种不同的样式并根据需要将这些引用分配给单元格,可以在一定程度上减轻这种情况。
一个更简单的解决方案是使用 DataGridView.CellFormatting Event 设置绘制单元格时的格式。
显然,DateTime 值的时间分量小于一分钟,因为如果不是这种情况,默认格式会产生所需的结果。下面的代码根据时间组件是否小于一分钟来设置格式。
Private Shared tsLimit As New TimeSpan(0, 1, 0) ' 1 minute
Private Shared dtType As Type = GetType(DateTime)
Private Sub dataGrid_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles dataGrid.CellFormatting
Dim dgv As DataGridView = CType(sender, DataGridView)
Dim dt As DataTable = TryCast(dgv.DataSource, DataTable)
If dt IsNot Nothing Then
Dim sourceColumn As DataColumn = dt.Columns.Item(dgv.Columns.Item(e.ColumnIndex).DataPropertyName)
If sourceColumn IsNot Nothing AndAlso sourceColumn.DataType Is dtType AndAlso e.Value IsNot Nothing AndAlso Not e.Value Is DBNull.Value Then
Dim d As DateTime = CDate(e.Value)
If d.TimeOfDay < tsLimit AndAlso d.Hour <> 0 Then
e.CellStyle.Format = "mm/dd/yyyy"
Else
e.CellStyle.Format = "mm/dd/yyyy hh:mm"
End If
End If
End If
End Sub
这可以通过以下方式完成:
- 为所有
DateTime
列设置默认格式
- 仅 覆盖满足您条件的值的默认格式。
这是一个处理多个 DateTime
列的简单辅助方法:
Sub SetDateTimeStyles(ByRef data As DataTable, ByRef ws As ExcelWorksheet)
' Track DateTime columns to override default column style
Dim dateTimeColumns = New List(Of Integer)()
' Set column format
Dim columnCount = data.Columns.Count
For i = 0 To columnCount - 1
If data.Columns(i).DataType Is GetType(DateTime) Then
Dim epPlusColumn = i + 1
ws.Column(epPlusColumn).Style.Numberformat.Format = "mm/dd/yyyy hh:mm"
dateTimeColumns.Add(epPlusColumn)
End If
Next
' Header row exists; set to 1 if no header row
Dim rowOffset = 2
Dim rowCount = data.Rows.Count
' Only set cell format when hour and minute are **both** zero
For i = 0 To rowCount - 1
For Each dateTimeColumn In dateTimeColumns
Dim value As DateTime = data(i)(dateTimeColumn - 1)
If value.Hour = 0 AndAlso value.Minute = 0 AndAlso value.Second = 0 Then
ws.Cells(i + rowOffset, dateTimeColumn) _
.Style.Numberformat.Format = "mm/dd/yyyy"
End If
Next
Next
End Sub
并在创建 Excel 文件时调用它:
dataGrid.DataSource = dataSet.Tables(0)
dataGrid.DataBind()
ws.Cells(1, 1).LoadFromDataTable(dataGrid.DataSource, True)
Dim data As DataTable = dataGrid.DataSource
SetDateTimeStyles(data, ws)
结果:
我试图让我的代码遍历每个 DateTime 列并搜索包含“00:00”的单元格作为小时和分钟。如果该值存在,则删除 00:00 并仅保留日期。对于不包含该值的单元格,将单元格保留原样。例如,如果“3/22/2017 00:00”,则将其格式化为“3/22/2017”。否则,如果“3/22/2017 09:16”,请不要管它。提前致谢!
dataGrid.DataSource = dataSet.Tables(0)
dataGrid.DataBind()
ws.Cells(1, 1).LoadFromDataTable(dataGrid.DataSource, True)
Dim data = dataGrid.DataSource
Dim columnCount = data.Columns.Count
For i = 0 To columnCount - 1
If data.Columns(i).DataType Is GetType(DateTime) Then
If Not data.Columns(i).ToString.Contains("00:00") Then
ws.Column(i + 1).Style.Numberformat.Format = "mm/dd/yyyy hh:mm"
Else
ws.Column(i + 1).Style.Numberformat.Format = "mm/dd/yyyy"
End If
End If
Next
要使您的解决方案生效,您需要为每个单独的单元格设置样式。这是一个低效的解决方案,因为会为每个单元格创建一个样式。通过定义两种不同的样式并根据需要将这些引用分配给单元格,可以在一定程度上减轻这种情况。
一个更简单的解决方案是使用 DataGridView.CellFormatting Event 设置绘制单元格时的格式。
显然,DateTime 值的时间分量小于一分钟,因为如果不是这种情况,默认格式会产生所需的结果。下面的代码根据时间组件是否小于一分钟来设置格式。
Private Shared tsLimit As New TimeSpan(0, 1, 0) ' 1 minute
Private Shared dtType As Type = GetType(DateTime)
Private Sub dataGrid_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles dataGrid.CellFormatting
Dim dgv As DataGridView = CType(sender, DataGridView)
Dim dt As DataTable = TryCast(dgv.DataSource, DataTable)
If dt IsNot Nothing Then
Dim sourceColumn As DataColumn = dt.Columns.Item(dgv.Columns.Item(e.ColumnIndex).DataPropertyName)
If sourceColumn IsNot Nothing AndAlso sourceColumn.DataType Is dtType AndAlso e.Value IsNot Nothing AndAlso Not e.Value Is DBNull.Value Then
Dim d As DateTime = CDate(e.Value)
If d.TimeOfDay < tsLimit AndAlso d.Hour <> 0 Then
e.CellStyle.Format = "mm/dd/yyyy"
Else
e.CellStyle.Format = "mm/dd/yyyy hh:mm"
End If
End If
End If
End Sub
这可以通过以下方式完成:
- 为所有
DateTime
列设置默认格式 - 仅 覆盖满足您条件的值的默认格式。
这是一个处理多个 DateTime
列的简单辅助方法:
Sub SetDateTimeStyles(ByRef data As DataTable, ByRef ws As ExcelWorksheet)
' Track DateTime columns to override default column style
Dim dateTimeColumns = New List(Of Integer)()
' Set column format
Dim columnCount = data.Columns.Count
For i = 0 To columnCount - 1
If data.Columns(i).DataType Is GetType(DateTime) Then
Dim epPlusColumn = i + 1
ws.Column(epPlusColumn).Style.Numberformat.Format = "mm/dd/yyyy hh:mm"
dateTimeColumns.Add(epPlusColumn)
End If
Next
' Header row exists; set to 1 if no header row
Dim rowOffset = 2
Dim rowCount = data.Rows.Count
' Only set cell format when hour and minute are **both** zero
For i = 0 To rowCount - 1
For Each dateTimeColumn In dateTimeColumns
Dim value As DateTime = data(i)(dateTimeColumn - 1)
If value.Hour = 0 AndAlso value.Minute = 0 AndAlso value.Second = 0 Then
ws.Cells(i + rowOffset, dateTimeColumn) _
.Style.Numberformat.Format = "mm/dd/yyyy"
End If
Next
Next
End Sub
并在创建 Excel 文件时调用它:
dataGrid.DataSource = dataSet.Tables(0)
dataGrid.DataBind()
ws.Cells(1, 1).LoadFromDataTable(dataGrid.DataSource, True)
Dim data As DataTable = dataGrid.DataSource
SetDateTimeStyles(data, ws)
结果: