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动态赋值)的更多相关文章

  1. Aspose.cell C# 操作excel(通过批注信息给单元格赋值、批注信息获取公式得出结果并转PNG)

    if (fileName == "") return ""; var CurrentRow = 0; Workbook work = new Workbook( ...

  2. 通过NPOI操作Excel

    最近在做的一个项目中需要生成Excel,通过学习使用NPOI实现了相关需求,写了一个简便操作的类,记录如下: public class NPOIHelperForExcel { #region exc ...

  3. NPOI操作EXCEL(二)——大量不同模板时设计方式

    上一篇文章介绍了一些NPOI的基础接口,我们现在就来看看具体怎么用NPOI来解析一个EXCEL. 博主现在有这么一堆excel需要解析数据入库: 当然这只是员工的简要模板,还有很多其他的模板.我们可以 ...

  4. C# 如何使用NPOI操作Excel以及读取合并单元格等

    C#操作Excel方法有很多,以前用的需要电脑安装office才能用,但因为版权问题公司不允许安装office.所以改用NPOI进行Excel操作,基本上一些简单的Excel操作都没有问题,读写合并单 ...

  5. NPOI操作之一EXCEL数据导入数据库

    一.概要 前面讲到NPOI操作EXCEL导出功能,下面讲下从EXCEL里获取数据添加进数据库. 二.代码 HSSFWorkbook hssfworkbook; public void ExcelDat ...

  6. 用NPOI操作EXCEL-锁定列CreateFreezePane()

    public void ExportPermissionRoleData(string search, int roleStatus) { var workbook = new HSSFWorkboo ...

  7. .NET 通过 NPOI 操作 Excel

    目录 .NET 通过 NPOI 操作 Excel 第一步:通过 NuGet 获取 NPOI 包并引入程序集 第二步:引入 NPOI 帮助类 第三步:在程序中调用相应的方法对数据进行导出导入操作 将 D ...

  8. 使用NPOI操作Excel文件及其日期处理

    工作中经常遇到需要读取或导出Excel文件的情况,而NPOI是目前最宜用.效率最高的操作的Office(不只是Excel哟)文件的组件,使用方便,不详细说明了. Excel工作表约定:整个Excel表 ...

  9. 个人永久性免费-Excel催化剂功能第55波-Excel批注相关的批量删除作者、提取所有批注信息等

    Excel里的批注,许多人很喜欢用,但批注真的值得我们大量使用吗?批注的使用场景在哪里?这些问题可能更值得花时间来思考下.同样因为不规范地使用批注,也带出了一大堆的后续擦屁股的事情来,从批注中找回有价 ...

随机推荐

  1. [转]微信小程序登录逻辑梳理

    本文转自:http://www.jianshu.com/p/d9996cafdb31 官方文档 文档相关地址: 用户登录 获取用户数据 用户数据的签名验证和加解密                   ...

  2. [转]微信小程序,开发大起底

    本文转自:http://blog.csdn.net/baiyuzhong2012/article/details/54378497 作者简介:张智超,北京微函工坊开发工程师,CSDN微信开发知识库特邀 ...

  3. vue2.0 饿了么项目学习总结

    最近在GitHub上发现一个基于vue2.0的饿了么项目.本着互联网的分享精神,现在将我自己所理解的,所总结的经验分享给大家.本篇文字我将从学习的角度向大家分享. 在学习本项目之前我已经将vue2.0 ...

  4. 跨页面传值之Cookie

    3.客户端再次访问某站点 浏览器将携带Cookie信息的指令,将获得的信息参与编译. 4.将含有Cookie信息参与编译的页面发回给浏览器 其中如果有相关的设置Cookie的指令.将再次通过浏览器,写 ...

  5. cf547D. Mike and Fish(欧拉回路)

    题意 题目链接 Sol 说实话这题我到现在都不知道咋A的. 考试的时候是对任意相邻点之间连边,然后一分没有 然后改成每两个之间连一条边就A了.. 按说是可以过掉任意坐标上的点都是偶数的数据啊.. #i ...

  6. Objective C 中的nil,Nil,NULL和NSNull理解

    kenyo网友的原创说法是:做IOS开发的估计都对Objective-C的内存管理机制很头疼,一不小心程序就会出内存泄露,我也不例外,前几天被指针的置nil与release给搞惨了,今和大家详细解说一 ...

  7. Highcharts error #14: www.highcharts.com/errors/14

    错误原因:数据类型错误,需要的是Number类型,传入的却是String 以为为官网说明: Highcharts Error #14 String value sent to series.data, ...

  8. java面试题之----mysql表优化方案

    本文转载自segmentfault,原文链接:https://segmentfault.com/a/1190000006158186. 当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考 ...

  9. VB6.0环境下的CATIA二次开发简介

    CATIA作为CAD/CAE/CAM/PDM一体化的软件,广泛用于航空航天.汽车.船舶及电子工业,尤其在航空航天业,有八成以上厂商使用CATIA的市场[11].然而由于使用习惯和使用的侧重点不用,功能 ...

  10. yjh_study_command

    1.show current user in oralce ansower:show user 2.search  name of table  in current user model. answ ...