前几天要做一个数据导出Excel

我就打算写一个通用的。

这样一来用的时候也方便,数据主要是通过Orm取的List。这样写一个通用的刚好。

        public static void ListToExcel(List<dynamic> ts, string[] RowName, string[] ListCorrespondRow, bool IsRowName = false)
{ //创建工作簿对象
IWorkbook workbook = new HSSFWorkbook();
//创建工作表
ISheet sheet = workbook.CreateSheet("onesheet");
IRow row0 = sheet.CreateRow();
for (int i = ; i < RowName.Length; i++)
{
row0.CreateCell(i).SetCellValue(RowName[i]);
}
for (int r = ; r <= ts.Count; r++)
{
//创建行row
IRow row = sheet.CreateRow(r);
dynamic tsc = ts[r-];string sJson = JsonConvert.SerializeObject(tsc);
dynamic sObj = JsonConvert.DeserializeObject<dynamic>(sJson);
var sObjLen = sObj.GetType().GetProperties();
for (int j = ; j < ListCorrespondRow.Length; j++)
{
//通过【】来取值 但必须要通过json转成的对象才可以这样取
row.CreateCell(j).SetCellValue(Convert.ToString(sObj[ListCorrespondRow[j]]));
}
//foreach (System.Reflection.PropertyInfo p in tsc.GetType().GetProperties())
//{
// //row.CreateCell().SetCellValue(p.GetValue(tsc));
//} //for (int j = 0; j < sObjLen.Length; j++)
//{
//利用反射将对象里面的值添加到excel里面 添加的顺序是按照对象里面字段的顺序 注意和列名保持一致
// row.CreateCell(j).SetCellValue(sObjLen[j].GetValue(tsc));
//} } //创建流对象并设置存储Excel文件的路径
using (FileStream url = File.OpenWrite(@"C:/Users/13002/source/repos/练习/练习/WordDot/test3.xls"))
{ //导出Excel文件
workbook.Write(url);
//Response.Write("<script>alert('写入成功!')</script>");
}; ////workbook.Write();
////创建文件流
//MemoryStream bookStream = new MemoryStream();
////文件写入流(向流中写入字节序列)
//workbook.Write(bookStream);
////输出之前调用Seek(偏移量,游标位置) 把0位置指定为开始位置
//bookStream.Seek(0, SeekOrigin.Begin);
//return bookStream;
}

  在写这个的时候就遇到了一些问题。

  刚开始是打算用反射进去获取,因为刚开始我自己试了一下(我手动创建了一个list集合里面的对象也是自己手动输入的)

  这个时候用

foreach (System.Reflection.PropertyInfo p in tsc.GetType().GetProperties())
{
row.CreateCell().SetCellValue(p.GetValue(tsc));
}

  这串代码来往excel里面插入是没有问题的。

  但是后来发现我自己创建的list和数据库查询之后返回的list不一样。

  我数据库框架用的dapper,接受集合的时候用的是List<dynamic>

  这时候就用反射获取不到有多少个属性了,也就取不到值了。

  后来我想既然这样我就把他转成json在把他转成dynamic。

  后来试了一下,果然可以获取的到属性长度的数组。

  但是不能用foreach,因为这样会出错,给excel每一列赋值的时候需要传索引号。

  

  我也就是我单独把他拉出来的原因。

  

  但是这样用循环依次获取属性的值会出问题,会报错。

  

  然后我只得用这个方法了。用这样的话,还需要自己定义一个数组把当前对象有字段的名称告诉这个方法,所以略显麻烦,所以之前一直在搞不要输入的按照顺序直接赋值的。但是没弄出来:)

  之所以能用这个方法是因为把对象转成json在把json转成对象后这个对象是Jobject 就是Newtonsoft.Json里面的一个东西。他支持用【】来获取数据

  dynamic是不支持【】获取属性的值的。

  还有就是SetCellValue不加Convert.ToString有时候会报错,报具有二义性,我F12看了一下源码,        

  

  应该是这两个有点小差异,所以转换一下就好了  

  

  与用法就是这个样子的

最新文章

  1. Android Studio开发RecyclerView遇到的各种问题以及解决(二)
  2. 【Win 10 应用开发】分析 URI 中的查询字符串
  3. 30多条mysql数据库优化方法,千万级数据库记录查询轻松解决(转载)
  4. JavaScript单元测试框架JsUnit基本介绍和使用
  5. Ext3文件系统mount选项和文件属性介绍
  6. SVN代码回滚
  7. SHIFT后门拿服务器之方法总结
  8. 完全背包问题:湫湫系列故事――减肥记I(HDU 4508)
  9. OGLplus 0.33.0 发布,OpenGL 的 C 封装库
  10. 【POJ】1269 Intersecting Lines(计算几何基础)
  11. 大数据下的java client连接JDBC
  12. 【Pure】
  13. vsphere 出现“在主机的当前连接状况下不允许执行该操作”
  14. MySql存储过程—3、变量
  15. HDU 2008 数字统计
  16. .net后台代码临时表创建
  17. Java 后端微信支付demo
  18. 手机端页面自适应解决方案—rem布局进阶版
  19. IDEA 代码格式化,快捷键
  20. unity仿微信飞机大战项目

热门文章

  1. poj2914无向图的最小割
  2. 洛谷P2765 魔术球问题
  3. POJ1733
  4. zqt_helper 轻松开发Qt5 Widgets应用
  5. 多线程(thread+queue 售票)
  6. SVN创建分支的相关操作
  7. Hadoop Yarn REST API未授权漏洞利用
  8. 关于react中antd design pro下面src/models
  9. Python--numpy中的tile()函数
  10. conda虚拟环境安装