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 ...
随机推荐
- 美化一下WPF自带得ToolTip
对照一下原版和美化以后得版本 原版: ---------- 新版: 新增了 圆角 和 阴影效果; 第一步:新建项,最下面有一个自定义控件,取名为CornerToolTip. 第二步:系统会创建一个Co ...
- .NET 7 + Vue 权限管理系统 小白快速上手
前言 今天给大家推荐一个超实用的开源项目<.NET 7 + Vue 权限管理系统 小白快速上手>,DncZeus的愿景就是做一个.NET 领域小白也能上手的简易.通用的后台权限管理模板系统 ...
- div构建table
1.Css display值与解释-(详细可见CSS手册的CSS display手册)参数:block :块对象的默认值.用该值为对象之后添加新行none :隐藏对象.与visibility属性的hi ...
- spring手动事务控制
在项目开发中需要用到手动事务进行控制.现说下遇到的问题以及解决方案: 如果程序需要使用嵌套事务,则需要在配置文件中添加一个配置属性,如下: <bean id="transactionM ...
- 玄机蓝队靶场_应急响应_01:linux日志分析
个人感觉这个靶场主要考验对linux的命令的基础掌握,对日志路径的基本了解. 一:解题 (1)ssh连接靶场,先用命令lsb_release -a看看是什么系统.然后发现是Debian GNU/Lin ...
- C#基础 - Task
目录 前言 1,Task的分类 2,Task的状态 2.1 TaskStatus枚举 2.2 状态相关属性 2.3 小结 3,Task的等待 3.1 Wait方法 3.2 死锁 3.2.1 死锁形成 ...
- Navicat16 安装破解教程
Navicat16 安装破解教程 Navicat 16.1 什么是Navicat? 官网下载Navicat 注册包的使用 Navicat 16.1 在文章最后添加工作号 回复关键词获取注册机 什么是N ...
- 搭建MyBatis环境
开发环境 idea .maven .MySQL.MyBatis MySQL不同版本的注意事项 1.驱动类driver-class-name MySQL 5版本使用jdbc5驱动,驱动类使用:com.m ...
- 【YashanDB数据库】yasql登录有特殊字符@导致无法登录
问题备机 Linux bash shell环境下,使用yasql登录数据库没有使用转义导致登录失败.报错信息如下 问题分析 linux特殊字符转义问题,多加几层转义可以解决问题. 解决办法 su - ...
- 十五,Spring Boot 整合连接数据库(详细配置)
十五,Spring Boot 整合连接数据库(详细配置) @ 目录 十五,Spring Boot 整合连接数据库(详细配置) 最后: JDBC + HikariDataSource(Spring Bo ...