c#(NPOI)DataTable导出execl,execl(支持解析公式)导入DataTable
NPOI(C#)DataTable导出execl
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System;
using NPOI.SS.Util;
namespace Common
{
/// <summary>
/// 使用NPOI操作Excel,无需Office COM组件
/// </summary>
public class ExcelHelper
{
/// <summary>
/// DataTable转换成Excel文档流,并输出到客户端,如果设置表名请设置table.TableName="表名"
/// </summary>
/// <param name="table">DataTable</param>
/// <param name="context">上下文对象</param>
/// <param name="fileName">Excel文件名(为空以当前时间加随机数命名)</param>
public static void RenderToExcel(DataTable table, HttpContext context, string fileName=null)
{
var name = "";
if (fileName==""&&fileName==null)
{
name = DateTime.Now.ToString("yyyyMMddhhmmss") + new Random(DateTime.Now.Second).Next(10000);
}
else
{
name = fileName + new Random(DateTime.Now.Second).Next(10000);
} var path = context.Server.MapPath("~/xls_down/" + name + ".xls");
if (!Directory.Exists(context.Server.MapPath("~/xls_down")))
{
Directory.CreateDirectory(context.Server.MapPath("~/xls_down"));
}
else
{
//DeleteAllFile(context.Server.MapPath("~/xls_down"));
}
TableToExcelForXLS(table, path, fileName); System.IO.FileInfo file = new System.IO.FileInfo(path);
context.Response.ContentType = "application/ms-download";
context.Response.Clear();
context.Response.AddHeader("Content-Type", "application/octet-stream");
context.Response.Charset = "utf-8";
context.Response.AddHeader("Content-Disposition", "attachment;filename=" + System.Web.HttpUtility.UrlEncode(file.Name, System.Text.Encoding.UTF8));
context.Response.AddHeader("Content-Length", file.Length.ToString());
context.Response.WriteFile(file.FullName);
context.Response.Flush();
context.Response.Clear();
context.Response.End();
}
/// <summary>
/// 将DataTable数据导出到Excel文件中(xls)
/// </summary>
/// <param name="dt"></param>
/// <param name="file">路径</param>
/// <param name="tablename">表名</param>
public void TableToExcelForXLS(DataTable dt, string file,string tablename=null)
{
HSSFWorkbook hssfworkbook = new HSSFWorkbook(); if (tablename == null)
tablename = "table1";
ISheet sheet = hssfworkbook.CreateSheet(tablename);
int n = 0; //控制表名,在第一行(列名前面一行)显示 if (dt.TableName != null && dt.TableName!="")
{
//表名
//设置一个合并单元格区域,使用上下左右定义CellRangeAddress区域
//CellRangeAddress四个参数为:起始行,结束行,起始列,结束列
sheet.AddMergedRegion(new CellRangeAddress(0, 0, 0, dt.Columns.Count));
IRow rowtitle = sheet.CreateRow(0); ICell celltitle = rowtitle.CreateCell(0);
celltitle.SetCellValue(dt.TableName);
//设置单元格样式时需要注意,务必创建一个新的样式对象进行设置,否则会将工作表所有单元格的样式一同设置,它们应该共享的是一个样式对象
ICellStyle style = hssfworkbook.CreateCellStyle();
//设置单元格的样式:水平对齐居中
style.Alignment = HorizontalAlignment.Center;
//新建一个字体样式对象
IFont font = hssfworkbook.CreateFont();
//设置字体加粗样式
font.Boldweight = short.MaxValue;
//使用SetFont方法将字体样式添加到单元格样式中
style.SetFont(font);
//将新的样式赋给单元格
celltitle.CellStyle = style;
n = 1; //添加表名之后置为1
} int[] ColumnWidthArray = new int[dt.Columns.Count]; //列宽数组(自适应列宽)
//表头
IRow row = sheet.CreateRow(n);
for (int i = 0; i < dt.Columns.Count; i++)
{
ICell cell = row.CreateCell(i);
cell.SetCellValue(dt.Columns[i].ColumnName);
//可以获取中文长度,中文占2个字符
ColumnWidthArray[i] = System.Text.Encoding.Default.GetBytes(dt.Columns[i].ColumnName).Length;
} //数据
for (int i = 0; i < dt.Rows.Count; i++)
{
IRow row1 = sheet.CreateRow(i + n+1);
for (int j = 0; j < dt.Columns.Count; j++)
{
ICell cell = row1.CreateCell(j);
String cellValue=dt.Rows[i][j].ToString();
cell.SetCellValue(cellValue);
if (System.Text.Encoding.Default.GetBytes(cellValue).Length > ColumnWidthArray[j])
{
ColumnWidthArray[j] = System.Text.Encoding.Default.GetBytes(cellValue).Length;
}
}
}
for (int i = 0; i < dt.Columns.Count; i++)
{
sheet.SetColumnWidth(i, (ColumnWidthArray[i]+2) * 256);
}
//转为字节数组
MemoryStream stream = new MemoryStream();
hssfworkbook.Write(stream);
var buf = stream.ToArray(); //保存为Excel文件
using (FileStream fs = new FileStream(file, FileMode.Create, FileAccess.Write))
{
fs.Write(buf, 0, buf.Length);
fs.Flush();
}
}
}
}
execl(支持解析公式)导入DataTable
1 /// <summary>
2 /// 将Excel文件中的数据读出到DataTable中(xls)
3 /// </summary>
4 /// <param name="file">文件绝对路径</param>
5 /// <returns></returns>
6 public static DataTable ExcelToTableForXLS(string file, int sheetIndex = 0)
7 {
8 DataTable dt = new DataTable();
9 using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read))
10 {
11 HSSFWorkbook hssfworkbook = new HSSFWorkbook(fs);
12 ISheet sheet = hssfworkbook.GetSheetAt(sheetIndex);
13
14 //表头
15 IRow header = sheet.GetRow(sheet.FirstRowNum);
16 List<int> columns = new List<int>();
17 for (int i = 0; i < header.LastCellNum; i++)
18 {
19 object obj = GetValueTypeForXLS(header.GetCell(i) as HSSFCell);
20 if (obj == null || obj.ToString() == string.Empty)
21 {
22 dt.Columns.Add(new DataColumn("Columns" + i.ToString()));
23 //continue;
24 }
25 else
26 dt.Columns.Add(new DataColumn(obj.ToString()));
27 columns.Add(i);
28 }
29 //数据
30 for (int i = sheet.FirstRowNum + 1; i <= sheet.LastRowNum; i++)
31 {
32 IRow row = sheet.GetRow(i);
33
34 if (row != null)
35 {
36 DataRow dr = dt.NewRow();
37 bool hasValue = false;
38 foreach (int j in columns)
39 {
40 dr[j] = GetValueTypeForXLS(sheet.GetRow(i).GetCell(j) as HSSFCell);
41 #region 增加格式解析
42 if (row.GetCell(j) != null)
43 {
44 switch (row.GetCell(j).CellType)
45 {
46 case CellType.Numeric:
47 if (HSSFDateUtil.IsCellDateFormatted(row.GetCell(j)))//日期类型
48 {
49 dr[j] = row.GetCell(j).DateCellValue.ToString("yyyy-MM-dd");
50 }
51 else//其他数字类型
52 {
53 dr[j] = row.GetCell(j).NumericCellValue;
54 }
55 break;
56 case CellType.Blank:
57 dr[j] = string.Empty;
58 break;
59 case CellType.Formula:
60 if (Path.GetExtension(file).ToLower().Trim() == ".xlsx")
61 {
62 XSSFFormulaEvaluator eva = new XSSFFormulaEvaluator(hssfworkbook);
63 if (eva.Evaluate(row.GetCell(j)).CellType == CellType.Numeric)
64 {
65 if (HSSFDateUtil.IsCellDateFormatted(row.GetCell(j)))//日期类型
66 {
67 dr[j] = row.GetCell(j).DateCellValue.ToString("yyyy-MM-dd");
68 }
69 else//其他数字类型
70 {
71 dr[j] = row.GetCell(j).NumericCellValue;
72 }
73 }
74 else
75 {
76 dr[j] = eva.Evaluate(row.GetCell(j)).StringValue;
77 }
78 }
79 else
80 {
81 HSSFFormulaEvaluator eva = new HSSFFormulaEvaluator(hssfworkbook);
82 if (eva.Evaluate(row.GetCell(j)).CellType == CellType.Numeric)
83 {
84 if (HSSFDateUtil.IsCellDateFormatted(row.GetCell(j)))//日期类型
85 {
86 dr[j] = row.GetCell(j).DateCellValue.ToString("yyyy-MM-dd");
87 }
88 else//其他数字类型
89 {
90 dr[j] = row.GetCell(j).NumericCellValue;
91 }
92 }
93 else
94 {
95 dr[j] = eva.Evaluate(row.GetCell(j)).StringValue;
96 }
97 }
98 break;
99 default:
100 dr[j] = row.GetCell(j).StringCellValue;
101 break;
102
103 }
104 }
105 #endregion
106
107 if (dr[j] != null && dr[j].ToString() != string.Empty)
108 {
109 hasValue = true;
110 }
111 }
112 if (hasValue)
113 {
114 dt.Rows.Add(dr);
115 }
116 }
117 }
118 }
119
120 return dt;
121 }
c#(NPOI)DataTable导出execl,execl(支持解析公式)导入DataTable的更多相关文章
- Datatable 导出到execl 官网demo
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-type" content ...
- DataTable 更改在有数据列的类型方法+DataTable 导出excel功能
/// <summary> /// 导出功能 /// </summary> /// <param name="sender"></para ...
- [转].net 使用NPOI或MyXls把DataTable导出到Excel
本文转自:http://www.cnblogs.com/yongfa365/archive/2010/05/10/NPOI-MyXls-DataTable-To-Excel-From-Excel.ht ...
- NPOI通过DataTable导出和读取Excel
Excel导入及导出问题产生: 从接触.net到现在一直在维护一个DataTable导出到Excel的类,时不时还会维护一个导入类.以下是时不时就会出现的问题: 导出问题: 如果是asp.net,你得 ...
- NPOI DataTable导出excel
/// <summary> /// DataTable导出到Excel文件 /// </summary> /// <param name="dtSource&q ...
- WinForm 使用 NPOI 2.2.1从datatable导出Excel
最新的NOPI应该是2.3了,但在官网上还是2.2.1. 也是第一次使用NPOI来导出Excel文件. 在写的时候搜不到2.2.1的教程,搜了一个2.2.0的教程. 不过也没什么问题,NPOI是真的方 ...
- 并发编程概述 委托(delegate) 事件(event) .net core 2.0 event bus 一个简单的基于内存事件总线实现 .net core 基于NPOI 的excel导出类,支持自定义导出哪些字段 基于Ace Admin 的菜单栏实现 第五节:SignalR大杂烩(与MVC融合、全局的几个配置、跨域的应用、C/S程序充当Client和Server)
并发编程概述 前言 说实话,在我软件开发的头两年几乎不考虑并发编程,请求与响应把业务逻辑尽快完成一个星期的任务能两天完成绝不拖三天(剩下时间各种浪),根本不会考虑性能问题(能接受范围内).但随着工 ...
- 将execl里的数据批量导入数据库
本文将采用NPOI插件来读取execl文件里的数据,将数据加载到内存中的DataTable中 /// <summary> /// 将Excel转换为DataTable /// </s ...
- NET使用NPOI组件导出Excel-入门示例及通用方法
一.Excel导入及导出问题产生: 从接触.net到现在一直在维护一个DataTable导出到Excel的类,时不时还会维护一个导入类.以下是时不时就会出现的问题: 导出问题: 如果是as ...
随机推荐
- 【uva 12174】Shuffle(算法效率--滑动窗口)
题意:假设一种音乐播放器有一个乱序的功能,设定每播放S首歌为一个周期,随机播放编号为1~S的歌曲.现在给一个长度为N的部分播放记录,请统计下次随机排序所发生的时间的可能性种数.(1≤S,N≤10000 ...
- Codeforces Round #633 div2 A~C
A. Filling Diamonds 题意:给你n个菱形方块,问能构成图示形状的有多少种 题解:自己画几个不难发现答案是n 代码: 1 #include <iostream> 2 #in ...
- 病毒侵袭持续中 HDU - 3065 AC自动机
小t非常感谢大家帮忙解决了他的上一个问题.然而病毒侵袭持续中.在小t的不懈努力下,他发现了网路中的"万恶之源".这是一个庞大的病毒网站,他有着好多好多的病毒,但是这个网站包含的病毒 ...
- Kafka SASL/SCRAM+ACL实现动态创建用户及权限控制
kafka系列文章 第一章 linux单机安装kafka 第二章 kafka--集群安裝部署(自带zookeeper) 第三章 Kafka SASL/SCRAM+ACL实现动态创建用户及权限控制 Ka ...
- 在.NET中体验GraphQL
前言 以前需要提供Web服务接口的时候,除了标准的WEBAPI形式,还考虑了OData.GraphQL等形式,虽然实现思路上有很大的区别,但对使用方来说,都是将查询的主动权让渡给了前端,让调用方能够更 ...
- 【.NET 与树莓派】让喇叭播放音乐
如果你和老周一样,小时候特别喜欢搞破坏(什么电器都敢拆),那下面这样小喇叭你一定见过. 这种喇叭其实以前很多录音机都用,包括上小学时买来做英语听力的便携录音机.嗯,就是放录音带的那种,录音带也叫磁带或 ...
- K8S(03)核心插件-Flannel网络插件
系列文章说明 本系列文章,可以基本算是 老男孩2019年王硕的K8S周末班课程 笔记,根据视频来看本笔记最好,否则有些地方会看不明白 需要视频可以联系我 K8S核心网络插件Flannel 目录 系列文 ...
- 【转】K8S中部署Helm
K8S中的包管理工具 1. 客户端Helm(即Helm) 通过脚本安装:curl https://raw.githubusercontent.com/helm/helm/master/scripts ...
- CGI & FastCGI 协议
目录 CGI 是什么 CGI 特点 CGI 的流程 FastCGI 是什么 CGI & FastCGI(转载) 推荐Blog: CGI是什么,FastCGI是什么 CGI 是什么 公共网关接口 ...
- DOM型XSS
打开漏洞页面,随便输入点东西,发现没有啥东西. 但是我们发现我们输入的11,在面的herf 中 看到这儿就很简单了,我们只需要闭合一下,就可以构造出我们的payload了. '><img ...