前几天要做一个数据导出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. Mysql 查询指令 1

    一.查询两个时间字段相减的差值 >>> (TIME_TO_SEC(时间字段一) select bl_no, task_result, carrier_code, task_start ...

  2. Android设置按钮透明

    <Button android:id="@+id/bt3" android:layout_width="163dp" android:layout_hei ...

  3. 已解决[Authentication failed for token submission,Illegal hexadecimal charcter s at index 1]

    在初次学习使用shiro框架的时候碰到了这个问题,具体报错情况如下: [org.apache.shiro.authc.AbstractAuthenticator] - Authentication f ...

  4. [C# WPF] 关于将文本框竖起来(旋转文字)

    xx.xmal.cs 后台代码中动态添加控件到 UI 文字显示在一个 Canvas 中(定位用Canvas.SetLeft() / Canvas.SetTop() ), 为了实现排版效果,可适当在 T ...

  5. [PHP插件教程]002.代码包PHP Beautifier的使用

    This program reformat and beautify PHP source code files automatically. The program is Open Source a ...

  6. Python 每日一练(7)

    引言 今天的练习比较轻松,原本是有两题的,但是第一题那个大致看了一下,其实和之前的6个练习差不多,就是把xls中的文件数据读取出来后,进行一下处理,对于那题而言就是一个求和操作,所以就没练了,所以今天 ...

  7. Java IO(三)FileDescriptor

    Java IO(三)FileDescriptor 一.介绍 FileDescriptor 是文件描述符,用来表示开放文件.开放套接字等.当 FileDescriptor 表示文件时,我们可以通俗的将 ...

  8. pandas的loc与iloc

    1. loc是用标签(也就是行名和列名)来查找,标签默认是数字,但也可以通过index参数指定为字符型等其他的类型. 格式是df.loc[行名,列名],如果列标签没有给出,则默认为查找指定行标签的所有 ...

  9. Vulnerability of SSL to Chosen-Plaintext Attack 读书报告

    这篇文章讲述了在SSL上的选择明文攻击.我想分四个部分讲讲我对这篇文章的理解. 1.CPA的定义: 2.文章讲述SSL相关基本概念漏洞: 3.对SSL的CPA攻击的过程: 4.实现这种攻击的可能性以及 ...

  10. jchdl - RTL Block

    https://mp.weixin.qq.com/s/pR6b6i98P9dRU8bhZkKaww   观察Verilog代码可以发现,对逻辑的描述中都是assign和always代码块.这正对应了硬 ...