public async Task<MemoryStream> ExportExcel(IList<fuquestionbank> _list, string pId, string pfid, string fugid)
{
#region 绘制表头
string[] arr = { "序号", "姓名", "性别", "年龄", "联系电话", "随访医生", "最近一次随访", "计划次数", "共随访次数", "病历数", "咨询数", "下次随访时间", "状态" };
HSSFWorkbook book = new NPOI.HSSF.UserModel.HSSFWorkbook();
//添加一个sheet1
ISheet sheet1 = book.CreateSheet("Sheet1");
CellRangeAddress m_region = new CellRangeAddress(, , , arr.Length - ); //合并0列的n--n+2行
sheet1.AddMergedRegion(m_region);
IRow row = sheet1.CreateRow();
ICell cell = row.CreateCell();
ICellStyle cellstyle = book.CreateCellStyle();//设置垂直居中格式
cellstyle.VerticalAlignment = VerticalAlignment.CENTER;//垂直居中
cellstyle.Alignment = HorizontalAlignment.CENTER;//水平居中 cell.CellStyle = cellstyle;
cell.SetCellValue("基本信息");
IRow row2 = sheet1.CreateRow();
for (int i = ; i < arr.Length; i++)
{
row2.CreateCell(i).SetCellValue(arr[i]);
} var title = _list.GroupBy(x => x.FllowPlan_Name);
List<string> planName = new List<string>();//随访计划名称
List<string> fllowName = new List<string>();//问卷名称
Dictionary<string, string> timu = new Dictionary<string, string>();//当前问卷下的问卷题目
List<string> timuList = new List<string>();
Dictionary<string, int> timuResult = new Dictionary<string, int>();//当前问卷下的题目的个数
//获取随访计划和问卷信息
foreach (var item in title)
{
planName.Add(item.Key.ToString());
foreach (var name in item)
{
if (!fllowName.Contains(name.FollowInfo_Name))
{
fllowName.Add(name.FollowInfo_Name);
}
if (!timu.ContainsKey(name.Question_Name))
{
timu.Add(name.Question_Name, name.FollowInfo_Name);
}
}
}
//获取当前问卷下的题目的个数
var tGroup = timu.GroupBy(x => x.Value);
foreach (var item in tGroup)
{
foreach (var count in item)
{
if (!timuResult.ContainsKey(count.Value))
{
timuResult.Add(count.Value, item.Count());
}
}
}
//获取题目集合
foreach (KeyValuePair<string, string> item in timu)
{
timuList.Add(item.Key);
}
//绘制随访计划表头
//IRow row3 = sheet1.CreateRow(0); int rowOne = arr.Length;
for (int i = ; i < planName.Count; i++)
{
sheet1.AddMergedRegion(new CellRangeAddress(, , rowOne, rowOne + timu.Count - ));
ICell cellPlan = row.CreateCell(rowOne);
cellPlan.CellStyle = cellstyle;
cellPlan.SetCellValue(planName[i]);
// row.CreateCell(rowOne).SetCellValue(planName[i]);
rowOne += timu.Count;
}
//绘制随访问卷表头
IRow row4 = sheet1.CreateRow();
int rowTwo = arr.Length;
int index = ;
for (int i = ; i < planName.Count * fllowName.Count; i++)
{ //获取当前问卷下的题目个数
int r = timuResult[fllowName[index]];
sheet1.AddMergedRegion(new CellRangeAddress(, , rowTwo, rowTwo + r - ));
ICell cellFllow = row4.CreateCell(rowTwo);
cellFllow.CellStyle = cellstyle;
cellFllow.SetCellValue(fllowName[index]);
//row4.CreateCell(rowTwo).SetCellValue(fllowName[index]);
rowTwo += r;
index += ;
if (index > fllowName.Count - )
{
index = ;
}
}
//绘制问卷题目表头
//IRow row5 = sheet1.CreateRow(2);
int index1 = ;
for (int i = arr.Length; i < (timuList.Count * planName.Count) + arr.Length; i++)
{
ICell cellTimu = row2.CreateCell(i);
cellTimu.CellStyle = cellstyle;
cellTimu.SetCellValue(timuList[index1].ToString()); // row2.CreateCell(i).SetCellValue(timuList[index1].ToString());
index1 += ;
if (index1 >= timuList.Count - )
{
index1 = ;
}
}
 
            }
// 写入到客户端
System.IO.MemoryStream ms = new System.IO.MemoryStream();
book.Write(ms);
ms.Seek(, SeekOrigin.Begin);
return ms;
}
            //表头数据
var tablleTitle = await patientBLL.getFllowInfoList(fugid);
IList<fuquestionbank> tableTil = tablleTitle.OrderBy(x => x.FllowPlan_id).ThenBy(x => x.FollowInfo_Name).ToList();
//导出
excelBll excelBll = new BLL.excelBll();
MemoryStream ms = await excelBll.ExportExcel(tableTil, pId, pfid, fugid);
string SavaName = DateTime.Now.ToString("yyyyMMddhhmmss");
return File(ms, "application/vnd.ms-excel", "患者管理" + SavaName + ".xls");
//list集合转datatable
public DataTable IListOut(IList<excelModel> _list)
{
DataTable dtReturn = new DataTable();
PropertyInfo[] oProps = null;
foreach (excelModel rec in _list)
{
if (oProps == null)
{
oProps = ((Type)rec.GetType()).GetProperties();
foreach (PropertyInfo pi in oProps)
{
Type colType = pi.PropertyType; if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition() == typeof(Nullable<>)))
{
colType = colType.GetGenericArguments()[];
}
dtReturn.Columns.Add(new DataColumn(pi.Name, colType));
}
}
DataRow dr = dtReturn.NewRow(); foreach (PropertyInfo pi in oProps)
{
dr[pi.Name] = pi.GetValue(rec, null) == null ? DBNull.Value : pi.GetValue(rec, null);
}
dtReturn.Rows.Add(dr);
}
return (dtReturn);
}

NPOI的操作的更多相关文章

  1. C# 之 用NPOI类库操作Excel

    1.需引用以下命名空间: using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using NPOI.HPSF; using NPOI.HSSF.Ut ...

  2. asp.net(C#)之NPOI&quot;操作Excel

    1.首先到网上下载"NPOI.DLL".引用. 2.新建一个操作类"ExcelHelper.cs": using System.Collections.Gene ...

  3. NPOI:操作总结

    1.套路 使用了NPOI一段时间,也慢慢了解了操作的流程,或者说套路: a.创建Workbook: HSSFWorkbook Workbook = new HSSFWorkbook(); b.在Wor ...

  4. NPOI:初次操作(新建Excel)

    1. 由于在某些电脑上没有安装office,或者有权限限制,使用COM组件进行读写Excel的话会出现问题, 为此,NPOI是一个很好的选择,NPOI可以在上述环境中满足Office的操作需求,并且功 ...

  5. c# NPOI文件操作

    public static Byte[] RenderDataToExcel<T>(List<T> SourceList, List<String> filter) ...

  6. C#开发之基于NPOI的操作Excel开发体验

    最近遇到一个数据导入的需求,语言是.net framework 4.7的C#.但是,这次主要探讨NPOI的体验,原则就是向前兼容.所以采用.xls的支持.网上的资料,我稍微整合了一些. #1 单元格下 ...

  7. NPOI简单操作excel

    本文仅当是个记录文件,仅供初学者参考. 首先得using几个npoi的空间名如下: using NPOI.HSSF.UserModel;using NPOI.HSSF.Util;using NPOI. ...

  8. NPOI读取操作excel

    .读取using (FileStream stream = new FileStream(@"c:\客户资料.xls", FileMode.Open, FileAccess.Rea ...

  9. NPOI office操作

    写excel FileStream file = new FileStream(@"test.xls",FileMode.Create); hssfworkbook.write(f ...

随机推荐

  1. linux中输入输出和重定向问题

    输入输出解释 当我们执行shell的时候,每个进程都和三个打开的文件有关系,并使用文件描述符来引用这些文件.但这些文件不容易记忆,所以shell给了相应的文件名: 0:输入文件-标准输入(它的命令是输 ...

  2. 每天一个设计模式-4 单例模式(Singleton)

    每天一个设计模式-4 单例模式(Singleton) 1.实际生活的例子 有一天,你的自行车的某个螺丝钉松了,修车铺离你家比较远,而附近的五金店有卖扳手:因此,你决定去五金店买一个扳手,自己把螺丝钉固 ...

  3. 谈谈我对前端组件化中“组件”的理解,顺带写个Vue与React的demo

    前言 前端已经过了单兵作战的时代了,现在一个稍微复杂一点的项目都需要几个人协同开发,一个战略级别的APP的话分工会更细,比如携程: 携程app = 机票频道 + 酒店频道 + 旅游频道 + ..... ...

  4. 在Android中,使用Kotlin的 API请求简易方法

    原文标题:API request in Android the easy way using Kotlin 原文链接:http://antonioleiva.com/api-request-kotli ...

  5. redux-devtools 浏览器修改Store值

    1. npm install --save-dev redux-devtools 2. npm instal. --redux-devtools-dock-monitor  3. 创建DevTools ...

  6. iOS 中的 HotFix 方案总结详解

    相信HotFix大家应该都很熟悉了,今天主要对于最近调研的一些方案做一些总结.iOS中的HotFix方案大致可以分为四种: WaxPatch(Alibaba) Dynamic Framework(Ap ...

  7. 转载文章——Hadoop学习

    转载地址:http://www.iteye.com/blogs/subjects/zy19982004?page=2 一.Hadoop社区版和发行版 社区版:我们把Apache社区一直开发的Hadoo ...

  8. .NET判断是否为AJAX提交

    AJAX异步方式请求比同步方式请求HTTP头部多一个 X-Requested-With 直接影响 C#中 Request.IsAjaxRequest() 的判断,同步方式判断为false 当然也可以自 ...

  9. BZOJ 1984: 月下“毛景树” [树链剖分 边权]

    1984: 月下“毛景树” Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 1728  Solved: 531[Submit][Status][Discu ...

  10. Neural Pathways of Interaction Mediating the Central Control of Autonomic Bodily State 自主神经系统-大脑调节神经通路

    Figure above: Critchley H D, Harrison N A. Visceral influences on brain and behavior[J]. Neuron, 201 ...