动态列 Excel 导出

/// <summary>
/// 导出数据通用属性 需在属性进行标记
/// </summary>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Parameter | AttributeTargets.Property)]
public class ExportToExcelAttribute : Attribute
{
  private string _columnName;
  private int _width = 19;

  public ExportToExcelAttribute(string columnName)
  {
    this._columnName = columnName;
  }

  public ExportToExcelAttribute(string columnName, int columnWidth)
  {
    this._columnName = columnName;
    this._width = columnWidth;
  }

  public string ColumnName { get { return _columnName; } }
  public int ColumnWidth { get { return _width; } }

}

 

public class ClassA

{

     int id =0;

     string name=string.Empty;

  [ExportToExcel("ID", 25)]
  public int Id
  {
    get { return Id; }
    set { Id= value; }
  }

  [ExportToExcel("Name", 25)]
  public int Id
  {
    get { return Id; }
    set { Id= value; }
  }

}

public class ExcelHelper

{

  public void CreateReportToExcel()

  {

    var data = new List<ClassA>()

    {

      new ClassA(){Id=1,Name="张三“},new ClassA(){Id=2,Name="张四”}

    };

    var expressList = new List<Expression<Func<ClassA, object>>>() {{m=>m.Id},{m=>m.Name}};

    Aspose.Cells.Workbook workbook=GetExportWorkbook<ClassA>(expressList,data,"ExcelSheet1");

 

    

    Response.BinaryWrite(workbook.SaveToStream().ToArray());
    Response.AppendHeader("Content-Disposition", "attachment;filename=\"" + HttpUtility.UrlEncode("" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xls", System.Text.Encoding.UTF8) + "\"");
    Response.ContentType = "application/ms-excel";

  }

 

  /// <summary>
  /// 数据导出到excel通用方法
  /// </summary>
  /// <typeparam name="T"></typeparam>
  /// <param name="expressList"></param>
  /// <param name="datas"></param>
  /// <param name="WorksheetName"></param>
  /// <returns></returns>
  public static Workbook GetExportWorkbook<T>(List<Expression<Func<T, object>>> expressList, List<T> datas, string WorksheetName)
  {
  List<PropertyInfo> proList = new List<PropertyInfo>();//字段属性集合
  PropertyInfo pro;
  ExportToExcelAttribute att;

  Workbook work = new Workbook();
  work.Worksheets.Clear();
  Worksheet sheet = null;

  if (datas.Count > 0)
  {
    work.Worksheets.Add(WorksheetName);
    sheet = work.Worksheets[0];
    sheet.Cells.SetRowHeight(0, 30);
    int i = 0;
    foreach (var item in expressList)
    {
      pro = GetProperty(item);
      proList.Add(pro);
      att = pro.GetCustomAttribute<ExportToExcelAttribute>();
      sheet.Cells[0, i++].PutValue(att.ColumnName);
      sheet.Cells.SetColumnWidth(i - 1, att.ColumnWidth);
    }

    //单元格
    Cells cells = sheet.Cells;
    Style style1 = work.Styles[work.Styles.Add()];
    style1.HorizontalAlignment = TextAlignmentType.Center;    
    style1.Font.Name = "宋体";
    style1.Font.Size = 11;
    style1.IsLocked = true;
    style1.Font.IsBold = true;

    int n = 1;
      foreach (T item in datas)
      {
        int j = 0;
        foreach (var p in proList)
        {  
          sheet.Cells[n, j++].PutValue(p.GetValue(item));
        }
        n += 1;
      }
     }

     return work;

   }

  }

 

转载于:https://www.cnblogs.com/newnj/p/6647354.html

### 使用 EasyExcel 实现动态列导出 为了实现动态列导出功能,可以利用 `EasyExcel` 提供的灵活性来构建动态表头和数据结构。下面是一个完整的示例代码展示如何根据不同的需求动态调整要导出的数据列。 #### 动态设置表头与数据模型 当面对不同场景下的列变化时,可以通过反射机制或者手动配置的方式创建对应的实体类属性映射关系。这里提供一种基于 Map 的解决方案,在不修改原有实体的情况下完成多变的需求适配[^1]。 ```java import com.alibaba.excel.EasyExcel; import com.alibaba.excel.write.metadata.WriteSheet; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class DynamicColumnExport { public static void main(String[] args) { // 定义文件路径 String fileName = "dynamic_columns.xlsx"; // 构建动态字段列表 List<String> dynamicHeaders = new ArrayList<>(); dynamicHeaders.add("姓名"); dynamicHeaders.add("年龄"); dynamicHeaders.add("地址"); // 准备数据源 List<Map<Integer, String>> dataList = prepareDynamicData(dynamicHeaders); // 创建写入工作簿对象 WriteSheet writeSheet = EasyExcel.writerSheet().build(); // 执行写出操作 try { EasyExcel.write(fileName).sheet("动态列").doWrite(data -> { data.forEach(rowMap -> { rowMap.values().forEach(cellValue -> System.out.print(cellValue + "\t")); System.out.println(); }); }, writeSheet); } catch (Exception e) { throw new RuntimeException(e); } } /** * 模拟准备一些测试数据 */ private static List<Map<Integer, String>> prepareDynamicData(List<String> headers) { List<Map<Integer, String>> result = new ArrayList<>(); for (int i = 0; i < 5; i++) { // 假设有五条记录 Map<Integer, String> rowData = new HashMap<>(); int index = 0; for (String header : headers) { switch (header) { case "姓名": rowData.put(index++, "张三" + i); break; case "年龄": rowData.put(index++, String.valueOf(20 + i)); break; case "地址": rowData.put(index++, "北京市朝阳区" + i); break; default: rowData.put(index++, ""); } } result.add(rowData); } return result; } } ``` 此段代码展示了如何通过传递给方法的不同参数来自动生成相应的 Excel 行内容,并且可以根据实际应用场景灵活增减列数以及更改每列的名字和顺序[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值