一、Excel数据导出常用操作

1.指定表头和描述

2.指定数据库中读出的数据集合

二、ExcelExport封装

/// <summary>
/// Excel常用的表格导出逻辑封装
/// 单表写入
/// </summary>
public class ExcelExport
{
/// <summary>
/// 导出的Excel文件名称+路径
/// </summary>
public string FullName { get; set; }
/// <summary>
/// 导出的字段名称和描述
/// </summary>
public Dictionary<string, string> Fields { get; set; } private HSSFWorkbook _workbook = null;
private ISheet _sheet = null;
/// <summary>
/// 创建实例,验证导出文件名
/// </summary>
/// <param name="FullName"></param>
/// <param name="Fields"></param>
public ExcelExport(string FullName, Dictionary<string, string> Fields)
{
this.FullName = FullName;
this.Fields = Fields;
Check();
_workbook = new HSSFWorkbook();
_sheet = _workbook.CreateSheet("Sheet1");
}
/// <summary>
/// 验证Excel文件名
/// </summary>
private void Check()
{
try
{
FileInfo info = new FileInfo(this.FullName);
string[] extentions = new string[] {
".xls",
".xlsx"
};
if (extentions.Any(q => q == info.Extension) == false)
throw new Exception("excel文件的扩展名不正确,应该为xls或xlsx");
if (info.Exists == false)
info.Create().Close();
}
catch (Exception ex)
{
throw new Exception("创建Excel文件失败", ex);
}
} /// <summary>
/// 执行导出操作
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="list"></param>
public void Export<T>(List<T> list)
{
//写入表格头
WriteHead();
//写入数据
ICellStyle cellStyle = _workbook.CreateCellStyle();
cellStyle.DataFormat = HSSFDataFormat.GetBuiltinFormat("@");//为避免日期格式被Excel自动替换,所以设定 format 为 『@』 表示一率当成text來看
cellStyle.BorderBottom = BorderStyle.Thin;
cellStyle.BorderLeft = BorderStyle.Thin;
cellStyle.BorderRight = BorderStyle.Thin;
cellStyle.BorderTop = BorderStyle.Thin;
cellStyle.VerticalAlignment = VerticalAlignment.Center;
cellStyle.Alignment = HorizontalAlignment.Center; IFont cellFont = _workbook.CreateFont();
cellFont.Boldweight = (short)FontBoldWeight.Normal;
cellStyle.SetFont(cellFont); //建立行内容,从1开始
int rowInex = ; foreach (var rowItem in list)
{
//创建行
IRow row = _sheet.CreateRow(rowInex);
row.HeightInPoints = ; int cellIndex = ;
foreach (var cellItem in this.Fields)
{
//创建单元格
ICell cell = row.CreateCell(cellIndex);
//反射获取属性的值
PropertyInfo info = rowItem.GetType().GetProperty(cellItem.Key);
if (info == null)
{
cell.SetCellValue($"'{cellItem.Key}'属性不存在");
}
else
{
object value = info.GetValue(rowItem);
if (value != null)
cell.SetCellValue(value.ToString());
}
cell.CellStyle = cellStyle;
cellIndex++;
}
//进入下一次循环
rowInex++;
} //自适应列宽度
for (int i = ; i < this.Fields.Count; i++)
{
_sheet.AutoSizeColumn(i);
} //导出到文件
WriteFile();
}
/// <summary>
/// 写入表头
/// </summary>
private void WriteHead()
{
//设置表头样式
ICellStyle headStyle = _workbook.CreateCellStyle();
headStyle.BorderBottom = BorderStyle.Thin;
headStyle.BorderLeft = BorderStyle.Thin;
headStyle.BorderRight = BorderStyle.Thin;
headStyle.BorderRight = BorderStyle.Thin;
headStyle.Alignment = HorizontalAlignment.Center;
headStyle.FillForegroundColor = HSSFColor.Blue.Index;
headStyle.VerticalAlignment = VerticalAlignment.Center; IFont headFont = _workbook.CreateFont();
headFont.Boldweight = (short)FontBoldWeight.Bold;
headStyle.SetFont(headFont); IRow row = _sheet.CreateRow();
row.HeightInPoints = ; int index = ;
foreach (var item in this.Fields)
{
ICell cell = row.CreateCell(index);
cell.SetCellValue(item.Value);
cell.CellStyle = headStyle;
index++;
}
}
/// <summary>
/// 创建文件到磁盘
/// </summary>
private void WriteFile()
{
using (FileStream fs = new FileStream(this.FullName, FileMode.OpenOrCreate))
{
_workbook.Write(fs);
fs.Flush();
fs.Close();
}
}
}

三、使用示例

1.匿名对象集合导出

Dictionary<string, string> fields = new Dictionary<string, string>();
fields.Add("ID", "主键");
fields.Add("Name", "姓名");
fields.Add("Age", "年龄");
fields.Add("Birthday", "生日");
ExcelExport _export = new ExcelExport(LocalPathHelper.GetCurrentData() + "/export1.xls", fields); List<object> list = new List<object>() {
new {ID=,Name="张三丰",Age=,Birthday=DateTime.Now },
new {ID=,Name="王芳",Age=,Birthday=DateTime.Now }
};
_export.Export(list);

2.List集合导出

TestOne _Context = new DBA.TestOne();
List<Member_Info> list = _Context.Member_Info.ToList();
Dictionary<string, string> fields = new Dictionary<string, string>();
fields.Add("MemberID", "主键");
fields.Add("code", "账号");
fields.Add("RealName", "姓名");
fields.Add("IsActive", "是否激活");
fields.Add("commission", "奖金余额"); //使用
ExcelExport _export = new ExcelExport(LocalPathHelper.GetCurrentData() + "\\export2.xls", fields);
//_export.Export(list);
_export.Export<Member_Info>(list);

更多:

.Net Excel操作之NPOI(一)简介

C#中操作刚导出的Excel,设置其为自动调整列宽

C#操作word封装

.Net Excel操作之NPOI(二)常用操作封装的更多相关文章

  1. 第三百节,python操作redis缓存-其他常用操作,用于操作redis里的数据name,不论什么数据类型

    python操作redis缓存-其他常用操作,用于操作redis里的数据name,不论什么数据类型 delete(*names)根据删除redis中的任意数据类型 #!/usr/bin/env pyt ...

  2. php文件操作(最后进行文件常用函数封装)

    文件信息相关API $filename="./1-file.php"; //filetype($filename):获取文件的类型,返回的是文件的类型 echo '文件类型为:', ...

  3. JS异步上传Excel 并使用NPOI进行读写操作

    实现功能 导入——客户端使用 ajaxfileupload.js 插件实现Excel的异步上传,并在服务端解析成JSON字符串返回页面 导出——将页面中的grid表拼接成JSON串上传至服务器,在服务 ...

  4. python学习,excel操作之xlrd模块常用操作

    import xlrd ##工作表## #打开excel f = xlrd.open_workbook("test.xlsx") file = f.sheet_by_name(&q ...

  5. Javascript 字符串(二)常用操作整理

    一.js获取字符串的字节数 这个好使--- function getBytesLength(str) { // 在GBK编码里,除了ASCII字符,其它都占两个字符宽 return str.repla ...

  6. jdbc操作mysql(二):封装

    案例四:封装共有操作 封装一个数据库的会话的类 import java.sql.*; public class ConnectionUtil { /** * 获取连接对象的方法,返回一个Connect ...

  7. php操作mysql几个常用操作

    1.链接数据库 mysql_connet('数据库地址','数据库账号','数据库密码'); 2.选择数据库 mysql_select_db("数据库名"); 3.设置编码 mys ...

  8. Java中Io流操作-File类的常用操作-创建文件,创建文件夹

    package com.hxzy.IOSer; import java.io.File;import java.io.IOException; public class Demo03 { public ...

  9. 版本控制工具——Git常用操作(上)

    本文由云+社区发表 作者:工程师小熊 摘要:用了很久的Git和svn,由于总是眼高手低,没能静下心来写这些程序员日常开发最常用的知识点.现在准备开一个专题,专门来总结一下版本控制工具,让我们从git开 ...

  10. servlet常用操作

      servlet常用操作 CreateTime--2017年9月7日09:36:43 Author:Marydon 1.获取当前应用程序对象 需要导入: import javax.servlet.S ...

随机推荐

  1. weex官方demo weex-hackernews代码解读(上)

    一.介绍 weex 是阿里出品的一个类似RN的框架,可以使用前端技术来开发移动应用,实现一份代码支持H5,IOS和Android.最新版本的weex已默认将vue.js作为前端框架,而weex-hac ...

  2. 深刻理解this的指向和var 定义的变量的问题

    一般来说,在编程语言里我们常见的变量作用域就是词法作用域与动态作用域(Dynamic Scope),绝大部分的编程语言都是使用的词法作用域.词法作用域注重的是所谓的Write-Time,即编程时的上下 ...

  3. CSS3选择器02—CSS3部分选择器

    该部分主要为CSS3新增的选择器 接上一篇 CSS(CSS3)选择器(1) 一.通用兄弟选择器: 24:E ~ F,匹配任何E元素之后的同级F元素. div ~ p{ background-color ...

  4. Liunx 部署环境常用命令

    在Linux环境中部署web项目中常用到一些命令,在此记录已做备用: 1. 查看当前工作目录: pwd [选项] 常用参数: pwd -P 显示出实际路径,而非使用连接(link)路径. 2. 列出目 ...

  5. Web大前端面试题-Day3

    1. javascript的typeof返回哪些数据类型? 答案: undefined string boolean number symbol(ES6) Object Function 2. 列举3 ...

  6. C++最快的读取文件的方案(scanf,cin(及取消sync),fread)的详细对比

    竞赛中,遇到大数据时,往往读文件成了程序运行速度的瓶颈,需要更快的读取方式.相信几乎所有的C++学习者都在cin机器缓慢的速度上栽过跟头,于是从此以后发誓不用cin读数据.还有人说Pascal的rea ...

  7. java自动给版本升级,遇9变0且前面一个版本加1

    /** * 自动升级版本号,版本号+1 * @param version * @return */ private String autoUpgradeVersion(String version){ ...

  8. java并发基础(六)--- 活跃性、性能与可伸缩性

    <java并发编程实战>的第9章主要介绍GUI编程,在实际开发中实在很少见到,所以这一章的笔记暂时先放一放,从第10章开始到第12章是第三部分,也就是活跃性.性能.与测试,这部分的知识偏理 ...

  9. perl解析xml-XML::Simple/XMLin

    转自: http://blog.charlee.li/perl-xml-simple/ [Perl]用XML::Simple解析XML文件 在Perl中解析XML的方法最常见的就是使用 XML::DO ...

  10. epoll的LT和ET使用EPOLLONESHOT

    epoll有两种触发的方式即LT(水平触发)和ET(边缘触发)两种,在前者,只要存在着事件就会不断的触发,直到处理完成,而后者只触发一次相同事件或者说只在从非触发到触发两个状态转换的时候儿才触发. 这 ...