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. 【uva 120】Stacks of Flapjacks(算法效率--构造法+选择排序思想)

    题意:有N张正在锅里的一叠煎饼,每张都有一个数字,代表其大小.厨师每次可以选择一个数k,把从锅底开始数第k张上面的煎饼全部翻过来,即原来在上面的煎饼现在到了下面.要求设计一种方法使得所有煎饼按照从小到 ...

  2. Codeforces Round #687 (Div. 2, based on Technocup 2021 Elimination Round 2) C. Bouncing Ball (后缀和,枚举)

    题意:有一长度为\(n\)的平台,平台有的位置有木桩,可以使小球弹起来,小球必须从第\(p\)个位置开始,而且每次都会向右弹\(k\)个单位,然后有的位置是没有木桩的,你可以在这些的空的位置放一个木桩 ...

  3. WPF Animation For SizeChanged Of UIElement

    效果图 学到一个新词: Show me the money 背景 这几天查资料,看到 CodeProject 上面的一篇 Post <Advanced Custom TreeView Layou ...

  4. TCP之“3次握手,4次挥手”问题——实例分析

    上一篇我们分析了三次握手和四次握手的过程,但是理论分析难免枯燥难懂,下面这篇我们来看一个例子,就能更好地理解tcp链接了. 我们可以通过网络抓包的查看具体的流程: 比如我们服务器开启9502的端口.使 ...

  5. zoj-3872 Beauty of Array (dp)

    ]Edward has an array A with N integers. He defines the beauty of an array as the summation of all di ...

  6. 牛客多校第九场 && ZOJ3774 The power of Fibonacci(二次剩余定理+斐波那契数列通项/循环节)题解

    题意1.1: 求\(\sum_{i=1}^n Fib^m\mod 1e9+9\),\(n\in[1, 1e9], m\in[1, 1e4]\) 思路1.1 我们首先需要知道斐波那契数列的通项是:\(F ...

  7. 杭电多校HDU 6586 String(预处理 + 贪心)题解

    题意: 给你一个串,现需要你给出一个子序列,满足26个约束条件,\(len(A_i) >= L_i\) 且 \(len(A_i) <= R_i\), \(A_i\)为从a到z的26个字母. ...

  8. css sticky & 吸顶效果

    css sticky & 吸顶效果 demo https://codepen.io/xgqfrms/pen/PoqyVYz css position sticky not working ht ...

  9. 在线打开,浏览PDF文件的各种方式及各种pdf插件------(MS OneDrive/google drive & google doc/ github ?raw=true)

    在线打开,浏览PDF文件的各种方式: 1 Google drive&doc   (国内不好使,you know GFW=Great Firewall) 1. google drive: 直接分 ...

  10. how to enable vue cli auto open the localhost url

    how to enable vue cli auto open the localhost URL bad you must click the link by manually, waste of ...