search并从每列中删除“00:00”值

我想让我的代码遍历每个DateTime列,并search包含“00:00”的单元格,如小时和分钟。 如果该值存在,则删除00:00并仅保留date。 对于不包含该值的单元格,将单元格保持原样。 例如,如果“3/22/2017 00:00”,则格式化为“2017/3/22”。 否则,如果“2017/3/22 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 

这可以通过以下来完成:

  1. 为所有DateTime 设置默认格式
  2. 覆盖符合您的条件的值的默认格式。

以下是处理多个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 

并在创buildExcel文件时调用它:

 dataGrid.DataSource = dataSet.Tables(0) dataGrid.DataBind() ws.Cells(1, 1).LoadFromDataTable(dataGrid.DataSource, True) Dim data As DataTable = dataGrid.DataSource SetDateTimeStyles(data, ws) 

结果:

在这里输入图像说明

为了解决您的问题,您需要在每个单元上设置样式。 这是一个效率低下的解决scheme,因为每个单元格都会创build一个样式。 可以通过定义两种不同的样式并根据需要将这些引用分配给单元来缓解。

更简单的解决scheme是使用DataGridView.CellFormatting事件来设置单元格绘制时的格式。

显然,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