NPOI操作excel(通过获取批注信息给excel动态赋值)
private string fileName = null; //文件名
private IWorkbook workbook = null;
private FileStream fs = null;
private IFormulaEvaluator evaluator = null;
if (fileName == "") return "";
int CurrentRow = 0;
ISheet sheet = null;
//把文件内容导入到工作薄当中,然后关闭文件
fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite);
if (fileName.IndexOf(".xlsx", StringComparison.Ordinal) > 0)
{ // 2007版本
workbook = new XSSFWorkbook(fs);
}
else if (fileName.IndexOf(".xls", StringComparison.Ordinal) > 0) // 2003版本
{
workbook = new HSSFWorkbook(fs);
}
fs.Close();//关闭文件
if (sheetName != null)
{
sheet = workbook.GetSheet(sheetName) ?? workbook.GetSheetAt(0);
}
else
{
sheet = workbook.GetSheetAt(0);
}
if (sheet != null)
{
//获取建设期
var cp =2
var rowCount = sheet.LastRowNum; //竖着数最后一行的标号
for (var i = sheet.FirstRowNum; i <= rowCount; i++)
{
#region 获取当前行的启起值和结束值(模块)
var row = sheet.GetRow(i);//获取当前行的启起值和结束值
if (row == null) continue;
#region 获取一行的启起值和一行的结束值作为循环条件(模块)
//获取一行的启起值和一行的结束值作为循环条件//int cellCount = row.LastCellNum; //一行最后一个cell的编号 即总的列数
for (int j = row.FirstCellNum; j < row.LastCellNum; j++)
{
#region 判断当前单元格数据不等空(模块)
if (row.GetCell(j) == null || row.GetCell(j).CellComment == null) continue;
var Par = new List<SqlParameter>(); //sql参数化
var sd = row.GetCell(j).ToString();
#region 判断当前单元格批注不等空(模块)
var annotation = ((row.GetCell(j).CellComment.String.ToString().Replace("\n", "")).Replace("\r", "")).Trim();//获取当前单元格的批注
#region 获取excel起启行结束行
//如果相等记录当前行
if (annotation.Equals("open", StringComparison.OrdinalIgnoreCase))
{
CurrentRow = i; //记录当前excel行
}
else
{
//Convert.ToInt32(cp.Constant); //建设期
//解析单元格批注内容
string[] dataArr = annotation.Split('_');
string symbol = "";
if (dataArr.Length < 1) continue;
Par.Add(new SqlParameter("@SID", R_ID));
var arr = dataArr[1].Split('|');//获取值判断是否排除建设期
if (arr.Length > 1)
{
Par.Add(new SqlParameter("@gid", arr[0]));
}
else
{
var ffda = dataArr[1].Split('~');//判断是否有符号
if (ffda.Length > 1)
{
symbol = ffda[1];
Par.Add(new SqlParameter("@gid", ffda[0]));
}
else
{
Par.Add(new SqlParameter("@gid", dataArr[1]));
}
}
#region 执行存储过程过程获取数据
//执行存储过程
var dataTable = DbHelperSQL.RunStoredProcedure(dataArr[0].ToString(), Par.ToArray());//
if (dataTable.Rows.Count > 0)
{
var data = CommFunHelper.GetDataTableByKeyValue(dataTable);
if (dataArr[0].ToString().Equals("InternalFunds", StringComparison.OrdinalIgnoreCase) || dataArr[0].ToString().Equals("ProjectInternalRemuneration", StringComparison.OrdinalIgnoreCase))
{
#region keyValues取值方式
var value = "";
for (var k = 1; k <= sheet.GetRow(CurrentRow).LastCellNum; k++)
{
var va = sheet.GetRow(CurrentRow).GetCell(j + k);
if (va == null) continue;
var rowArr = va.ToString().Split('-');
if (rowArr.Length > 1)
{
if (data.ContainsKey(rowArr[1]))
{
value = data[rowArr[1]] + symbol;
}
else
{
value = null;
}
}
else
{
if (data.ContainsKey(va.ToString()))
{
value = data[va.ToString()] + symbol;
}
else
{
value = null;
}
}
if (arr.Length <= 1)
{
if (k <= Convert.ToInt32(cp.Constant))
{
value = "";
}
}
if (value == null) continue;
//先获取单元格的值再设置单元格的边框线再赋值不然.......自己看着办
row.CreateCell(j + k).CellStyle.BorderLeft =
BorderStyle.Thin; //设置左边框线
row.CreateCell(j + k).CellStyle.BorderBottom =
BorderStyle.Thin; //设置下边框线
row.CreateCell(j + k).CellStyle.BorderTop =
BorderStyle.Thin; //设置上边框线
row.CreateCell(j + k).CellStyle.BorderRight =
BorderStyle.Thin; //设置右边框线
row.CreateCell(j + k).SetCellValue(value);
//row.CreateCell(j + k).SetCellFormula("sum(A1,B1)");使用计算公式
}
#endregion
}
else
{
var value = dataTable.Rows[0][0] == DBNull.Value ? "" : dataTable.Rows[0][0].ToString();
//先获取单元格的值再设置单元格的边框线再赋值不然.......自己看着办
row.CreateCell(j + 1).CellStyle.BorderBottom =
BorderStyle.Thin; //设置下边框线
row.CreateCell(j + 1).CellStyle.BorderRight =
BorderStyle.Thin; //设置下边框线
row.CreateCell(j + 1).SetCellValue(value + symbol);
}
}
#endregion
}
#endregion
row.GetCell(j).RemoveCellComment();//删除当前单元格批注信息
#endregion
#endregion
}
#endregion
#endregion
}
#region 保存文件
string filePath = ConfigurationSettings.AppSettings["ExSave"];
string FileName = R_ID + "_" + az + "_" + ".xlsx";
var strFullName = Server.MapPath(filePath) + "\\" + FileName;
using (FileStream fileStream = System.IO.File.Create(strFullName))
{
workbook.Write(fileStream);
fileStream.Close();
}
//XlsToImg(strFullName, Path.ChangeExtension(strFullName, ".png"));
#endregion
return filePath + "/" + Path.ChangeExtension(FileName, ".png");
}
NPOI操作excel(通过获取批注信息给excel动态赋值)的更多相关文章
- Aspose.cell C# 操作excel(通过批注信息给单元格赋值、批注信息获取公式得出结果并转PNG)
if (fileName == "") return ""; var CurrentRow = 0; Workbook work = new Workbook( ...
- 通过NPOI操作Excel
最近在做的一个项目中需要生成Excel,通过学习使用NPOI实现了相关需求,写了一个简便操作的类,记录如下: public class NPOIHelperForExcel { #region exc ...
- NPOI操作EXCEL(二)——大量不同模板时设计方式
上一篇文章介绍了一些NPOI的基础接口,我们现在就来看看具体怎么用NPOI来解析一个EXCEL. 博主现在有这么一堆excel需要解析数据入库: 当然这只是员工的简要模板,还有很多其他的模板.我们可以 ...
- C# 如何使用NPOI操作Excel以及读取合并单元格等
C#操作Excel方法有很多,以前用的需要电脑安装office才能用,但因为版权问题公司不允许安装office.所以改用NPOI进行Excel操作,基本上一些简单的Excel操作都没有问题,读写合并单 ...
- NPOI操作之一EXCEL数据导入数据库
一.概要 前面讲到NPOI操作EXCEL导出功能,下面讲下从EXCEL里获取数据添加进数据库. 二.代码 HSSFWorkbook hssfworkbook; public void ExcelDat ...
- 用NPOI操作EXCEL-锁定列CreateFreezePane()
public void ExportPermissionRoleData(string search, int roleStatus) { var workbook = new HSSFWorkboo ...
- .NET 通过 NPOI 操作 Excel
目录 .NET 通过 NPOI 操作 Excel 第一步:通过 NuGet 获取 NPOI 包并引入程序集 第二步:引入 NPOI 帮助类 第三步:在程序中调用相应的方法对数据进行导出导入操作 将 D ...
- 使用NPOI操作Excel文件及其日期处理
工作中经常遇到需要读取或导出Excel文件的情况,而NPOI是目前最宜用.效率最高的操作的Office(不只是Excel哟)文件的组件,使用方便,不详细说明了. Excel工作表约定:整个Excel表 ...
- 个人永久性免费-Excel催化剂功能第55波-Excel批注相关的批量删除作者、提取所有批注信息等
Excel里的批注,许多人很喜欢用,但批注真的值得我们大量使用吗?批注的使用场景在哪里?这些问题可能更值得花时间来思考下.同样因为不规范地使用批注,也带出了一大堆的后续擦屁股的事情来,从批注中找回有价 ...
随机推荐
- 安装VMware,出现Microsoft Runtime DLL 安装程序未能完成安装,解决方法
安装VMware Workstation 12 Player出现如下问题: 解决方法: 1.出现这个问题的时候不要点确定(如果点了确定,会找不到步骤4中的文件夹) 2.win+R调出 '运行' 3.输 ...
- 前台通过ajax获取后台数据,PHP如何返回中文数据
现在经常使用Ajax调用后台php获取后台数据,但是PHP返回的数据如果含有中文的话,Ajax会无法识别,那咋整呢,我用的是比较笨的方法,但是实用: 方法一: echo urldecode(json_ ...
- OpenStack各组件详解和通信流程
一.openstack由来 openstack最早由美国国家航空航天局NASA研发的Nova和Rackspace研发的swift组成.后来以apache许可证授权,旨在为公共及私有云平台建设.open ...
- Aligning Plots in a Column作图列对齐
Plot[Sin[x], {x, 0, Pi}] Plot[10000 Sin[x], {x, 0, Pi}] 直接作图左边无法对齐,影响图的美观.可以使用左边界空格实现列对齐,代码如下: optio ...
- Tesorflow源代码安装方式以及错误的解决方法
作者 修雨轩陈@cnblog 目录 Configure the installation. (安装配置) Create the pip package and install (创建pip安装包并且安 ...
- Informatica 9.1.0 Domain地址变化修改
由于公司机房的变动,infa所连数据库的IP地址变化,致使INFA不能启动.经过查找资料终于解决,现分享给大家,解决方法如下: 1.查看日志路径: Informatica/9.1.0/tomcat/l ...
- 使用本地计划任务定时关闭azure虚拟机
本文包含以下内容 前提条件 如何实现定时关闭虚拟机 前提条件 Controller 机器上必须安装 Azure PowerShell,并且要在 PowerShell 里登录一次 Azure, 请参见: ...
- 使用 SQL SERVER PROFILER 监测死锁
作为DBA,可能经常会遇到有同事或者客户反映经常发生死锁,影响了系统的使用.此时,你需要尽快侦测和处理这类问题. 死锁是当两个或者以上的事务互相阻塞引起的.在这种情况下两个事务会无限期地等待对方释放资 ...
- JVM 虚拟机内存深入探究
[<深入理解java虚拟机>-整理笔记] by lijun JVM虚拟机内存逻辑模型: 方法区(全局变量 静态数据 常量等) 线程共享 堆栈区(对象实例 数组数据 new generat ...
- bootstrapTable表格表头换行
使用bootstrapTable组件,达到表头中有一格显示两行,其他表头均为一行,效果图如下: 代码: { field : 'pay_date', title : '已还款完成时间', valign: ...