/// <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. 纯css美化滚动条样式

    https://www.emperinter.info/2020/09/20/scrollbar-in-browser/ 自己完善自己博客再Ipad等移动端的菜单时选用了左右滑动的菜单模式!当然就会使 ...

  2. 海豚²来了丨DolphinDB 集成 DolphinScheduler,任务调度更轻松

    DolphinDB 是一款高性能时序数据库.DolphinDB 集成了功能强大的编程语言和高容量高速度的批流一体数据分析系统,为海量数据(特别是时间序列数据)的快速存储.检索.计算及分析提供一站式解决 ...

  3. 暑假Java自学进度总结05

    一.今日所学: 1.if的第一个表达式: if(关系表达式){ 语句: } 执行流程: 1>首先执行关系表达式的值 2>如果关系表达式的值为true则执行语句,否则不执行 3>继续执 ...

  4. Turbo Sparse:关于LLM稀疏性的探索

    本文地址:https://www.cnblogs.com/wanger-sjtu/p/18352898 关于llama稀疏性的观察 llama原始模型的FFN计算过程为: \[f(x) = \text ...

  5. MFC制作带界面的DLL库

    ## MFC如何创建一个带界面的DLL(动态链接库) 1.创建项目 打开VS,文件->新建->项目: 点击确定之后弹出来的界面,点击下一步->选择"使用共享MFC DLL的 ...

  6. Linux信号量(1)-SYSTEM V

    ​ 信号量概念 信号量本质上是一个计数器(不设置全局变量是因为进程间是相互独立的,而这不一定能看到,看到也不能保证++引用计数为原子操作),用于多进程对共享数据对象的读取,它和管道有所不同,它不以传送 ...

  7. Mybatis Log 插件

    目前的idea插件已经开始收费---找了一个免费的插件安装到idea中重启一下就可以了 百度网盘提取码:sjc8

  8. 线性dp:最长公共子序列

    最长公共子序列 本文讲解的题与leetcode1143.最长公共子序列这题一样,阅读完可以挑战一下. 力扣题目链接 题目叙述: 给定两个字符串,输出其最长公共子序列,并输出它的长度 输入: ADABE ...

  9. SQL Server使用脚本实现自动备份

    因服务器安装的SQL Server版本不支持自动定时备份,需自行实现,大概思路为: 创建备份数据库的脚本 创建批处理脚本执行步骤一中的脚本 创建Windows定时任务执行步骤二中的脚本 1. 创建SQ ...

  10. 分库分表后全局唯一ID的四种生成策略对比

    分库分表之后,ID主键如何处理? 当业务量大的时候,数据库中数据量过大,就要进行分库分表了,那么分库分表之后,必然将面临一个问题,那就是ID怎么生成?因为要分成多个表之后,如果还是使用每个表的自增长I ...