前几天要做一个数据导出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. 3、JSP中的Cookie 用于存储 web 页面的用户信息。

    cookie 在平时生活中的运用 存储用户在网页上的登陆信息,包括账号和密码. 有的网站,登陆的时候,会出现一个选项,问你是否要一周内或者一个月内保持登陆状态.如果你选了,那么一周之内,都不需要再输入 ...

  2. layui 让弹窗始终居中于屏幕

    前话:今天用 layer.confirm()  弹窗的时候,滚动到页面尾部再弹窗时,发现弹窗还显示在上面,要滚动会上面才能看到. 度娘找了一个获取滚动条位置的方法: function ScollPos ...

  3. SpringBoot2.x【一】从零开始环境搭建

    SpringBoot2.x[一]从零开始环境搭建 对于之前的Spring框架的使用,各种配置文件XML.properties一旦出错之后错误难寻,这也是为什么SpringBoot被推上主流的原因,Sp ...

  4. js常用 方法 封装

    // 监听滚动,用于列表页向下加载--------------------------------- function loadmore(callback) { $(window).scroll(fu ...

  5. 解决pip._vendor.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host='files.pythonhosted.org', port=443): Read timed out.问题

    国内的其他镜像源清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/阿里云 http://mirrors.aliyun.com/pypi/simple/中国科技 ...

  6. 在jsp文件中出现Unknown tag (c:out)

    出现这个提示之后,这个out是没有被执行的,在最前面加上 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix= ...

  7. Maven本地仓库/中央仓库(阿里镜像)/JDK配置

    第一步打开你已经下载好的Maven,进入:根磁盘:\......\apache-maven-3.6.2\conf文件夹找到settings.xml文件(没有的可以自行创建一个同名的文件即可) 使用文本 ...

  8. MySQL国内镜像下载地址

    最近重新下载MySQL发现官网下载速度不是一般的慢,官网下载要几个钟而且一不注意就被取消下载了,实在受不了 可以使用sohu的镜像:http://mirrors.sohu.com/mysql/MySQ ...

  9. Java实现 LeetCode 383 赎金信

    383. 赎金信 给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串,判断第一个字符串ransom能不能由第二个字符串magazines里面的字符构成.如果可以构成,返回 t ...

  10. Java实现 LeetCode 313 超级丑数

    313. 超级丑数 编写一段程序来查找第 n 个超级丑数. 超级丑数是指其所有质因数都是长度为 k 的质数列表 primes 中的正整数. 示例: 输入: n = 12, primes = [2,7, ...