# 前言
记录一些平时整理的工具类,方便日后查找使用
# Excel 工具类 (NPOI)
public static class ExcelHelper | |
{ | |
public static FileInfo ExportExcel<TSource>(this List<TSource> sources, ExcelColumn<TSource>[] columns, string saveDirPath, string fileName = null) | |
{ | |
IWorkbook workbook = new XSSFWorkbook();// 创建 xlsx | |
ISheet sheet = workbook.CreateSheet("Sheet1"); | |
IRow headerRow = sheet.CreateRow(0); | |
for (int i = 0; i < columns.Length; i++) | |
{ | |
var column = columns[i]; | |
headerRow.CreateCell(i).SetCellValue(column.Title); | |
} | |
for (int i = 0; i < sources.Count; i++) | |
{ | |
var source = sources[i]; | |
var row = sheet.CreateRow(i + 1); | |
row.FillRow(source, columns); | |
} | |
using MemoryStream stream = new MemoryStream(); | |
workbook.Write(stream); | |
var buf = stream.ToArray(); | |
if (!Directory.Exists(saveDirPath)) | |
{ | |
Directory.CreateDirectory(saveDirPath); | |
} | |
if (string.IsNullOrWhiteSpace(fileName)) | |
{ | |
fileName = $"{DateTime.Now.ToFileNameString()}.xlsx"; | |
} | |
var fullSavePath = Path.Combine(saveDirPath, fileName); | |
using FileStream fs = new FileStream(fullSavePath, FileMode.Create, FileAccess.Write); | |
fs.Write(buf, 0, buf.Length); | |
fs.Flush(); | |
return new FileInfo(fullSavePath); | |
} | |
private static void FillRow<TSource>(this IRow row, TSource source, ExcelColumn<TSource>[] columns) | |
{ | |
for (int i = 0; i < columns.Length; i++) | |
{ | |
var column = columns[i]; | |
var value = source.ToStringValue(column); | |
row.CreateCell(i).SetCellType(CellType.String).SetCellValue(value); | |
} | |
} | |
private static string ToStringValue<TSource>(this TSource source, ExcelColumn<TSource> column) | |
{ | |
var value = column.Selector(source); | |
if (value is null) | |
{ | |
return string.Empty; | |
} | |
if (source is DateTime) | |
{ | |
return ((DateTime)value).ToString("yyyy-MM-dd HH:mm:ss"); | |
} | |
return value.ToString(); | |
} | |
} |
public record ExcelColumn<TSource> | |
{ | |
public string Title { get; set; } | |
public Func<TSource, object> Selector { get; set; } | |
public ExcelColumn(string title, Func<TSource, object> selector) | |
{ | |
this.Title = title; | |
this.Selector = selector; | |
} | |
} |
public (FileInfo, string) CreateExcel(List<InvoiceRequestDto> datas) | |
{ | |
var columns = new ExcelColumn<InvoiceRequestDto>[] | |
{ | |
new("发票号",o=>o.InvoiceCode), | |
new("客户编号",o=>o.CustomerCode), | |
new("类型",o=>o.Type.ToString()), | |
new("名称",o=>o.Name), | |
new("Tin",o=>o.Tin), | |
new("Brn",o=>o.Brn), | |
new("Tel",o=>o.Tel), | |
new("Email",o=>o.Email), | |
new("地址",o=>o.Address), | |
new("邮编",o=>o.PostCode), | |
new("州属",o=>o.StateName), | |
new("申请人",o=>o.UserName), | |
new("发票链接",o=>BusinessHelper.GetEInvoiceUrl(o.Uuid,o.LongId)), | |
}; | |
var excelDirPath = FilePath.GetExcelDirPath(); | |
var fileInfo = datas.ExportExcel(columns, excelDirPath); | |
var relativePath = fileInfo.ToRelativePath(excelDirPath); | |
return (fileInfo, relativePath); | |
} |
# DateTime 工具类
public static class DateTimeHelper | |
{ | |
/// <summary> | |
/// yyyy-MM-dd HH:mm:ss | |
/// </summary> | |
private static readonly DateTimeFormatInfo SimpleDateTimeFormat = new DateTimeFormatInfo() | |
{ | |
ShortDatePattern = "yyyy-MM-dd HH:mm:ss" | |
}; | |
/// <summary> | |
/// 接收一个日期字符串,返回当天 00:00:00 的日期 | |
/// </summary> | |
/// <param name="dateStr"></param> | |
/// <returns></returns> | |
public static DateTime GetDayStart(this string dateStr) | |
{ | |
var dt = Convert.ToDateTime(dateStr); | |
return new DateTime(dt.Year, dt.Month, dt.Day, 0, 0, 0); | |
} | |
/// <summary> | |
/// 接收一个日期字符串,返回当天 23:59:59 的日期 | |
/// </summary> | |
/// <param name="dateStr"></param> | |
/// <returns></returns> | |
public static DateTime GetDayEnd(this string dateStr) | |
{ | |
var dt = Convert.ToDateTime(dateStr); | |
return new DateTime(dt.Year, dt.Month, dt.Day, 23, 59, 59); | |
} | |
/// <summary> | |
/// 接收一个日期字符串,返回当天 00:00:00 的日期字符串 | |
/// </summary> | |
/// <param name="dateStr"></param> | |
/// <returns></returns> | |
public static string GetDayStartStr(this string dateStr) | |
{ | |
return GetDayStart(dateStr).ToString("yyyy-MM-dd 00:00:00"); | |
} | |
/// <summary> | |
/// 接收一个日期字符串,返回当天 23:59:59 的日期字符串 | |
/// </summary> | |
/// <param name="dateStr"></param> | |
/// <returns></returns> | |
public static string GetDayEndStr(this string dateStr) | |
{ | |
return GetDayEnd(dateStr).ToString("yyyy-MM-dd 23:59:59"); | |
} | |
/// <summary> | |
/// 获取今天开始时间 | |
/// </summary> | |
/// <returns></returns> | |
public static DateTime GetTodayStart() | |
{ | |
DateTime now = DateTime.Now; | |
return new DateTime(now.Year, now.Month, now.Day); | |
} | |
/// <summary> | |
/// 获取今天结束时间 | |
/// </summary> | |
/// <returns></returns> | |
public static DateTime GetTodayEnd() | |
{ | |
DateTime now = DateTime.Now; | |
return new DateTime(now.Year, now.Month, now.Day, 23, 59, 59); | |
} | |
/// <summary> | |
/// 获取本周开始时间 | |
/// </summary> | |
/// <returns></returns> | |
public static DateTime GetWeekStart() | |
{ | |
DateTime now = DateTime.Now; | |
DateTime temp = new DateTime(now.Year, now.Month, now.Day); | |
int count = now.DayOfWeek - DayOfWeek.Monday; | |
if (count == -1) count = 6; | |
return temp.AddDays(-count); | |
} | |
/// <summary> | |
/// 获取本周结束时间 | |
/// </summary> | |
/// <returns></returns> | |
public static DateTime GetWeekEnd() | |
{ | |
DateTime now = DateTime.Now; | |
DateTime temp = new DateTime(now.Year, now.Month, now.Day, 23, 59, 59); | |
int count = now.DayOfWeek - DayOfWeek.Sunday; | |
if (count != 0) count = 7 - count; | |
return temp.AddDays(count); | |
} | |
/// <summary> | |
/// 获取本周开始时间 | |
/// </summary> | |
/// <returns></returns> | |
public static DateTime GetMonthStart() | |
{ | |
DateTime now = DateTime.Now; | |
return new DateTime(now.Year, now.Month, 1, 0, 0, 0); | |
} | |
/// <summary> | |
/// 获取本周结束时间 | |
/// </summary> | |
/// <returns></returns> | |
public static DateTime GetMonthEnd() | |
{ | |
DateTime now = DateTime.Now; | |
DateTime temp = new DateTime(now.Year, now.Month, 1, 23, 59, 59); | |
return temp.AddMonths(1).AddDays(-1); | |
} | |
/// <summary> | |
/// 获取本年开始时间 | |
/// </summary> | |
/// <returns></returns> | |
public static DateTime GetYearStart() | |
{ | |
DateTime now = DateTime.Now; | |
return new DateTime(now.Year, 1, 1, 0, 0, 0); | |
} | |
/// <summary> | |
/// 获取本年结束时间 | |
/// </summary> | |
/// <returns></returns> | |
public static DateTime GetYearEnd() | |
{ | |
DateTime now = DateTime.Now; | |
return new DateTime(now.Year, 12, 31, 23, 59, 59); | |
} | |
/// <summary> | |
/// 获取昨天开始时间 | |
/// </summary> | |
/// <returns></returns> | |
public static DateTime GetYesterdayStart() | |
{ | |
return GetTodayStart().AddDays(-1); | |
} | |
/// <summary> | |
/// 获取昨天结束时间 | |
/// </summary> | |
/// <returns></returns> | |
public static DateTime GetYesterdayEnd() | |
{ | |
return GetTodayEnd().AddDays(-1); | |
} | |
// <summary> | |
/// 获取上周开始时间 | |
/// </summary> | |
/// <returns></returns> | |
public static DateTime GetLastWeekStart() | |
{ | |
return GetWeekStart().AddDays(-7); | |
} | |
/// <summary> | |
/// 获取上周结束时间 | |
/// </summary> | |
/// <returns></returns> | |
public static DateTime GetLastWeekEnd() | |
{ | |
return GetWeekEnd().AddDays(-7); | |
} | |
// <summary> | |
/// 获取上月开始时间 | |
/// </summary> | |
/// <returns></returns> | |
public static DateTime GetLastMonthStart() | |
{ | |
DateTime now = DateTime.Now; | |
DateTime temp = new DateTime(now.Year, now.Month, 1, 0, 0, 0); | |
return temp.AddMonths(-1); | |
} | |
/// <summary> | |
/// 获取上月结束时间 | |
/// </summary> | |
/// <returns></returns> | |
public static DateTime GetLastMonthEnd() | |
{ | |
DateTime now = DateTime.Now; | |
DateTime temp = new DateTime(now.Year, now.Month, 1, 23, 59, 59); | |
return temp.AddDays(-1); | |
} | |
/// <summary> | |
/// 根据一个总秒数,返回 "时:分:秒" 格式字符串 | |
/// </summary> | |
/// <param name="totalSecond"></param> | |
/// <returns></returns> | |
public static string GetTimeStrBySeconds(int totalSecond) | |
{ | |
string hour = (totalSecond / 3600).ToString().PadLeft(2, '0'); | |
string minute = ((totalSecond % 3600) / 60).ToString().PadLeft(2, '0'); | |
string second = (totalSecond % 60).ToString().PadLeft(2, '0'); | |
return string.Format("{0}:{1}:{2}", hour, minute, second); | |
} | |
/// <summary> | |
/// 获取两个日期的秒数差值 | |
/// </summary> | |
/// <param name="timeStart"></param> | |
/// <param name="timeEnd"></param> | |
/// <returns></returns> | |
public static int SecondDiff(this DateTime timeEnd, DateTime timeStart) | |
{ | |
TimeSpan timeSpanStart = new TimeSpan(timeStart.Ticks); | |
TimeSpan timeSpanEnd = new TimeSpan(timeEnd.Ticks); | |
TimeSpan timeDiff = timeSpanEnd.Subtract(timeSpanStart); | |
return (int)timeDiff.TotalSeconds; | |
} | |
/// <summary> | |
/// 获取两个日期的秒数差值 | |
/// </summary> | |
/// <param name="timeStart"></param> | |
/// <param name="timeEnd"></param> | |
/// <returns></returns> | |
public static TimeSpan GetTimeSpanDiff(DateTime timeStart, DateTime timeEnd) | |
{ | |
TimeSpan timeSpanStart = new TimeSpan(timeStart.Ticks); | |
TimeSpan timeSpanEnd = new TimeSpan(timeEnd.Ticks); | |
return timeSpanEnd.Subtract(timeSpanStart); | |
} | |
/// <summary> | |
/// 获取两个日期的天数差值 | |
/// </summary> | |
/// <param name="timeStart"></param> | |
/// <param name="timeEnd"></param> | |
/// <returns></returns> | |
public static int GetDayDiff(DateTime timeStart, DateTime timeEnd) | |
{ | |
TimeSpan timeSpanStart = new TimeSpan(timeStart.Ticks); | |
TimeSpan timeSpanEnd = new TimeSpan(timeEnd.Ticks); | |
TimeSpan timeDiff = timeSpanEnd.Subtract(timeSpanStart); | |
return (int)timeDiff.TotalDays; | |
} | |
/// <summary> | |
/// 获取当前时间 n 秒后的实例 | |
/// </summary> | |
/// <param name="minutes"></param> | |
/// <returns></returns> | |
public static DateTime GetDateTimeAfterMinutes(int minutes) | |
{ | |
return DateTime.Now.AddMinutes(minutes); | |
} | |
/// <summary> | |
/// DateTime 转换为 Unix 时间戳 (秒) | |
/// </summary> | |
/// <param name="dateTime"></param> | |
/// <returns></returns> | |
public static long ToTimeStamp(this DateTime dateTime) | |
{ | |
DateTime startTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); | |
return (long)(dateTime.ToUniversalTime() - startTime).TotalSeconds; | |
} | |
/// <summary> | |
/// Unix 时间戳 (秒) 转 DateTime | |
/// </summary> | |
/// <param name="timeStamp"></param> | |
/// <returns></returns> | |
public static DateTime ToDateTime(this long timeStamp) | |
{ | |
DateTime dateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); | |
dateTime = dateTime.AddSeconds(timeStamp).ToLocalTime(); | |
return dateTime; | |
} | |
/// <summary> | |
/// 获取当天是本星期的第几天 | |
/// </summary> | |
/// <returns></returns> | |
public static int GetDayOfWeek() | |
{ | |
DayOfWeek dayOfWeek = DateTime.Today.DayOfWeek; | |
if (dayOfWeek == DayOfWeek.Monday) return 1; | |
if (dayOfWeek == DayOfWeek.Tuesday) return 2; | |
if (dayOfWeek == DayOfWeek.Wednesday) return 3; | |
if (dayOfWeek == DayOfWeek.Thursday) return 4; | |
if (dayOfWeek == DayOfWeek.Friday) return 5; | |
if (dayOfWeek == DayOfWeek.Saturday) return 6; | |
if (dayOfWeek == DayOfWeek.Sunday) return 7; | |
return 0; | |
} | |
/// <summary> | |
/// 将一个 DateTime 格式化为时间字符串 | |
/// </summary> | |
/// <param name="datetime"></param> | |
/// <returns></returns> | |
public static string ToSimpleString(this DateTime datetime) | |
{ | |
return datetime.ToString("yyyy-MM-dd HH:mm:ss"); | |
} | |
/// <summary> | |
/// 将一个 DateTime 格式化为时间字符串 | |
/// </summary> | |
/// <param name="datetime"></param> | |
/// <returns></returns> | |
public static string ToFileNameString(this DateTime datetime) | |
{ | |
return datetime.ToString("yyyyMMddHHmmssffffff"); | |
} | |
/// <summary> | |
/// 将一个字符串转换为 DateTime | |
/// </summary> | |
/// <param name="datetime"></param> | |
/// <returns></returns> | |
public static DateTime? ToDateTime(this string str, string formatStr = "") | |
{ | |
try | |
{ | |
if (string.IsNullOrEmpty(formatStr)) | |
{ | |
return Convert.ToDateTime(str, SimpleDateTimeFormat); | |
} | |
DateTimeFormatInfo formatInfo = new DateTimeFormatInfo() | |
{ | |
ShortDatePattern = formatStr | |
}; | |
return Convert.ToDateTime(str, formatInfo); | |
} | |
catch (Exception) | |
{ | |
return null; | |
} | |
} | |
} |