/// <summary>
/// 生成xlsx
/// </summary>
/// <param name="dvLine">数据视图</param>
/// <param name="sheetName">sheetName</param>
/// <param name="englishName">要导出的视图对应列名称</param>
/// <param name="chinseName">要导出的数据对应列在excel里显示的中文名称</param>
/// <param name="sumColNames">要求合的列名称</param>
/// <param name="totNameIndex">显示"合计:"的列的序号,比如对a-c列合并显示"合计:"传3(c)</param>
public ExcelPackage CreateXlsx(DataView dvLine, string sheetName, string[] englishName, string[] chinseName, List<string> sumColNames, int totNameIndex)
{
if (dvLine.Count <= 0) return null;
ExcelPackage pck = new ExcelPackage();
var ws = pck.Workbook.Worksheets.Add(sheetName);
ExcelWorksheet worksheet = ws as ExcelWorksheet;
int rowIndex = 1;
int colIndex = 1;
ExcelRange rg = null;
//标题
rg = worksheet.Cells[rowIndex, colIndex, rowIndex, colIndex + chinseName.Length];
rg.Value = sheetName;
rg.Merge = true;
rg.Style.Font.Bold = true;
rg.Style.Font.Size = 14;
rowIndex++;
//列标题
rg = worksheet.Cells[rowIndex, colIndex++];
rg.Value = "序号";
rg.Style.Font.Bold = true;
rg.Style.Font.Size = 13;
for (int i = 0; i < chinseName.Length; i++)
{
rg = worksheet.Cells[rowIndex, colIndex++];
rg.Value = chinseName[i];
rg.Style.Font.Bold = true;
rg.Style.Font.Size = 13;
}
//填充数据
rowIndex++;
Dictionary<string, Decimal> dic = new Dictionary<string, Decimal>(); //存放求和列的合计值
//求和初始值设为0
foreach (string col in sumColNames)
{
dic.Add(col, 0);
}
int rowNum = 1;
for (int i = 0; i < dvLine.Count; i++) //循环数据表
{
colIndex = 1;
//序号
rg = worksheet.Cells[rowIndex, colIndex++];
rg.Value = rowNum++;
rg.Style.Font.Size = 12;
//数据
for (int j = 0; j < englishName.Length; j++) //对视图里指定的列填充数据
{
rg = worksheet.Cells[rowIndex, colIndex];
string data = (dvLine[i][englishName[j]] != null) ? dvLine[i][englishName[j]].ToString() : "";
//如果是需要求和的列,将值转换为数字型
if (sumColNames.Contains(englishName[j]))
{
Decimal rtnV = 0;
Decimal.TryParse(data, out rtnV);
rg.Value = rtnV;
dic[englishName[j]] += rtnV;//未和
//循环到DV的最后一行时,填充合计值
if (i == dvLine.Count - 1)
{
rg = worksheet.Cells[rowIndex + 1, colIndex];
rg.Value = dic[englishName[j]];
}
}
else
{
rg.Value = data;
}
rg.Style.Font.Size = 12;
colIndex++;
}
rowIndex++;
} rg = worksheet.Cells[rowIndex, totNameIndex];
rg.Value = "合计:"; worksheet.Cells.AutoFitColumns();
worksheet.Cells.Style.VerticalAlignment = ExcelVerticalAlignment.Center; //居中
worksheet.Cells.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center; //居中 return pck;
}
/// <summary>
/// 保存为xlsx文件
/// </summary>
/// <param name="dvLine">数据视图</param>
/// <param name="fileName">文件名称不带后缀名</param>
/// <param name="englishName">要导出的视图对应列名称</param>
/// <param name="chinseName">要导出的数据对应列在excel里显示的中文名称</param>
/// <param name="sumColNames">要求合的列名称</param>
/// <param name="totNameIndex">显示"合计:"的列的序号,比对a-c列合并显示"合计:"传3(c)</param>
/// <param name="filePath">导出文件路径,D:\1\</param>
public void SaveAsXlsx(DataView dvLine, string fileName, string[] englishName, string[] chinseName, List<string> sumColNames, int totNameIndex, string filePath)
{
ExcelPackage pck = CreateXlsx(dvLine, fileName, englishName, chinseName, sumColNames, totNameIndex);
if (!System.IO.Directory.Exists(filePath))
{
System.IO.Directory.CreateDirectory(filePath);
}
using (System.IO.FileStream file = new System.IO.FileStream(filePath + fileName + ".xlsx", System.IO.FileMode.Create))
{
byte[] byData = pck.GetAsByteArray();
file.Seek(0, System.IO.SeekOrigin.Begin);
file.Write(byData, 0, byData.Length);
file.Close();
}
pck.Dispose(); //web页面的导出方法
/*
System.Web.HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
System.Web.HttpContext.Current.Response.AddHeader("content-disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8) + ".xlsx");
System.Web.HttpContext.Current.Response.BinaryWrite(pck.GetAsByteArray());
System.Web.HttpContext.Current.Response.Flush();
System.Web.HttpContext.Current.Response.Close();*/
}
        /// <summary>
/// 读取xlsx数据到DataTable
/// </summary>
/// <param name="fileName"></param>
/// <param name="sheetIndex">要读取的excel文件里sheet索引</param>
/// <returns></returns>
public DataTable Read(string fileName, int sheetIndex)
{
DataTable dt = null;
if (File.Exists(fileName))
{
try
{
FileInfo excel = new FileInfo(fileName);
ExcelPackage package = new ExcelPackage(excel);
int sheetCount = package.Workbook.Worksheets.Count; //获取总Sheet页
if (sheetCount >= sheetIndex)
{
ExcelWorksheet worksheet = package.Workbook.Worksheets[sheetIndex];//选定指定页
int maxColumnNum = worksheet.Dimension.End.Column;//最大列
int minColumnNum = worksheet.Dimension.Start.Column;//最小列
int maxRowNum = worksheet.Dimension.End.Row;//最小行
int minRowNum = worksheet.Dimension.Start.Row;//最大行
dt = new DataTable();
for (int i = minColumnNum; i <= maxColumnNum; i++)
{
DataColumn dc = new DataColumn(i.ToString(), typeof(string));
dt.Columns.Add(dc);
}
for (int i = minRowNum; i <= maxRowNum; i++)
{
DataRow dr = dt.NewRow();
for (int j = minColumnNum; j <= maxColumnNum; j++)
{
ExcelRange range = worksheet.Cells[i, j];
if (range != null && range.Value != null)
{
dr[j.ToString()] = range.Value.ToString();
}
}
dt.Rows.Add(dr);
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
return dt;
}

  epplus下载  http://epplus.codeplex.com/

C# 利用epplus导出excel,自动求和的更多相关文章

  1. 利用PHPExcel导出excel 以及利用js导出excel

    导出excel的方法output_excel需要依赖PHPExcel 导出csv的方法csv_export不需要 <?php /** * @author ttt */ class ExcelCo ...

  2. C# NPOI导出Excel和EPPlus导出Excel比较

    系统中经常会使用导出Excel的功能. 之前使用的是NPOI,但是导出数据行数多就报内存溢出. 最近看到EPPlus可以用来导出Excel,就自己测了下两者导出上的差异. NPIO官网地址:http: ...

  3. 利用Servlet导出Excel

    -----因为Excel可以打开HTML文件,因此可以利用页面的Form表单把页面中的table内容提交给Servlet,然后后台把提交上来的table内容转换成文件流的形式,并以下载的形式转给客户端 ...

  4. C# NPOI导出Excel和EPPlus导出Excel

    转自:http://www.cnblogs.com/tanpeng/p/6155749.html 系统中经常会使用导出Excel的功能.之前使用的是NPOI,但是导出数据行数多就报内存溢出. 最近看到 ...

  5. C# 使用Epplus导出Excel [5]:样式

    C# 使用Epplus导出Excel [1]:导出固定列数据 C# 使用Epplus导出Excel [2]:导出动态列数据 C# 使用Epplus导出Excel [3]:合并列连续相同数据 C# 使用 ...

  6. C# 使用Epplus导出Excel [4]:合并指定行

    C# 使用Epplus导出Excel [1]:导出固定列数据 C# 使用Epplus导出Excel [2]:导出动态列数据 C# 使用Epplus导出Excel [3]:合并列连续相同数据 C# 使用 ...

  7. C# 使用Epplus导出Excel [3]:合并列连续相同数据

    C# 使用Epplus导出Excel [1]:导出固定列数据 C# 使用Epplus导出Excel [2]:导出动态列数据 C# 使用Epplus导出Excel [3]:合并列连续相同数据 C# 使用 ...

  8. C# 使用Epplus导出Excel [2]:导出动态列数据

    C# 使用Epplus导出Excel [1]:导出固定列数据 C# 使用Epplus导出Excel [2]:导出动态列数据 C# 使用Epplus导出Excel [3]:合并列连续相同数据 C# 使用 ...

  9. C# 使用Epplus导出Excel [1]:导出固定列数据

    C# 使用Epplus导出Excel [1]:导出固定列数据 C# 使用Epplus导出Excel [2]:导出动态列数据 C# 使用Epplus导出Excel [3]:合并列连续相同数据 C# 使用 ...

  10. C# EPPlus导出EXCEL,并生成Chart表

    一  在negut添加EPPlus.dll库文件. 之前有写过直接只用Microsoft.Office.Interop.Excel 导出EXCEL,并生成Chart表,非常耗时,所以找了个EPPlus ...

随机推荐

  1. 【转载】 在PyTorch训练一个epoch时,模型不能接着训练,Dataloader卡死——在pytorch中尽量不要使用opencv而是使用PIL

    版权声明:本文为CSDN博主「时光碎了天」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/u013289254/ ...

  2. (持续更新)国内计算机领域相关的SCI和EI期刊,以及好中的SCI和EI期刊(不限国内外)

    好中的: SCI刊: EI刊: EI会议: 参考: CCF发布计算领域高质量科技期刊分级目录   国内的: SCI-Expanded   1. <Journal of Computer Scie ...

  3. [CEOI2007] 树的匹配 Treasury 题解

    前言 题目链接:洛谷. 题目简述 给一棵树,问你这棵树的最大匹配是多少,并且计算出有多少种最大匹配. 题目分析 先来考虑较简单的最大匹配数.对于某一个结点,它有以下三种状态: 不参与匹配: 和某一个儿 ...

  4. net8实现MediatR小示例C#

    MediatR是.net下的一个实现消息传递的库,简洁高效,它采用中介者设计模式,通过进程内消息传递机制,进行请求/响应.命令.查询.通知和事件的消息传递,可通过泛型来支持消息的智能调度,用于领域事件 ...

  5. windows权限维持汇总

    Windows 权限维持 一.文件层面 1)attrib 使用 Attrib +s +a +h +r 命令 s:设置系统属性(System) a:设置存档属性(Archive) h:设置隐藏属性(Hi ...

  6. Maven 配置程序入口

    配置单个程序入口 Exec Maven Plugin 插件允许你在 Maven 生命周期中的某个阶段直接运行 Java 类. 在你的 pom.xml 文件中添加如下配置: <project> ...

  7. diff 输出解释

    diff 最原始的 diff 我们先编写两个文件: f1: 1 2 3 4 5 6 7 8 9 f2: 1 2 3 4 5 66 7 8 9 然后我们进行比较: diff f1 f2 6c6 < ...

  8. 005.MinIO-DirectPV分布式多租户存储部署

    MinIO部署准备 部署概述 本实验结合Kubernetes进行MinIO部署,实现MinIO于Kubernetes的融合. minio官方支持通过简单的快速部署,以便于进行基础测试: curl ht ...

  9. 基于GitLab+Jenkin-CICD方案实践

    前言 笔录于2022- 官网:https://about.gitlab.com/ 参考文档:https://docs.gitlab.com/ee/ci/ 清华源:清华大学开源软件镜像站 | Tsing ...

  10. 【LLM训练系列】从零开始训练大模型之Phi2-mini-Chinese项目解读

    一.前言 本文主要是在复现和实践Phi2-mini-Chinese后,简要分析下Phi2-mini-Chinese这个项目,做一个学习实战总结. 原文发布于知乎:https://zhuanlan.zh ...