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. Codeforces Round #340 (Div. 2) E. XOR and Favorite Number

    time limit per test 4 seconds memory limit per test 256 megabytes input standard input output standa ...

  2. UVA-257 哈希算法

    UVA-257 题意: 给你很多串,你需要找到这个串内有没有两个长度大于3的回文字符串,且要保证这两个回文字符串不相同,也不能完全覆盖,但可以重合一部分 题解: 首先判断回文的话可以通过马拉车算法(M ...

  3. 牛客编程巅峰赛S1第5场 - 青铜&白银 B.完全平方数的尾巴 (暴力)

    题意:有一个数\(x\),判断其是否能有某个完全平方数$mod$1000得到. 题解:直接写个for判断一下就好了,因为对1000取模,所以枚举到1000即可. 代码: class Solution ...

  4. 六、Python集合定义和基本操作方法

    一.集合的定义方法及特点 1.特点: (1)由不同元素组成 #集合由不同元素构成 s={1,2,3,3,4,3,3,} print(s)#运行结果:{1, 2, 3, 4} (2)集合无序 #集合无序 ...

  5. 1.初识Redis

    作者 微信:tangy8080 电子邮箱:914661180@qq.com 更新时间:2019-08-14 20:35:36 星期三 欢迎您订阅和分享我的订阅号,订阅号内会不定期分享一些我自己学习过程 ...

  6. python3 anaconda 安装pyhook3 pythoncom(pywin32)

    为什么不安装pyhook 1.pyhook不支持python3 2.网络上有一些方法下载pyhook的whl然后pip安装到python3,可以运行,但是会因为编码问题导致移动到窗口标题含有非ASCI ...

  7. C++11特性-右值引用

    什么是左值,什么是右值 常见的误区有 = 左边的是左值,右边的是右值. 左值:具有存储性质的对象,即lvalue对象,是指要实际占用内存空间.有内存地址的那些实体对象,例如:变量(variables) ...

  8. leetcode 4 寻找两个有序数组的中位数 二分法&INT_MAX

    小知识 INT_MIN在标准头文件limits.h中定义. #define INT_MAX 2147483647#define INT_MIN (-INT_MAX - 1) 题解思路 其实是类似的二分 ...

  9. canvas绘制五星红旗

    代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8& ...

  10. codevs1068乌龟棋-四维DP,五维如何缩减一维

    我们从起点x开始暴力枚举所有决策 于是可以得到如下转移 void dfs(int x,int A,int B,int C,int D,int y) { if (x==n) {ans=max(ans,y ...