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. java分解质因数

      package test; import java.util.Scanner; public class Test19 { /** * 分析:对n进行分解质因数,应先找到一个最小的质数k * 最小 ...

  2. python学习笔记- 多线程(1)

    学习多线程首先先要理解线程和进程的关系. 进程 计算机的程序是储存在磁盘中的可执行的二进制文件,执行时把这些二进制文件加载到内存中,操作系统调用并交给处理器执行对应操作,进程是程序的一次执行过程,这是 ...

  3. Atitit.log日志技术的最佳实践attilax总结

    Atitit.log日志技术的最佳实践attilax总结 1. 日志的意义与作用1 1.1. 日志系统是一种不可或缺的单元测试,跟踪调试工具1 2. 俩种实现[1]日志系统作为一种服务进程存在 [2] ...

  4. 详细介绍Mysql各种存储引擎的特性以及如何选择存储引擎

    最近业务上有要求,要实现类似oracle 的dblink   linux版本 Server version: 5.6.28-0ubuntu0.14.04.1 (Ubuntu) 修改配置文件 /etc/ ...

  5. HTML5的新语义化的标签

    在HTML5之前采用HTML+CSS文档结构写法 [ID选择器说明 id选择器——用于标识页面上特定元素(比如站点导航.页眉.页脚)而且必须唯一; 也可以用来标识持久结构性元素(如主导航.内容区域)] ...

  6. 响应式手机商城页面顶部样式HTML代码

    本特效支持PC浏览器和触屏浏览器. 效果展示 http://hovertree.com/texiao/bootstrap/8/ 手机扫描二维码体验效果: HTML代码如下: <!DOCTYPE ...

  7. 【前端优化之渲染优化】大屏android手机动画丢帧的背后

    前言 上周我与阿里的宇果有一次技术的交流,然后对天猫H5站点做了一些浅层次的分析,后面点时间基本天天都会有联系,中途聊了一些技术细节.聊了双方团队在干什么,最后聊到了前端优化.因为我本身参与了几次携程 ...

  8. 由于目标计算机积极拒绝,无法连接。 192.168.1.106:8078 说明: 执行当前 Web 请求期间,出现未经处理的异常。

    请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息. 异常详细信息: System.Net.Sockets.SocketException: 由于目标计算机积极拒绝,无法连接. 1 ...

  9. Sharepoint 2010、Sharepoint 2013浏览器打开CAD(.dwg)

    客户端配置 1.安装FreeDWGViewer.exe,设置浏览器查看 2.检查ActiveX插件是否已安装成功 服务端配置 1.开启许可模式或者通过脚本将"application/acad ...

  10. iOS之数字的格式化

    //通过NSNumberFormatter,同样可以设置NSNumber输出的格式.例如如下代码: NSNumberFormatter *formatter = [[NSNumberFormatter ...