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 ...
随机推荐
- 一直让 PHP 程序员懵逼的同步阻塞异步非阻塞,终于搞明白了
大家好,我是码农先森. 经常听到身边写 Java.Go 的朋友提到程序异步.非阻塞.线程.协程,让系统性能提高到百万.千万并发,使我甚是惊讶属实羡慕.对于常年写 PHP 的我来说,最初听到这几个词时, ...
- [COCI 2023/2024 #1] Mostovi 题解
前言 题目链接:洛谷. 题目分析 首先可以确定的是需要枚举断边,所以我们希望两次枚举之间能有些关联.不难想到类树形 DP 的套路,建 DFS 树,只不过这题除了讨论和父亲之间的边,还要考虑返租边.以下 ...
- 为什么大部分的 PHP 程序员转不了 Go 语言?
大家好,我是码农先森. 树挪死,人挪活,这个需求我做不了,换个人吧.大家都有过这种经历吧,放在编程语言身上就是 PHP 不行了,赶紧转 Go 语言吧.那转 Go 语言就真的行了?那可不见得,我个人认为 ...
- 旧物利用 - 将机顶盒改造为一台Linux开发机!
前言 机顶盒型号:移动魔百盒CM201-2(CH),芯片组: hi3798mv300(hi3798mv3dmm),其他型号类似 理论上适用于以下SOC:Hi3798Mv100 / Hi3798Cv20 ...
- Microsoft Ignite 2022 After Party (Placeholder)
通过Microsoft Ignite 2022了解最新的创新成果,向产品专家和合作伙伴学习,优化自身技能组合,并与来自世界各地的人士建立联系.请于 PDT 时间 10 月 12 日至 14 日早上 9 ...
- java游戏服务器2023年7月22日
name 卡牌军团 放置卡牌游戏 开发语言: java mysql 通信http 账号服务器 提供验证等功能 中心服务器 跨服功能 排行榜 公会
- C# Winform 使用 BarTender打印条码
目录 - 1. 使用软件BarTender 设计打印模板 - 2. Winfrom集成打印 - 3.最终效果 - 1. 使用软件BarTender 设计打印模板 贴一个入门级使用教程:https:// ...
- Zsh 配置
基本配置 安裝 Zsh: # Ubuntu/Debian sudo apt install zsh # macOS brew install zsh macOS 默认使用 Zsh,可以不用重复安装. ...
- 【GitHub】上传代码通用操作等(附下载单个文件夹或文件)
一.创建GitHub账号以及配置 参考我的另一篇文章:<[Mac系统 + Git]之上传项目代码到github上以及删除某个文件夹> 二.创建新的个人知识库 前面配置完之后,下面讲的再新建 ...
- 计算机图形学(第四版) PDF 中文版
目录 图书介绍 下载地址 图书介绍 <计算机图形学(第四版)>是2014年电子工业出版社出版的图书,作者是Donald Hearn.M. Pauline Baker.Warren R. C ...