生成HTML邮件表格时如何去除日期列的时间部分?
解决DataTable转HTML表格时日期列显示时间的问题
问题说明
从数据库获取的DataTable包含仅存储日期的列(无时间信息),但转换为HTML表格用于邮件发送时,日期列却显示日期加默认时间(如2024-05-20 00:00:00),SQL列本身不含时间,需修改代码让日期列仅显示日期部分。
问题原因
数据库的date类型会被映射为.NET的DateTime类型,即使时间部分为00:00:00,默认调用ToString()时仍会包含时间信息,导致HTML表格中显示多余的时间内容。
解决方案
遍历每行数据时,针对DateTime类型的值进行格式化处理,仅保留日期部分。修改内层循环逻辑,不再直接将ItemArray转为字符串,而是根据列的数据类型处理值的显示格式。
修改后的完整代码
public string GetHtmlTable(string title, DataTable table) { try { string messageBody = "<font> " + title + " </font><br><br>"; if (table.Rows.Count == 0) return messageBody; string htmlTableStart = "<table style=\"border-collapse:collapse; text-align:center;\" >"; string htmlTableEnd = "</table>"; string htmlHeaderRowStart = "<tr style =\"background-color:#6FA1D2; color:#ffffff;\">"; string htmlHeaderRowEnd = "</tr>"; string htmlTrStart = "<tr style =\"color:#555555;\">"; string htmlTrEnd = "</tr>"; string htmlTdStart = "<td style=\" border-color:#5c87b2; border-style:solid; border-width:thin; padding: 5px;\">"; string htmlTdEnd = "</td>"; messageBody += htmlTableStart; // 生成表头 messageBody += htmlHeaderRowStart; foreach (DataColumn column in table.Columns) messageBody += htmlTdStart + column.ColumnName + htmlTdEnd; messageBody += htmlHeaderRowEnd; // 生成表体行 foreach (DataRow row in table.Rows) { messageBody += htmlTrStart; // 遍历列而非ItemArray,精准判断数据类型 foreach (DataColumn column in table.Columns) { var cellValue = row[column]; string displayText; if (cellValue is DateTime dateVal) { // 可根据需求调整日期格式,如"yyyy年MM月dd日"或"MM/dd/yyyy" displayText = dateVal.ToString("yyyy-MM-dd"); } else if (cellValue == DBNull.Value) { // 处理空值,避免显示异常内容 displayText = string.Empty; } else { // 其他数据类型直接转字符串 displayText = cellValue.ToString(); } messageBody += htmlTdStart + displayText + htmlTdEnd; } messageBody += htmlTrEnd; } messageBody += htmlTableEnd; return messageBody; } catch (Exception e) { // 返回错误信息便于调试,替代原有的null返回 return $"生成HTML表格出错:{e.Message}"; } }
补充说明
- 代码中使用
yyyy-MM-dd作为日期显示格式,可根据业务需求修改为其他格式; - 优化了表头生成逻辑,使用
column.ColumnName确保列名准确; - 增加了空值处理逻辑,避免
DBNull直接转换字符串导致的异常。
内容的提问来源于stack exchange,提问作者user20152482
相关产品推荐
相关产品推荐

