非常好用的扩展方法类库,大大提高开发效率和代码质量。同时适用于 .Net Framework 和 .Net Core
https://github.com/mrhuo/MrHuo.Extensions
尽量减少其他类库的依赖,目前仅依赖以下类库:
- Newtonsoft.Json 12.0.3
- NPOI 2.4.1
//导入方法定义
List<T> Import<T>(
//Excel 路径
string excelFile,
//类属性和 Excel 列 Mapping
List<(string PropertyName, int? ColumnIndex, Func<object, object> ValueProceed)> columnsDef,
//是否包含标题行,默认包含
bool includeTitleRow = true,
//标题行行数,默认1行标题
int titleRowNum = 1,
//需要导入的 Sheet 索引号,从 0 开始,默认 0
int sheetIndex = 0
)
假如有如下 Excel 内容
Name | Age | 性别 |
---|---|---|
aaa | 111 | 男 |
bbb | 222 | 女 |
ccc | 333 | 男 |
4324234 | 23424 | afwerwr |
类定义:
//故意定义的中英文混合,用于测试
class Student
{
public int Index { get; set; }
public string 姓名 { get; set; }
public int 年龄 { get; set; }
public string 性别 { get; set; }
public DateTime 生日 { get; set; }
}
导入方法:
var excelFile = "E:\\test.xls";
var i = 0;
var ret = ExcelHelper.Import<Student>(excelFile, new List<(string PropertyName, int? ColumnIndex, Func<object, object> ValueProceed)>()
{
//对应格式:属性名,Excel列索引号,自定义处理数据(null则取 Excel 单元格内容)
//注意:如果类型转化错误,则设置为属性类型默认值
//注意:列索引号为null时,Func<object, object> 参数值 data 为 null
//这里自定义为 Index 属性赋值
("Index", null, data=> ++i),
//姓名对应第0列
("姓名", 0, null),
//年龄对应第1列
("年龄", 1, null),
//性别对应第2列
("性别", 2, null),
//生日使用当前时间作为值
("生日", null, data=> DateTime.Now),
//这一列不会输出,也不会抛错,因为 Student 类不存在此属性,自动忽略
("123", null, data=> null)
});
//导出结果(我这里转化成了 JSON,更加直观一些)
[{
"Index": 1,
"姓名": "aaa",
"年龄": 111,
"性别": "男",
"生日": "2020-01-07T04:53:26.0283775+08:00"
}, {
"Index": 2,
"姓名": "bbb",
"年龄": 222,
"性别": "女",
"生日": "2020-01-07T04:53:26.0288609+08:00"
}, {
"Index": 3,
"姓名": "ccc",
"年龄": 333,
"性别": "男",
"生日": "2020-01-07T04:53:26.0288754+08:00"
}, {
"Index": 4,
"姓名": "4324234",
"年龄": 23424,
"性别": "afwerwr",
"生日": "2020-01-07T04:53:26.0289049+08:00"
}]
Count(string subString, bool ignoreCase = false)
- 统计字符串中子字符串的个数Count(char character, bool ignoreCase = false)
- 统计字符串中某个字符的个数Repeat(int repeatTimes)
- 将字符串重复指定次数Capitalize()
- 把字符串的第一个字符大写Capitalize(int len)
- 把字符串的前n个字符大写Capitalize(int start, int len)
- 把字符串中的某几个字符大写IsUpper()
- 验证一个字符串中所有字符是否全部大写IsLower()
- 验证一个字符串中所有字符是否全部小写IsNumeric()
- 验证一个字符串是否为数字(可带小数点)IsInt()
- 验证一个字符串是否为整形(不带小数点)IsMobile()
- 验证一个字符串是否是手机号码IsEmail()
- 验证一个字符串是否是电子邮件地址IsUrl(bool includeProtocal = true)
- 验证一个字符串是否为URL地址PadCenter(int width)
- 返回一个原字符串居中,并使用空格填充至长度 width 的新字符串PadCenter(char paddingChar, int width)
- 返回一个原字符串居中,并使用指定填充字符串填充至长度 width 的新字符串Reverse()
- 反转字符串Left(int len)
- 截取字符串左边 len 个字符,和 SubString 不同,此方法不抛异常Right(int len)
- 截取字符串右边 len 个字符,和 SubString 不同,此方法不抛异常SplitLines()
- 将字符串分割为行(分隔符 \n,\r\n)Remove(string subString)
- 移除字符串中的指定字符串,返回新的字符串To<TType>(TType defaultValue = default(TType))
- 字符串类型转化到任意值类型,失败时返回值类型默认值ToBase64(Encoding encoding = null)
- 字符串 Base64 加密,默认 UTF-8 编码FromBase64(Encoding encoding = null)
- 字符串 Base64 解密,默认 UTF-8 编码ToBytes(Encoding encoding = null)
- 字符串转换到字节,默认 UTF-8 编码ToHex()
- 字符串转化成16进制字符串HexStringToHexBytes()
- 16进制的字符串转化到16进制的字节数组HexStringToString(Encoding encoding = null)
- 16进制的字符串解码为字符串DESEncrypt(byte[] key, byte[] iv)
- DES 加密DESEncrypt(string key, byte[] iv)
- DES 加密,密码为字符串DESEncrypt(string key)
- DES 加密,密码为字符串,加密向量默认为本类的字节数组 Encoding.UTF8.GetBytes($"MrHuo.Extensions")DESDecrypt(byte[] key, byte[] iv)
- DES 解密DESDecrypt(string key, byte[] iv)
- DES 解密,密码为字符串DESDecrypt(string key)
- DES 解密,密码为字符串,加密向量默认为本类的全名ToMd5(Encoding encoding = null)
- MD5 加密,默认 UTF-8 编码HtmlEncode()
- 字符串HTML编码HtmlDecode()
- 字符串HTML解码UrlEncode(Encoding encoding = null)
- 字符串URL编码,默认 UTF-8 编码UrlDecode(Encoding encoding = null)
- 字符串URL解码,默认 UTF-8 编码ParseQueryString(Encoding encoding = null)
- QueryString 字符串转化成字典,默认 UTF-8 编码Join(string separator = "")
- 字符串数组 JOIN 成一个字符串,默认分隔符为 string.EmptyCleanHtml()
- 清除字符串中的 HTML 标记SubStringEx(int start, int length)
- 扩展的 SubString,不会抛异常,如果超出范围,返回空字符串ToFile(string fileName, Encoding encoding = null)
- 将一个字符串写入到文件ToFileMd5()
- 获取文件的 MD5
//获取文件的 MD5
var fileMd5 = "C:\\a.txt".ToFileMd5();
ToStream()
- 将一个文件读取到 MemoryStreamAppendToFile(string fileName, Encoding encoding = null)
- 字符串追加到文件
//追加文件
var fileName = Path.GetTempFileName();
DateTime.Now.ToString("yyyyMMddHHmmss").AppendToFile(fileName);
DateTime.Now.ToString("yyyyMMddHHmmss").AppendToFile(fileName);
DateTime.Now.ToString("yyyyMMddHHmmss").AppendToFile(fileName);
DateTime.Now.ToString("yyyyMMddHHmmss").AppendToFile(fileName);
CopyFileTo(string toFileName, bool overwrite = true)
- 文件复制(注意:默认 overwrite 为 true,目标文件存在会被覆盖)MoveFileTo(string toFileName)
- 文件移动HttpGet(bool throwException = false)
- GET 请求 URL,如果发生错误,返回 null
//获取网址 https://www.github.com 的HTML
var html = "https://www.github.com".HttpGet();
HttpGet<T>(bool throwException = false)
- GET 请求 URL,反序列化为对象
//获取网址HTML,并序列化为指定的对象
class RestResult
{
public int Code { get; set; }
public string Msg { get; set; }
}
var restResult = "https://www.github.com".HttpGet<RestResult>();
HttpPost(Dictionary<string, object> data = null, bool throwException = false)
- POST 请求 URL
//POST 请求
var html = "http://www.example.com".HttpPost(new Dictionary<string, object>()
{
["userId"] = "xxx",
["userName"] = "xxx"
});
var restResult = "http://www.example.com".HttpPost<RestResult>(new Dictionary<string, object>()
{
["userId"] = "xxx",
["userName"] = "xxx"
});
ToDataTable<T>(Dictionary<string, Func<T, object>> columnDef = null, string tableName = null)
- IEnumerable 对象转换到 DataTable
class Student
{
public string Name { get; set; }
public int Age { get; set; }
}
var list = new List<Student>();
//list 转化为 DataTable,默认列为 Student 对象属性
var dt = list.ToDataTable();
var index = 1;
//list 转化为 DataTable,使用列定义
var dt2 = list.ToDataTable(new Dictionary<string, Func<Student, object>>()
{
["顺序"] = (item) => $"{index++}",
["姓名"] = (item) => item.Name,
["年龄"] = (item) => item.Age,
["是否成年"] = (item) => item.Age > 16 ? "是" : "否"
});
ToExcelFile<T>(Dictionary<string, Func<T, object>> columnDef = null, string sheetName = "Sheet1", string saveFile = null, bool includeTitleRow = true)
- IEnumerable 对象导出到 Excel 文件ToExcelStream<T>(Dictionary<string, Func<T, object>> columnDef = null, string sheetName = "Sheet1", bool includeTitleRow = true)
- IEnumerable 对象输出到 Excel 内存流
ToUnixTime()
- 时间转化为Unix时间戳ToDateTime()
- Unix时间戳转化为C#时间格式Format(string formatStr = "yyyy-MM-dd HH:mm:ss")
- 格式化日期
GetTopException()
- 获取最顶层的异常
HasValue<T>()
- 验证一个集合是否有元素
ToDictionary()
- 转化成字典
HasAttribute<TAttribute>(bool inherit = false)
- 实例是否具有 TAttribute 类型的特性GetAttributes<TAttribute>(bool inherit = false)
- 获取实例的所有 TAttribute 类型的特性GetAttributes<TAttribute>(bool inherit = false)
- 获取实例的第一个 TAttribute 类型的特性EveryPropertyInvoke<T>(Action<PropertyInfo, Object> propertyAction)
- 对象实例的每一个公开可读属性调用委托处理
AppendToFile(string fileName)
- 将字节数组追加到文件,如果文件不存在,文件自动创建ToFile(string fileName)
- 将字节数组写入到文件,如果文件不存在,文件自动创建ToHex()
- 转化成16进制的字符串ToStringEx(encoding = null)
- 转化成字符串,默认 UTF8 编码
FromJson<T>(JsonSerializerSettings settings = null)
- 将一个 JSON 字符串反序列化成对象ToJson(Formatting formatting = 0, JsonSerializerSettings settings = null)
- 将任意类型对象序列化成 JSON
更多文档,持续更新中....
可能的计划:
- ImageHelper,图片各种处理。可使用方法:
"E:\\aa.jpg".MakeThumbnail(50);
"E:\\aa.jpg".AddImageMark("E:\\bb.jpg", BOTTOM_RIGHT);
- EmailHelper,发送电子邮件。可使用方法:
EmailHelper.InitSmtp(server, port, account, pwd);
"[email protected]".SendEmail("title", "content");
- 导出 Excel 时可通过自定义模板导出数据
- ?? 导出Word,导出Pdf
- [ ]