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. P2062 分队问题(DP)

    题目描述 给定n个选手,将他们分成若干只队伍.其中第i个选手要求自己所属的队伍的人数大等于a[i]人. 在满足所有选手的要求的前提下,最大化队伍的总数. 注:每个选手属于且仅属于一支队伍. 输入输出格 ...

  2. 1569: Wet Tiles

    Description Alice owns a construction company in the town of Norainia, famous for its unusually dry ...

  3. Codeforces Round #544 (Div. 3) E. K Balanced Teams (DP)

    题意:有\(n\)个人,每个人的能力值是\(a_i\),现在你想将这些人分成\(k\)组(没必要全选),但是每组中最高水平和最低水平的人的能力差值必须\(\le 5\),问最多能选多少人. 题解:想了 ...

  4. win10安装CUDA CUDNN tensorflow-gpu 1.14

    #1 安装anaconda 官网下载安装即可.python3.7版本 #2 安装CUDA CUDNN   tensorflowgpu1.14 对应CUDNN 7.6.1 CUDA 10.0 注意ten ...

  5. SpringBoot 全局视角看springboot

    从单体架构到微服务 单体架构 任何一个网站在发布初期几乎都不可能立马就拥有庞大的用户流量和海量数据,都是在不停 的试错过程中一步一步演变其自身架构,满足其自身业务.比如现在能够抗住双十一这么大 流量的 ...

  6. MATLAB字符串分解, 合并

    % 分解 % regexp s = 'ab/c/d.png' file_name = regexp(s, '/', 'split'); % 'd.png' % split fractions = sp ...

  7. Vue dynamic component All In One

    Vue dynamic component All In One Vue 动态组件 vue 2.x https://vuejs.org/v2/guide/components-dynamic-asyn ...

  8. Windows 10 自带 free 屏幕截图/录像软件 Game Bar! 不仅仅是game-游戏呦! 高清晰,高保真,perfect!不仅仅是游戏呦!

    good news! good news! good news! 重要的事情说三遍! Windows 10 自带  屏幕截图/录像软件 Game Bar! 以后再也不用第三方的 盗版软件了! 对于Wi ...

  9. React 性能优化 All In One

    React 性能优化 All In One Use CSS Variables instead of React Context https://epicreact.dev/css-variables ...

  10. iPhone 12 Pro 屏幕时间设置的密码锁出现弹窗 UI 错位重大 Bug

    iPhone 12 Pro 屏幕时间设置的密码锁出现弹窗 UI 错位重大 Bug iOS 14.1 Bug 弹窗 UI 非常丑 弹窗屏占太高了 屏幕使用时间 https://support.apple ...