首页 > 其他分享 >转一下。防止丢了,使用反射和ClosedXML库快速写入实体列表到Excel

转一下。防止丢了,使用反射和ClosedXML库快速写入实体列表到Excel

时间:2024-12-09 08:58:42浏览次数:4  
标签:Style Excel 写入 range Thin worksheet ClosedXML Border XLBorderStyleValues

转自:https://blog.csdn.net/m0_67412019/article/details/135767198

如果造成您的不适,请留言,我第一时间删除。

一、基础Demo

二、高度封装的方法(反射实现导出数据)

1.输出单列表

2.输出多sheet列表

​编辑

三、其余说明

一、基础Demo(无反射,直接遍历)
直接在控制台输出,确保安装了该第三方库,安装第一个即可:

 

using ClosedXML.Excel;

class DataSource
{
public int id { get; set; }
public string name { get; set; } = "";
public string classes { get; set; } = "";
public int score { get; set; }
}
class Test
{
public static void SetBorder(IXLRange range)
{
// 设置表格框线
range.Style.Border.TopBorder = XLBorderStyleValues.Thin;
range.Style.Border.InsideBorder = XLBorderStyleValues.Thin;
range.Style.Border.OutsideBorder = XLBorderStyleValues.Thin;
range.Style.Border.LeftBorder = XLBorderStyleValues.Thin;
range.Style.Border.RightBorder = XLBorderStyleValues.Thin;
range.Style.Border.BottomBorder = XLBorderStyleValues.Thin;

// 设置表格框线颜色和粗细
var borderColor = XLColor.Black;
range.Style.Border.OutsideBorderColor = borderColor;
range.Style.Border.LeftBorderColor = borderColor;
range.Style.Border.RightBorderColor = borderColor;
range.Style.Border.TopBorderColor = borderColor;
range.Style.Border.BottomBorderColor = borderColor;

range.Style.Border.TopBorder = XLBorderStyleValues.Thin;
range.Style.Border.InsideBorder = XLBorderStyleValues.Thin;
range.Style.Border.OutsideBorder = XLBorderStyleValues.Thin;
range.Style.Border.LeftBorder = XLBorderStyleValues.Thin;
range.Style.Border.RightBorder = XLBorderStyleValues.Thin;
range.Style.Border.BottomBorder = XLBorderStyleValues.Thin;
//range.Style.Border.SetBorderWidth(borderWidth);
}
static int Main(string[] args)
{
//一、生成数据
List<DataSource> data = GetDataSource();

//二、填充进Excel(ClosedXML.Excel)
//(1)填充列表(列名:学生姓名,学生班级,学生成绩)
//(2)添加一张图片
using (var workbook = new XLWorkbook())
{
#region(1)填充列表
//1.增加工作表
var worksheet = workbook.Worksheets.Add("Sheet1");

//1-2.设计样式
// 调整第二列的列宽为20
worksheet.Column(2).Width = 20;
// 调整第四行的行高为15
worksheet.Row(4).Height = 15;
// 设置A1-C1的背景颜色为淡绿色
worksheet.Range("A1:C1").Style.Fill.BackgroundColor = XLColor.LightGreen;
// 设置A1-C11增加表格框
SetBorder(worksheet.Range("A1:C11"));
// 设置第一行垂直居中对齐和水平居中对齐
worksheet.Row(1).Style.Alignment.Vertical = XLAlignmentVerticalValues.Center;
worksheet.Row(1).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;

//2.填充列表(列名:学生姓名,学生班级,学生成绩)
worksheet.Cell("A1").Value = "学生姓名";
worksheet.Cell("B1").Value = "学生班级";
worksheet.Cell("C1").Value = "学生成绩";

//3.填充数据
int rowIndex = 2;
foreach (var item in data)
{
worksheet.Cell($"A{rowIndex}").Value = item.name;
worksheet.Cell($"B{rowIndex}").Value = item.classes;
worksheet.Cell($"C{rowIndex}").Value = item.score;
rowIndex++;
}
#endregion

#region (2)添加一张图片
worksheet.AddPicture("F:\\C_program\\test2\\files\\dog.png").MoveTo(worksheet.Cell("A20"));
#endregion

//保存excel文件
workbook.SaveAs("F:\\C_program\\test2\\files\\data.xlsx");//存储路径
}
return 0;
}

private static List<DataSource> GetDataSource()
{
List<DataSource> data = new List<DataSource>();
Random random = new Random();
for (int i = 0; i < 10; i++)
{
DataSource item = new DataSource();
item.id = i + 1;
item.name = $"Student{i + 1}";
int classNumber = random.Next(201, 204);
item.classes = $"计算机{classNumber}";
item.score = random.Next(50, 101);

data.Add(item);
}
return data;
}
}
实现效果:

 

二、高度封装的方法(反射实现导出数据)
1.输出单列表
【封装方法】

using ClosedXML.Excel;
using System.Reflection;

namespace ConsoleApp1
{
public static class ClosedXMLExtensions
{
/// <summary>
/// 写入列表
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="list"></param>
/// <param name="filepath"></param>
/// <returns></returns>
/// <exception cref="Exception"></exception>
public static bool ClosedXMLWriteList<T>(List<T> list,List<string> titlelist, string filepath) where T : class
{
try
{
//填充进Excel(ClosedXML.Excel)
using (var workbook = new XLWorkbook())
{
#region
//1.增加工作表
var worksheet = workbook.Worksheets.Add("Sheet1");

//2.获取列表的范围,并且设置相关样式,例如A1:C1
List<string> columns = new List<string> { { "A" }, { "B" }, { "C" }, { "D" }, { "E" }, { "F" }, { "G" }, { "H" }, { "I" }, { "J" }, { "K" }, { "L" }, { "M" }, { "N" }, { "O" }, { "P" }, { "Q" }, { "R" }, { "S" }, { "T" }, { "U" }, { "V" }, { "W" }, { "X" }, { "Y" }, { "Z" } };
var count = list.Count;
var filedcount = GetEntity<T>().Length;//字段的长度
// 设置标题行背景颜色为淡绿色
worksheet.Range($"A1:{columns[filedcount-1]}1").Style.Fill.BackgroundColor = XLColor.LightGreen;
// 启用筛选器
worksheet.Range($"A1:{columns[filedcount-1]}1").SetAutoFilter();
// 设置所有内容表格框
SetBorder(worksheet.Range($"A1:{columns[filedcount-1]}{count+1}"));

// 3. 设置所有单元格的居中对齐
worksheet.Cells().Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
worksheet.Cells().Style.Alignment.Vertical = XLAlignmentVerticalValues.Center;

// 4. 设置所有单元格的字体为宋体
worksheet.Cells().Style.Font.FontName = "SimSun";



//5.填充列表(列名:学生姓名,学生班级,学生成绩)
if (filedcount != titlelist.Count)
{
throw new Exception("标题数量和字段数量不一致,请核对!");
}
var index = 0;
foreach (var item in GetEntity<T>())
{
worksheet.Cell($"{columns[index]}1").Value = titlelist[index];
index++;
}

//6.填充数据
int rowIndex = 2;
foreach (var item in list)
{
int columnIndex = 0;
foreach (var property in GetEntity<T>())
{
worksheet.Cell(rowIndex, columnIndex + 1).Value = property.GetValue(item)?.ToString();
columnIndex++;
}
worksheet.Column(columnIndex).Style.Alignment.WrapText = true;// 设置第x列自动换行
rowIndex++;
}

//7.自动调整列宽
worksheet.Columns().AdjustToContents();
#endregion



//保存excel文件
workbook.SaveAs(filepath);//存储路径

return true;
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}

}

/// <summary>
/// 给表格画边框线
/// </summary>
/// <param name="range"></param>
public static void SetBorder(IXLRange range)
{
// 设置表格框线
range.Style.Border.TopBorder = XLBorderStyleValues.Thin;
range.Style.Border.InsideBorder = XLBorderStyleValues.Thin;
range.Style.Border.OutsideBorder = XLBorderStyleValues.Thin;
range.Style.Border.LeftBorder = XLBorderStyleValues.Thin;
range.Style.Border.RightBorder = XLBorderStyleValues.Thin;
range.Style.Border.BottomBorder = XLBorderStyleValues.Thin;

// 设置表格框线颜色和粗细
var borderColor = XLColor.Black;
range.Style.Border.OutsideBorderColor = borderColor;
range.Style.Border.LeftBorderColor = borderColor;
range.Style.Border.RightBorderColor = borderColor;
range.Style.Border.TopBorderColor = borderColor;
range.Style.Border.BottomBorderColor = borderColor;

range.Style.Border.TopBorder = XLBorderStyleValues.Thin;
range.Style.Border.InsideBorder = XLBorderStyleValues.Thin;
range.Style.Border.OutsideBorder = XLBorderStyleValues.Thin;
range.Style.Border.LeftBorder = XLBorderStyleValues.Thin;
range.Style.Border.RightBorder = XLBorderStyleValues.Thin;
range.Style.Border.BottomBorder = XLBorderStyleValues.Thin;
//range.Style.Border.SetBorderWidth(borderWidth);

}


/// <summary>
/// 反射获取实体的所有属性
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
static PropertyInfo[] GetEntity<T>() where T : class
{
return typeof(T).GetProperties();

}


}
}
【调用示例】

var list = new UserInfo().GetList();//从数据库中获取数据表
List<string> titlelist = new List<string> { { "用户id" }, { "用户名" }, { "性别" }, { "职位ID" }, { "身份标识索引" }, { "部门ID" }, { "邮箱" }, { "密码" }, { "手机" }, { "入职时间" }, { "离职时间" }, { "备注" } };
string filepath = "C:\\Users\\ASUS\\Desktop\\temp\\data.xlsx";
bool b = ClosedXMLExtensions.ClosedXMLWriteList(list, titlelist,filepath);
Console.WriteLine($"输出状态{b}");
【效果图】

 

2.输出多sheet列表
using ClosedXML;
using ClosedXML.Excel;
using System.Reflection;

namespace WinFormsApp1
{
public static class ClosedXMLExtensions
{
public class ExcelOutPutDetails<T>
{

public List<MulData<T>> DataDetails { get; set; } = new List<MulData<T>>();

public string Filepath { get; set; }
}

public class MulData<T>
{
public List<T> Data { get; set; } = new List<T>();

public List<string> Titlelist { get; set; } = new List<string>();

public string WorkSheetName { get; set; }
}

/// <summary>
/// 写入列表
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="list"></param>
/// <param name="filepath"></param>
/// <returns></returns>
/// <exception cref="Exception"></exception>
public static bool ClosedXMLWriteList<T>(ExcelOutPutDetails<T> excel) where T : class
{
try
{
//填充进Excel(ClosedXML.Excel)
using (var workbook = new XLWorkbook())
{
foreach (var jtem in excel.DataDetails)
{
#region
//1.增加工作表
var worksheet = workbook.Worksheets.Add(jtem.WorkSheetName);

//2.获取列表的范围,并且设置相关样式,例如A1:C1
List<string> columns = new List<string> { { "A" }, { "B" }, { "C" }, { "D" }, { "E" }, { "F" }, { "G" }, { "H" }, { "I" }, { "J" }, { "K" }, { "L" }, { "M" }, { "N" }, { "O" }, { "P" }, { "Q" }, { "R" }, { "S" }, { "T" }, { "U" }, { "V" }, { "W" }, { "X" }, { "Y" }, { "Z" } };
var count = jtem.Data.Count;
var filedcount = GetEntity<T>().Length;//字段的长度
// 设置标题行背景颜色为蓝色
worksheet.Range($"A1:{columns[filedcount-1]}1").Style.Fill.BackgroundColor = XLColor.CornflowerBlue;
// 设置标题行字体为加粗
worksheet.Range($"A1:{columns[filedcount - 1]}1").Style.Font.Bold = true;
// 启用筛选器
worksheet.Range($"A1:{columns[filedcount-1]}1").SetAutoFilter();
// 设置所有内容表格框
SetBorder(worksheet.Range($"A1:{columns[filedcount-1]}{count + 1}"));

// 3. 设置所有单元格的居中对齐
worksheet.Cells().Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
worksheet.Cells().Style.Alignment.Vertical = XLAlignmentVerticalValues.Center;

// 4. 设置所有单元格的字体为宋体
worksheet.Cells().Style.Font.FontName = "SimSun";



//5.填充列表(列名:学生姓名,学生班级,学生成绩)
if (filedcount != jtem.Titlelist.Count)
{
throw new Exception("标题数量和字段数量不一致,请核对!");
}
var index = 0;
foreach (var item in GetEntity<T>())
{
worksheet.Cell($"{columns[index]}1").Value = jtem.Titlelist[index];
index++;
}

//6.填充数据
int rowIndex = 2;
foreach (var item in jtem.Data)
{
int columnIndex = 0;
foreach (var property in GetEntity<T>())
{
worksheet.Cell(rowIndex, columnIndex + 1).Value = property.GetValue(item)?.ToString();
columnIndex++;
}
worksheet.Column(columnIndex).Style.Alignment.WrapText = true;// 设置第x列自动换行
rowIndex++;
}

//7.自动调整列宽
worksheet.Columns().AdjustToContents();
#endregion
}


//保存excel文件
workbook.SaveAs(excel.Filepath);//存储路径

return true;
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}

}

/// <summary>
/// 给表格画边框线
/// </summary>
/// <param name="range"></param>
public static void SetBorder(IXLRange range)
{
// 设置表格框线
range.Style.Border.TopBorder = XLBorderStyleValues.Thin;
range.Style.Border.InsideBorder = XLBorderStyleValues.Thin;
range.Style.Border.OutsideBorder = XLBorderStyleValues.Thin;
range.Style.Border.LeftBorder = XLBorderStyleValues.Thin;
range.Style.Border.RightBorder = XLBorderStyleValues.Thin;
range.Style.Border.BottomBorder = XLBorderStyleValues.Thin;

// 设置表格框线颜色和粗细
var borderColor = XLColor.Black;
range.Style.Border.OutsideBorderColor = borderColor;
range.Style.Border.LeftBorderColor = borderColor;
range.Style.Border.RightBorderColor = borderColor;
range.Style.Border.TopBorderColor = borderColor;
range.Style.Border.BottomBorderColor = borderColor;

range.Style.Border.TopBorder = XLBorderStyleValues.Thin;
range.Style.Border.InsideBorder = XLBorderStyleValues.Thin;
range.Style.Border.OutsideBorder = XLBorderStyleValues.Thin;
range.Style.Border.LeftBorder = XLBorderStyleValues.Thin;
range.Style.Border.RightBorder = XLBorderStyleValues.Thin;
range.Style.Border.BottomBorder = XLBorderStyleValues.Thin;
//range.Style.Border.SetBorderWidth(borderWidth);

}


/// <summary>
/// 反射获取实体的所有属性
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
static PropertyInfo[] GetEntity<T>() where T : class
{
return typeof(T).GetProperties();

}


}
}

三、其余说明
【路径+文件名+时间戳】命名法

string folderPath = textBox1.Text.Trim(); // 获取文件夹路径
string fileName = "data"; // 文件名
string timeStamp = DateTime.Now.ToString("yyyyMMddHHmmss"); // 时间戳,格式为年月日时分秒
string filePathWithTimeStamp = Path.Combine(folderPath, $"{fileName}_{timeStamp}.xlsx"); // 拼接路径、文件名和时间戳
workbook.SaveAs(filePathWithTimeStamp); // 保存文件
【添加筛选器】需为每一个sheet表添加

worksheet.Cell("A1").Value = "员工姓名";
worksheet.Cell("B1").Value = "发放薪资";
worksheet.Cell("C1").Value = "发放日期";
worksheet.Cell("D1").Value = "岗位";
worksheet.Cell("E1").Value = "联系方式";
worksheet.RangeUsed().SetAutoFilter();//添加筛选器
效果如下所示:


————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/m0_67412019/article/details/135767198

标签:Style,Excel,写入,range,Thin,worksheet,ClosedXML,Border,XLBorderStyleValues
From: https://www.cnblogs.com/witbob/p/18594151

相关文章

  • 9.4 为分析4种化肥和3个小麦品种对小麦产量的影响,把一块试验田等分成36小块,对种子和化
    importpandasaspdimportstatsmodels.apiassmfromstatsmodels.formula.apiimportolsfromstatsmodels.stats.anovaimportanova_lmfile_path='9.4.xlsx'df=pd.read_excel(file_path,header=0,index_col=0)defsplit_to_float_list(s):try:re......
  • sprintf 将格式化的数据写入字符串
    一.sprintf函数sprintf函数是C标准库中的一个函数,用于将格式化的数据写入字符串。与printf类似,但sprintf的输出是写入到字符数组(字符串)中,而不是输出到标准输出(屏幕)。函数原型intsprintf(char*str,constchar*format,...);str:一个指向字符数组的指针,表示输出......
  • Excel表列名称
    给定一个正整数,返回它在Excel表中相对应的列名称。例如,1->A2->B3->C…26->Z27->AA28->AB…示例1:输入:1输出:“A”示例2:输入:28输出:“AB”示例3:输入:701输出:“ZY”十进制转26进制classSolution:defconvertToTitle(se......
  • 输出与文件编码的兼容性 在 .CMD 文件中,通过正确的编码方式(如 UTF-8),可以确保脚本与外
    在计算机科学和技术领域,.CMD和.BAT文件都属于批处理脚本文件格式,它们是Windows操作系统中用于执行命令的一种文件类型。虽然这两者非常相似,但.CMD文件有一些相对于.BAT文件的优势,特别是在Windows2000及以后版本中。下面将分析.CMD文件相对于.BAT文件的一些优势,并......
  • FIN2020 Excel and VBA
     FIN2020ExcelandVBA–IndividualAssignmentYOUMUSTUPLOADTHEEXCELFILETOCANVASBYDeadline:5:00PM,Date:Monday9thDecember2024AssignmentTheassignmentcontainstwoparts.InPartI,youareexpectedtobuildamortgagecalculator.Part......
  • MySQL数据库写入异常,主库内存溢出,扩容+清理buff/cach!很开门
    MySQL数据库写入异常,主库内存溢出,扩容+清理buff/cach!很开门最近数据出现了两次写入异常报错如下:org.springframework,jdbc.UncategorizedsQlException:PreparedstatementCallback;uncategzed50LExcention[sql语句]TheMysOlserverisrunningwiththe--read-onlyoption......
  • 文档协作噩梦?用Excel实时编辑说再见!
    曾经,你是否在工作中因为多人编辑Excel文档而频频翻车?无休止的文件版本号(如“表格V1.1.1_final_final”)让协作变得复杂而低效。现在,这种混乱可以通过多人协同编辑彻底解决。多人协同编辑Excel允许所有团队成员同时在云端更新同一个表格,每个人的修改都能即时同步。再也不需要繁琐的......
  • 加注释不丢信息,Excel让协作更轻松
    协作编辑Excel文档时,沟通常常成为最大的障碍。每次有人修改数据,是否需要逐一解释?而你是否也常常困惑于文档中的变更来源?Excel的共享注释功能彻底解决了这一问题。在同一个表格中,所有成员可以直接对单元格添加注释,讨论、回复一气呵成,无需跳转其他平台。一份表格解决数据与沟通双重......
  • 利用Python将Excel快速转换成HTML
    目录一、选择合适的工具和库二、安装必要的库三、读取Excel文件四、将DataFrame转换为HTML五、保存HTML文件六、完整示例和案例七、注意事项和常见问题八、总结在日常的办公和数据处理任务中,Excel文件因其强大的表格数据管理能力而备受欢迎。然而,在某些情况下,我们......
  • 基于 easyExcel 3.1.5依赖的包 实现动态表头 动态表格内容
    1.需求:需要导出的EXCEL示例: 2.依赖:<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.5</version></dependency>3.工具类:package......