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的更多相关文章

  1. Datatable 导出到execl 官网demo

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-type" content ...

  2. DataTable 更改在有数据列的类型方法+DataTable 导出excel功能

    /// <summary> /// 导出功能 /// </summary> /// <param name="sender"></para ...

  3. [转].net 使用NPOI或MyXls把DataTable导出到Excel

    本文转自:http://www.cnblogs.com/yongfa365/archive/2010/05/10/NPOI-MyXls-DataTable-To-Excel-From-Excel.ht ...

  4. NPOI通过DataTable导出和读取Excel

    Excel导入及导出问题产生: 从接触.net到现在一直在维护一个DataTable导出到Excel的类,时不时还会维护一个导入类.以下是时不时就会出现的问题: 导出问题: 如果是asp.net,你得 ...

  5. NPOI DataTable导出excel

    /// <summary> /// DataTable导出到Excel文件 /// </summary> /// <param name="dtSource&q ...

  6. WinForm 使用 NPOI 2.2.1从datatable导出Excel

    最新的NOPI应该是2.3了,但在官网上还是2.2.1. 也是第一次使用NPOI来导出Excel文件. 在写的时候搜不到2.2.1的教程,搜了一个2.2.0的教程. 不过也没什么问题,NPOI是真的方 ...

  7. 并发编程概述 委托(delegate) 事件(event) .net core 2.0 event bus 一个简单的基于内存事件总线实现 .net core 基于NPOI 的excel导出类,支持自定义导出哪些字段 基于Ace Admin 的菜单栏实现 第五节:SignalR大杂烩(与MVC融合、全局的几个配置、跨域的应用、C/S程序充当Client和Server)

    并发编程概述   前言 说实话,在我软件开发的头两年几乎不考虑并发编程,请求与响应把业务逻辑尽快完成一个星期的任务能两天完成绝不拖三天(剩下时间各种浪),根本不会考虑性能问题(能接受范围内).但随着工 ...

  8. 将execl里的数据批量导入数据库

    本文将采用NPOI插件来读取execl文件里的数据,将数据加载到内存中的DataTable中 /// <summary> /// 将Excel转换为DataTable /// </s ...

  9. NET使用NPOI组件导出Excel-入门示例及通用方法

    一.Excel导入及导出问题产生:   从接触.net到现在一直在维护一个DataTable导出到Excel的类,时不时还会维护一个导入类.以下是时不时就会出现的问题:   导出问题:   如果是as ...

随机推荐

  1. hdu4920Matrix multiplication (矩阵,bitset)

    Problem Description Given two matrices A and B of size n×n, find the product of them. bobo hates big ...

  2. Codeforces Global Round 12 D. Rating Compression (思维,双指针)

    题意:给你一长度为\(n\)的数组,有一长度为\(k\ (1\le k \le n)\)的区间不断从左往右扫过这个数组,总共扫\(n\)次,每次扫的区间长度\(k=i\),在扫的过程中,每次取当前区间 ...

  3. hdu5531 Rebuild

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submissi ...

  4. SpringBoot整合shiro-MD5盐值加密

    为什么要进行密码加密? 在我们的日常生活中,许多人有着在不同网站上使用相同密码的坏习惯(包括我也是qaq),假如应用程序或服务器出现漏洞,数据被窃取,用户的明文密码直接被暴露给黑客.显然后果将不堪设想 ...

  5. MySQL 索引的类型

    主键索引(PRIMARY KEY) # 主键 = 唯一键索引 + 非空 + 只能设置一个字段 # 创建表的时候创建主键索引 mysql> create table test(id int not ...

  6. next v5升级到next v7需要注意的地方

    title: next v5升级到next v7需要注意的地方 date: 2020-03-04 categories: web tags: [hexo,next] 大部分的设置都是一样的,但有一些细 ...

  7. 解决关闭ssh后网页停止服务的方法,利用nohup

    上一篇文章提到宝塔面板无法运行,只能用ssh运行app.py. 关闭ssh时,app.py会被杀死.因为app.py的父进程就是ssh,关掉ssh会造成进程被杀死. 解决方法参考  https://w ...

  8. Leetcode(23)-合并K个排序链表

    合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [   1->4->5,   1->3->4,   2->6 ] 输出: 1-&g ...

  9. HDU 2825 Wireless Password(AC自动机 + 状压DP)题解

    题意:m个密码串,问你长度为n的至少含有k个不同密码串的密码有几个 思路:状压一下,在build的时候处理fail的时候要用 | 把所有的后缀都加上. 代码: #include<cmath> ...

  10. CSS3 优先级

    CSS3   优先级  https://developer.mozilla.org/zh-CN/docs/Web/CSS/Specificity 优先级 在本文章中 概念 优先级是如何计算的? 选择器 ...