〇、前言
对于将数据以 Excel 表格文件输出,还是比较常用的,也存在诸多情况,比如列固定或不固定、数据类型为 List或 Json 对象等。
本文通过包 OfficeOpenXml.Extension.AspNetCore 实现两个方法导出列数固定和不固定的数据。
注意:OfficeOpenXml.Extension.AspNetCore 是一个基于 OfficeOpenXml 拓展,它依赖于 EPPlus,用于根据模板输出 Excel。
包控制台安装:
NuGet> Install-Package OfficeOpenXml.Extension.AspNetCore -Version 1.0.0
一、根据已知类型对象 List 下载
本章节方法适用背景:
数据列数固定,且可罗列。
对于对象 List 的属性,一般不会命名为汉字,那么就需要将列名转换为汉字,以方便数据清晰显示。
如下为一个基于 WebAPI 项目的固定列数,动态行数的下载实例:
// 安装包:OfficeOpenXml.Extension.AspNetCore // 支持 Core 3.1 及以上,Standard 2.0 及以上
using OfficeOpenXml;
using OfficeOpenXml.Style;
using Microsoft.AspNetCore.Mvc; // File 支持
[HttpGet]
public FileContentResult DownloadInfo()
{
try
{
string sql_datalist = "";
var resultlist = dapperFactory.Query(sql_datalist).ToList();
string sFileName = $"{Guid.NewGuid()}.xlsx";
FileInfo fileinfo = new FileInfo(System.IO.Path.Combine("C:/Files", sFileName));
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
using (ExcelPackage package = new ExcelPackage(fileinfo))
{
// 添加 worksheet
ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("明细表");
// 添加头
worksheet.Cells[1, 1].Value = "序号";
worksheet.Cells[1, 2].Value = "公司";
worksheet.Cells[1, 3].Value = "日期";
// 添加值
for (int i = 0; i
二、动态列数据库下载
本章节方法适用背景:
数据列数不固定,且可循环取出,表头和对应的数据顺序相同。
动态列就是,列总数不固定,程序根据传入的列数确定第一行表头。
下面是一个根据 json 字符串,以 Excel 文件形式保存数据的实例。其中包含 “tableheader”节点,来指定动态表头;“tablebody”代表全部数据列表。
// 安装包:OfficeOpenXml.Extension.AspNetCore // 支持 Core 3.1 及以上,Standard 2.0 及以上
// 由于 Excel 2003 版本 和 2007 之后版本文件结构的差异性,当前扩展无法同时兼容两种模式,仅支持 *.xlsx 文件
using OfficeOpenXml;
using OfficeOpenXml.Style;
public void DownloadByJsonstr(string xiazaisj)
{
// string jsonstr = "{"tableheader":[{"mingcheng":"列名一","daima":"bumenx1","shifoutz":true},{"mingcheng":"列名二","daima":"bumenx2","shifoutz":true}],"tablebody":[{"kemumc":"科目一","bumenx1":0.12,"bumenx2":6.0,"heji":6.12,"erjimx":[{"kemumc":"科目一明细科目1","bumenx1":0.0,"bumenx2":9.82,"heji":9.82},{"kemumc":"科目一明细科目2","bumenx1":0.12,"bumenx2":6.18,"heji":6.3}]}]}";
var baobiaosj_json = Json_Object.StrToJson(xiazaisj);
var tableheader = xiazaisj_json["tableheader"];
// 前两列表头固定
List headersname = new List(){ "科目", "合计" }; // 用于显示
List headerscode = new List(){ "kemumc", "heji" }; // 用于取值
// 从第三列开始,按默认顺序加入后续表头
foreach (var thj in tableheader)
{
headersname.Add(thj["mingcheng"].ToString());
headerscode.Add(thj["daima"].ToString());
}
string sFileName = $"{Guid.NewGuid()}.xlsx";
FileInfo fileinfo = new FileInfo(System.IO.Path.Combine("C:/Log", sFileName));
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
List tableRowModels = new List();
using (ExcelPackage package = new ExcelPackage(fileinfo))
{
ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("数据表");
EpplusHelper.AddHeader(worksheet, headersname.ToArray()); // 添加表头
var tablebody = xiazaisj_json["tablebody"];
TableRowModel tableRowModel = new TableRowModel();
Dictionary keyValuePairs = new Dictionary();
foreach (var tablebody_first in tablebody)
{
tableRowModel = new TableRowModel();
keyValuePairs = new Dictionary();
tableRowModel.kemumc = tablebody_first["kemumc"].ToString(); // "kemumc": "成本"
tableRowModel.heji = tablebody_first["heji"].ToString();
for (int ii = 2; ii ();
tableRowModel.kemumc = tablebody_second["kemumc"].ToString(); // "kemumc": "成本"
tableRowModel.heji = tablebody_second["heji"].ToString();
for (int ii = 2; ii 0)
{
//添加动态数据
EpplusHelper.AddObjects(worksheet, 2, tableRowModels, headerscode);
}
worksheet.Column(1).Width = 20; // 设置列宽
worksheet.Column(2).Width = 20;
for (int ii = 3; ii
EpplusHelper.cs 类,用作循环添加表头和数据。
using System;
using System.Collections.Generic;
using OfficeOpenXml;
public static class EpplusHelper
{
///
/// 通过 名称数组 添加表头
///
///
///
public static void AddHeader(ExcelWorksheet sheet, params string[] headertexts)
{
for (var i = 0; i
/// 添加动态数据
///
///
/// 从第几行开始
/// 行数据列表
/// 列名代码列表,用于取数据
public static void AddObjects(ExcelWorksheet worksheet, int startrowindex, IList items, List headerscode)
{
for (var i = 0; i
代码参考:C# 使用Epplus导出Excel [2]:导出动态列数据
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
相关推荐: 2019-8-12软测3班selenium第一天笔记
selenium:Web UI层面的自动化测试框架 配置selenium环境 1、selenium jar包的导入 2、浏览器驱动路径配置到PATH中 3、浏览器执行路径配置到PATH中 版本: 1.0 RC 2.0 WebDriver 3.0…