当前位置: 移动技术网 > IT编程>开发语言>c# > C#如何将DataTable导出到Excel解决方案

C#如何将DataTable导出到Excel解决方案

2019年07月18日  | 移动技术网IT编程  | 我要评论
最近,由于公司项目中需要将系统内用户操作的所有日志进行转存备份,考虑到以后可能还需要还原,所以最后决定将日志数据备份到excel中。 下面是我项目当中excel.cs这个类
最近,由于公司项目中需要将系统内用户操作的所有日志进行转存备份,考虑到以后可能还需要还原,所以最后决定将日志数据备份到excel中。

下面是我项目当中excel.cs这个类的全部代码,通过这个类可以很容易地将datatable中的数据导入到excel方法中。

首先,必须要下载npoi.dll这个程序集,
类代码如下:
复制代码 代码如下:

using system;
using npoi.hssf;
using npoi.hpsf;
using npoi.hssf.usermodel;
using npoi.hssf.util;
using npoi.ss.usermodel;
using system.collections;
using system.io;
using system.data;
namespace backupattach
{
public class excel
{
private hssfworkbook _workbook;
private isheet _wbsheet = null;
private datacolumncollection _columns = null;
private int _col = 0; //total columns
private int _row = 0; //total rows
private int _sheet = 0; //total sheets
private int _sheetrownum = 65536; //each sheet allow rows
public excel()
{
instanceworkbook();
}
/// <summary>
/// 实例方法
/// </summary>
/// <param name="sheetrownum">单个表单允许的最大行数</param>
public excel(int sheetrownum)
{
_sheetrownum = sheetrownum;
instanceworkbook();
}
/// <summary>
/// 实例方法
/// </summary>
/// <param name="columns">表头</param>
public excel(datacolumncollection columns)
{
_columns = columns;
instanceworkbook();
}
private void instanceworkbook()
{
/////cretate workbook
_workbook = new hssfworkbook();
var dsi = propertysetfactory.createdocumentsummaryinformation();
dsi.company = "baiyitimes";
_workbook.documentsummaryinformation = dsi;
////create a entry of summaryinformation
var si = propertysetfactory.createsummaryinformation();
si.subject = "etimes secure document system log backup";
_workbook.summaryinformation = si;
}
private datacolumncollection getcolumns(datacolumncollection columns)
{
return columns == null || columns.count == 0 ? _columns : columns;
}
private isheet getsheet(isheet sheet)
{
return sheet == null ? _wbsheet : sheet;
}
private void createheader(isheet sheet, datacolumncollection columns)
{
_columns = getcolumns(columns);
/////create row of column
var orow = sheet.createrow(0);
foreach (datacolumn column in _columns)
{
var ocell = orow.createcell(_col);
var style1 = _workbook.createcellstyle();
style1.fillforegroundcolor = hssfcolor.blue.index2;
style1.fillpattern = fillpatterntype.solid_foreground;
style1.alignment = horizontalalignment.center;
style1.verticalalignment = verticalalignment.center;
var font = _workbook.createfont();
font.color = hssfcolor.white.index;
style1.setfont(font);
ocell.cellstyle = style1;
var name = column.columnname;
ocell.setcellvalue(name.tostring());
_col++;
}
///// header belong to rows
_row++;
}
private void createheader(isheet sheet)
{
createheader(sheet, null);
}
public isheet createsheet()
{
return createsheet(null);
}
public isheet createsheet(datacolumncollection columns)
{
_wbsheet = _workbook.createsheet((_sheet + 1).tostring());
createheader(_wbsheet, columns);
_sheet++;
return _wbsheet;
}
public void setrowvalue(datarowcollection rows, isheet sheet)
{
_wbsheet = getsheet(sheet);
foreach (datarow row in rows)
{
setrowvalue(row);
}
}
public void setrowvalue(datarowcollection rows)
{
setrowvalue(rows, null);
}
public void setrowvalue(datarow row)
{
// create a new sheet
if (_row % _sheetrownum == 0)
{
createsheet();
}
var orow = _wbsheet.createrow(_row % _sheetrownum);
var obj = string.empty;
var cell = 0;
foreach (datacolumn column in _columns)
{
obj = row[column.columnname].tostring();
orow.createcell(cell).setcellvalue(obj);
cell++;
}
_row++;
}
public void setprotectpassword(string password, string username)
{
_workbook.writeprotectworkbook(password, username);
}
public void saveas(string filepath)
{
if (file.exists(filepath)) file.delete(filepath);
var file = new filestream(filepath, filemode.create);
_workbook.write(file);
file.close();
}
}
}

下面给出小demo共参考:
复制代码 代码如下:

public void datatabletoexcel(datatable dt,string path)
{
//instance excel object
//excel excel = new excel(65536);
excel excel = new excel();
//create a sheet
excel.createsheet(dt.columns);
//write value into rows
//excel.setrowvalue(dt.rows);
foreach (datarow row in dt.rows)
{
excel.setrowvalue(row);
}
// set excel protected
excel.setprotectpassword("etimes2011@", "baiyi");
// save excel file to local
excel.saveas(path);
}

缺点:如果要导入到excel中的数据量较多时(几十万或者几百万行),全部一次性放到datatable中可能会对内存消耗很大,建议每次导入的数据最好不要超过1000条,可采取分页查询的方式将数据导入excel中。

优点:1997-2003版本的xls中每个表单最大只支持65536行,2010可以支持1048576行,考虑到客户机上安装的版本不一样,故excel对象每个表单最大支持65536行,当表单到达最大行数时,excel对象内部会自动创建新表单,在往excel中写数据的时候不用考虑这一点,这样调用的时候更为方便

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

  • c# 面试必备线程基础知识点

    c# 面试必备线程基础知识点

    线程的知识太多,知识点有深有浅,往深的研究会涉及操作系统、cpu、内存,往浅了说就是一些语法。没有一定的知识积累,很难把线程的知识写得全面,当然我也没有这个能力... [阅读全文]
  • C#使用System.Net邮件发送功能踩过的坑

    C#使用System.Net邮件发送功能踩过的坑

    1.eazyemail邮件发送类库net 类库自带了邮件发送功能。笔者对该类库,从使用的角度进行了二次封装,nuget上可搜索eazyemail,注入容器时通过... [阅读全文]
  • C#基于Modbus三种CRC16校验方法的性能对比

    C#基于Modbus三种CRC16校验方法的性能对比

    1.背景介绍主要应用场景在物联网中,底端设备注册报文的上报,需要对报文的有效载荷(data)进行crc16的复验,验证与设备端的crc校验是否相等,如果相等,报... [阅读全文]
  • 深入谈谈C#9新特性的实际运用

    前言你一定会好奇:“老周,你去哪开飞机了?这么久没写博客了。”老周:“我买不起飞机,开了个铁矿,挖了一年半的石头。谁知铁矿垮了,压死了几条蜈蚣,什么也没挖着。”... [阅读全文]
  • C# 泛型集合的自定义类型排序的实现

    C# 泛型集合的自定义类型排序的实现

    一、泛型集合list<t>排序经sort方法之后,采用了升序的方式进行排列的。二、对自定义类型进行排序定义一个普通类:接下来,将定义的person实... [阅读全文]
  • C#开发中常用的加密解密方法汇总

    相信很多人在开发过程中经常会遇到需要对一些重要的信息进行加密处理,今天给大家分享我个人总结的一些加密算法:常见的加密方式分为可逆和不可逆两种方式可逆:rsa,a... [阅读全文]
  • C# 如何添加错误日志信息

    系统日志系统日志包含了由windows系统组件记录的事件。例如,在启动期间装入驱动程序或其他系统组件失败被记录到系统日志。要查看系统日志: 打开命令提示符。 ... [阅读全文]
  • 关于C#委托三种调用的分享使用

    关于C#委托三种调用的分享使用

    一、同步调用1、同步调用会按照代码顺序来执行2、同步调用会阻塞线程,如果是要调用一项繁重的工作(如大量io操作),可能会让程序停顿很长时间,造成糟糕的用户体验,... [阅读全文]
  • 用c# 自动更新程序

    作者:冰封一夏出处:hzhcontrols官网:首先看获取和更新的接口更新程序program.cs更新程序界面定义服务端接口,你可以用任意接口都行,我这里用we... [阅读全文]
  • c# 生成二维码的示例

    二维码是越来越流行了,很多地方都有可能是使用到。如果是静态的二维码还是比较好处理的,通过在线工具就可以直接生成一张二维码图片,比如:草料二维码。但有的时候是需要... [阅读全文]
验证码:
移动技术网