前几天要做一个数据导出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看了一下源码,        

  

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

  

  与用法就是这个样子的

写一个通用的List集合导出excel的通用方法的更多相关文章

  1. ASP.net中导出Excel的简单方法介绍

    下面介绍一种ASP.net中导出Excel的简单方法 先上代码:前台代码如下(这是自己项目里面写的一点代码先贴出来吧) <div id="export" runat=&quo ...

  2. 从SQL Server中导入/导出Excel的基本方法(转)

    从sql server中导入/导出 excel 的基本方法 /*=========== 导入/导出 excel 的基本方法 ===========*/ 从excel文档中,导入数据到sql数据库中,很 ...

  3. ext.net 2.5 导出excel的使用方法

    前台页面的导入,导出 <ext:FileUploadField ID="FileUploadField_Import" runat="server" Bu ...

  4. asp.net中导出excel数据的方法汇总

    1.由dataset生成 代码如下 复制代码 public void CreateExcel(DataSet ds,string typeid,string FileName)    {    Htt ...

  5. <转>.php导出excel(多种方法)

    基本上导出的文件分为两种:1:类Excel格式,这个其实不是传统意义上的Excel文件,只是因为Excel的兼容能力强,能够正确打开而已.修改这种文件后再保存,通常会提示你是否要转换成Excel文件. ...

  6. C# 导出 Excel 的各种方法总结

    第一种:使用 Microsoft.Office.Interop.Excel.dll 首先需要安装 office 的 excel,然后再找到 Microsoft.Office.Interop.Excel ...

  7. MVC 导出Excel 的其中一方法(View导出excel)

    场景:mvc下导出excel 思路:使用View导出excel 步骤: 1.导出标签添加事件 $("#export_A").click(function(){ //省略代码.... ...

  8. 导出excel的简单方法

    excel的操作,最常用的就是导出和导入,废话不多说上代码. 本例使用NPOI实现的,不喜勿喷哈.... /// <summary> /// 导出Excel /// </summar ...

  9. 共享一个MVC通过NPOI导出excel的通用方法

    public static System.IO.MemoryStream ExportExcel<T>(string title, List<T> objList, param ...

随机推荐

  1. BZOJ1066 网络流

    拆点,将一个柱子拆成入点和出点,入点出点之间的容量就是柱子的容量    1066: [SCOI2007]蜥蜴 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多 ...

  2. POJ2377

    题目链接:http://poj.org/problem?id=2377 解题思路: Prim算法. Warning ! 注意考虑重边 ! 其实就是求最大生成树,没什么好说的,就上面那个坑. AC代码: ...

  3. Spring 使用注解对事务控制详解与实例

    1.什么是事务 一荣俱荣,一损俱损,很多复杂的操作我们可以把它看成是一个整体,要么同时成功,要么同时失败. 事务的四个特征ACID: 原子性(Atomic):表示组成一个事务的多个数据库的操作的不可分 ...

  4. 使用VuePress搭建个人博客

    使用VuePress搭建个人博客 VuePress 是一个基于 Vue 的静态网站生成器.其中主要用到:Vue,VueRouter,Webpack. 类似的工具:hexo 基于 Markdown 语法 ...

  5. Thunar左侧边栏不完全显示PLACES的解决

    场景 我的笔记本装上系统时用的英文,安装中文之后,发现文件管理器的默认的几个文件夹 Desktop.Music.Videos.Downloads等都变成了中文,由于是新安装的系统,就重新生成 loca ...

  6. React面试题(超详细,附答案)

    生命周期 组件将要挂载时触发的函数:componentWillMount 组件挂载完成时触发的函数:componentDidMount 是否要更新数据时触发的函数:shouldComponentUpd ...

  7. Beta冲刺——5.25

    这个作业属于哪个课程 软件工程 这个作业要求在哪里 Beta冲刺 这个作业的目标 Beta冲刺 作业正文 正文 github链接 项目地址 其他参考文献 无 一.会议内容 1.解决小程序之前的遗留问题 ...

  8. Java实现 LeetCode 820 单词的压缩编码(字典树)

    820. 单词的压缩编码 给定一个单词列表,我们将这个列表编码成一个索引字符串 S 与一个索引列表 A. 例如,如果这个列表是 ["time", "me", & ...

  9. Java实现 蓝桥杯VIP 算法训练 快速排序

    import java.util.Scanner; public class 快速排序 { public static void main(String[] args){ Scanner sc=new ...

  10. java实现数组转置

    ** 数组转置** 编写程序将2行3列的数组行列置换复制给3行2列的数组(即数组的转置).已经写了如下代码,请完善之: class y{ public static void main(String[ ...