C# 利用epplus导出excel,自动求和
/// <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,自动求和的更多相关文章
- 利用PHPExcel导出excel 以及利用js导出excel
导出excel的方法output_excel需要依赖PHPExcel 导出csv的方法csv_export不需要 <?php /** * @author ttt */ class ExcelCo ...
- C# NPOI导出Excel和EPPlus导出Excel比较
系统中经常会使用导出Excel的功能. 之前使用的是NPOI,但是导出数据行数多就报内存溢出. 最近看到EPPlus可以用来导出Excel,就自己测了下两者导出上的差异. NPIO官网地址:http: ...
- 利用Servlet导出Excel
-----因为Excel可以打开HTML文件,因此可以利用页面的Form表单把页面中的table内容提交给Servlet,然后后台把提交上来的table内容转换成文件流的形式,并以下载的形式转给客户端 ...
- C# NPOI导出Excel和EPPlus导出Excel
转自:http://www.cnblogs.com/tanpeng/p/6155749.html 系统中经常会使用导出Excel的功能.之前使用的是NPOI,但是导出数据行数多就报内存溢出. 最近看到 ...
- C# 使用Epplus导出Excel [5]:样式
C# 使用Epplus导出Excel [1]:导出固定列数据 C# 使用Epplus导出Excel [2]:导出动态列数据 C# 使用Epplus导出Excel [3]:合并列连续相同数据 C# 使用 ...
- C# 使用Epplus导出Excel [4]:合并指定行
C# 使用Epplus导出Excel [1]:导出固定列数据 C# 使用Epplus导出Excel [2]:导出动态列数据 C# 使用Epplus导出Excel [3]:合并列连续相同数据 C# 使用 ...
- C# 使用Epplus导出Excel [3]:合并列连续相同数据
C# 使用Epplus导出Excel [1]:导出固定列数据 C# 使用Epplus导出Excel [2]:导出动态列数据 C# 使用Epplus导出Excel [3]:合并列连续相同数据 C# 使用 ...
- C# 使用Epplus导出Excel [2]:导出动态列数据
C# 使用Epplus导出Excel [1]:导出固定列数据 C# 使用Epplus导出Excel [2]:导出动态列数据 C# 使用Epplus导出Excel [3]:合并列连续相同数据 C# 使用 ...
- C# 使用Epplus导出Excel [1]:导出固定列数据
C# 使用Epplus导出Excel [1]:导出固定列数据 C# 使用Epplus导出Excel [2]:导出动态列数据 C# 使用Epplus导出Excel [3]:合并列连续相同数据 C# 使用 ...
- C# EPPlus导出EXCEL,并生成Chart表
一 在negut添加EPPlus.dll库文件. 之前有写过直接只用Microsoft.Office.Interop.Excel 导出EXCEL,并生成Chart表,非常耗时,所以找了个EPPlus ...
随机推荐
- 神经网络之卷积篇:详解边缘检测示例(Edge detection example)
详解边缘检测示例 卷积运算是卷积神经网络最基本的组成部分,使用边缘检测作为入门样例.在这个博客中,会看到卷积是如何进行运算的. 在之前的博客中,说过神经网络的前几层是如何检测边缘的,然后,后面的层有可 ...
- 二分答案&前缀和&差分&离散化(简记)
二分答案 基本code int Find(int l,int r) { int ans,mid; while(l<=r) { int mid=l+r>>1; if(Check(mid ...
- AC自动机 提高篇
文本生成器 首先考虑一个容斥,算出不包含任何一个单词的文章的数量. 我们设 \(dp_{i,j}\) 表示当前文章长度为 \(i\),最后一个字符在 \(AC\) 自动机上的 \(j\) 号点的方案数 ...
- 为了给Javaer落地DDD,我们不得不写开源组件
本文上回书接<这是DDD建模最难的部分(其实很简单)>,欢迎关注我的同名公众号. https://mp.weixin.qq.com/s/HZKMLF0_I10iczzp2mAR-w 故 ...
- DRM:清华提出无偏差的新类发现与定位新方法 | CVPR 2024
论文分析了现有的新类别发现和定位(NCDL)方法并确定了核心问题:目标检测器往往偏向已知的目标,忽略未知的目标.为了解决这个问题,论文提出了去偏差区域挖掘(DRM)方法,以互补的方式结合类无关RPN和 ...
- Kolmogorov-Smirnov 检验 + k 样本 Anderson-Darling 检验 + 贝叶斯估计 + 期望方差
KS 检验是基于 Kolmogorov distribution,指的是 \[K=\sup_{t\in[0,1]}\left\lvert B(t)\right\rvert \] 式中 \(B(t)\) ...
- 9k star 监控系统,100% 国产,推荐了解
前言 监控系统的重要性不言而喻,国内用的最多的应该是 Zabbix 和 Prometheus,其优缺点: Zabbix 是资产管理式,监控数据存在数据库中,擅长设备监控,不擅长微服务和云原生环境的监控 ...
- Ynoi2016镜中的昆虫
[Ynoi 2016] 镜中的昆虫 简化题意 给定长为 \(n\) 序列 \(a\) , 两种操作 \(m\) 次: 1 l r x : 将 \([l , r]\) 修改为 \(x\) 2 l r : ...
- 充分利用HarmonyOS NEXT:开发者的全功能指南
随着技术的不断进步,开发者们面临着如何在复杂的技术环境中创造出卓越应用的挑战.在当今的科技浪潮中,如何抓住创新的机遇?HarmonyOS NEXT的发布,带来了全新的机遇和功能.本文将探讨开发者如何充 ...
- 理解async 和 await
await 后面接的是promise,await语句下面(注意:不是await后面,而是await所在语句的下面,即下行以后)的代码就相当在promise.then()里面执行,有文章说 await后 ...