WeihanLi.Npoi 根据模板导出Excel

WeihanLi.Npoi 根据模板导出Excel

Intro

原来的导出方式比较适用于比较简单的导出,每一条数据在一行,数据列虽然自定义程度比较高,如果要一条数据对应多行就做不到了,于是就想支持根据模板导出,在 1.8.0 版本中引入了根据模板导出的功能

使用示例

示例模板

模板规划的可以有三种数据:

  • Global:一个是导出的时候可以指定一些参数,作为 Global 参数,默认参数格式使用: $(Global:PropName) 的格式
  • Header:配置的对应属性的显示名称,默认是属性名称,默认参数格式:$(Header:PropName)
  • Data:对应数据的属性值,默认参数格式:$(Data:PropName)

默认模板参数格式(从 1.8.2 版本开始支持通过 TemplateHelper.ConfigureTemplateOptions 方法来自定义):

  • Global 参数:$(Global:{0})
  • Header 参数:$(Header:{0})
  • Data 参数:$(Data:{0})
  • Data Begin: <Data>
  • Data End: </Data>

模板规范:

模板需要通过 Data Begin 和 Data End 来配置数据模板的开始和结束以识别每一个数据对应的开始行和结束行

示例代码

示例配置

var setting = ExcelHelper.SettingFor<TestEntity>();
// ExcelSetting
setting.HasAuthor("WeihanLi")
    .HasTitle("WeihanLi.Npoi test")
    .HasDescription("WeihanLi.Npoi test")
    .HasSubject("WeihanLi.Npoi test");

setting.HasSheetConfiguration(0, "SystemSettingsList", 1, true);

setting.Property(_ => _.SettingId)
    .HasColumnIndex(0);

setting.Property(_ => _.SettingName)
    .HasColumnTitle("SettingName")
    .HasColumnIndex(1);

setting.Property(_ => _.DisplayName)
    .HasOutputFormatter((entity, displayName) => $"AAA_{entity.SettingName}_{displayName}")
    .HasInputFormatter((entity, originVal) => originVal.Split(new[] { '_' })[2])
    .HasColumnTitle("DisplayName")
    .HasColumnIndex(2);

setting.Property(_ => _.SettingValue)
    .HasColumnTitle("SettingValue")
    .HasColumnIndex(3);

setting.Property(x => x.Enabled)
    .HasColumnInputFormatter(val => "启用".Equals(val))
    .HasColumnOutputFormatter(v => v ? "启用" : "禁用");

setting.Property("HiddenProp")
    .HasOutputFormatter((entity, val) => $"HiddenProp_{entity.PKID}");

setting.Property(_ => _.PKID).Ignored();
setting.Property(_ => _.UpdatedBy).Ignored();
setting.Property(_ => _.UpdatedTime).Ignored();

根据模板导出示例代码:

var entities = new List<TestEntity>()
{
    new TestEntity()
    {
        PKID = 1,
        SettingId = Guid.NewGuid(),
        SettingName = "Setting1",
        SettingValue = "Value1",
        DisplayName = "ddd1"
    },
    new TestEntity()
    {
        PKID=2,
        SettingId = Guid.NewGuid(),
        SettingName = "Setting2",
        SettingValue = "Value2",
        Enabled = true
    },
};
var csvFilePath = [email protected]"{tempDirPath}\test.csv";
entities.ToExcelFileByTemplate(
    Path.Combine(ApplicationHelper.AppRoot, "Templates", "testTemplate.xlsx"),
    ApplicationHelper.MapPath("templateTestEntities.xlsx"),
    extraData: new
    {
        Author = "WeihanLi",
        Title = "导出结果"
    }
);

导出结果

More

为了方便使用,增加了一些方便的扩展方法:

public static int ToExcelFileByTemplate<TEntity>([NotNull]this IEnumerable<TEntity> entities, string templatePath, string excelPath, int sheetIndex = 0, object extraData = null);

public static int ToExcelFileByTemplate<TEntity>([NotNull]this IEnumerable<TEntity> entities, byte[] templateBytes, string excelPath, ExcelFormat excelFormat = ExcelFormat.Xls, int sheetIndex = 0, object extraData = null);

public static int ToExcelFileByTemplate<TEntity>([NotNull]this IEnumerable<TEntity> entities, IWorkbook templateWorkbook, string excelPath, int sheetIndex = 0, object extraData = null);

public static byte[] ToExcelBytesByTemplate<TEntity>([NotNull]this IEnumerable<TEntity> entities, string templatePath, int sheetIndex = 0, object extraData = null);

public static byte[] ToExcelBytesByTemplate<TEntity>([NotNull]this IEnumerable<TEntity> entities, byte[] templateBytes, ExcelFormat excelFormat = ExcelFormat.Xls, int sheetIndex = 0, object extraData = null);

public static byte[] ToExcelBytesByTemplate<TEntity>([NotNull]this IEnumerable<TEntity> entities, Stream templateStream, ExcelFormat excelFormat = ExcelFormat.Xls, int sheetIndex = 0, object extraData = null);

public static byte[] ToExcelBytesByTemplate<TEntity>([NotNull]this IEnumerable<TEntity> entities, IWorkbook templateWorkbook, int sheetIndex = 0, object extraData = null);

public static byte[] ToExcelBytesByTemplate<TEntity>([NotNull]this IEnumerable<TEntity> entities, ISheet templateSheet, object extraData = null);

Reference

原文地址:https://www.cnblogs.com/weihanli/p/12238048.html

时间: 2024-08-01 10:46:37

WeihanLi.Npoi 根据模板导出Excel的相关文章

NPOI根据模板导出Excel

上篇讲到使用Office Com组件的方式导出Excel,本篇讲一种个人认为更普遍的方式:NPOI,它无需服务器上安装Office,如果玩NPOI比较熟的话,个人更推荐使用这种方式. 本篇将介绍基本的导出Excel的方法,和合并单元格,设置单元格样式和如何插入图片等. 1.添加对NPOI.dll的引用,引入命名空间: 1 using NPOI; 2 using NPOI.HPSF; 3 using NPOI.HSSF.UserModel; 4 using NPOI.POIFS.FileSyste

aspose.cells根据模板导出excel

又隔十多天没写博客了,最近都在忙项目的事情,公司人事变动也比较大,手头上就又多了一个项目.最近做用aspose.cells根据模板导出excel报价单的功能,顺便把相关的核心记下来,先上模板和导出的效果图吧,如下: 导出效果图(看到产品图,打不死的程(diao)序(si)员(猿)骚动吧,有没有不禁看了看自己粗大的右手): (其中红色框框起来的是动态填充的内容,工作薄名(产品信息)也是动态输出的) 模板如下: 大概流程是这样,先把需要输出到excel的内容存到一个model里面,然后把该model

npoi实现数据导出Excel

npoi .NET第三方的Office功能组件. 链接地址 http://npoi.codeplex.com/ 引用命名空间 using NPOI.HSSF.UserModel; using NPOI.HPSF; using NPOI.POIFS.FileSystem; using NPOI.SS.UserModel; 功能代码 /// <summary> /// 操作EXCEL导出数据报表的类 /// </summary> public class DataToExcel { /

POI通过模板导出EXCEL文件

一般的EXCEL导出使用POI先创建一个HSSFWorkbook,然后通过不断创建HSSFRow,HSSFCell后设置单元格内容便可以完成导出. 这次在项目中需要用到模板,导出的内容包括(1.模板中的内容.样式.2.自己需要新增的内容.样式.),还需要设置单元格的样式,在网上搜了一些blog,完成后记录一下. 分析这次需求,最关键的就是如何获取到填充了模板的新HSSFWorkbook,如果获取到它,我们可以熟练的往里面添加内容. 1 File fi = new File("F:/usr/use

apache poi根据模板导出excel

需要预先新建编辑好一个excel文件,设置好样式. 编辑好输出的数据,根据excel坐标一一对应. 支持列表数据输出,列表中列合并. 代码如下: package com.icourt.util; import org.apache.commons.collections4.CollectionUtils; import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.ss.user

C#使用模板导出Excel

前言:此随笔仅供自己学习,如有不足请指出 在某些情况导出的时候,会有很复杂的表头或者样式,如果靠代码去调整的话回很麻烦,需要写很多代码,这个时候可以预先设置好表格,这样就方便灵活很多. /// <summary> /// 使用模板导出Excel /// </summary> /// <param name="listEntity">数据集</param> /// <param name="path">路径&

JXLS模板导出EXCEL

最近做要做一些报表导出的功能,由于表格内容比较复杂,直接生成excel比较麻烦,所以采用模板的方式来做,可惜自己不了解,也证明了自己技术有多差!通过多次资料,终于找到了适合自己的方法.特此记录,方便以后查找. maven用到的包  <dependency>     <groupId>net.sf.jxls</groupId>     <artifactId>jxls-core</artifactId>     <version>1.0

Office Com组件根据模板导出Excel

导出Excel最普遍的方式有两种,一种是使用Office Com组件,另一种是使用NPOI. 个人感觉Office Com组件功能更强大,操作Excel和设置样式等都非常方便,但它要求服务器上必须安装Office,而且受Office版本的影响.NPOI允许服务器上不安装Office,但是设置Office样式等,比Office Com组件要麻烦的多.具体使用那种要根据实际的项目来决定.本文简单列举Office Com组件一个应用小实例,NPOI的方式将在下一篇讲到. 1.添加对Microsoft.

OfficeOpenXml.Entends 根据模板导出Excel

OfficeOpenXml.Entends 是一个OfficeOpenXml拓展,用于根据模板输出excel,依赖于EPPlus(码农一致好评,其API操作及友好程度要高于 NPOI),可以直接在NuGet中获取 OfficeOpenXml.Entends 1.0.1.0 用法介绍,直接上代码吧 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using OfficeOpenXml; 5 usi