根据自己项目需求编写,仅供参考

个人建议:使用Excel模板进行导出操作。尽量避免自己生成Excel(既繁琐又容易出BUG)。大多情况下导出Excel都是固定格式,使用模板导出会方便很多。

public class NpoiExcelHelper
{
/// <summary>
/// 读取excel转为DataTable
/// </summary>
/// <param name="fileName">文件路径</param>
/// <param name="sheetName">指定sheet</param>
/// <param name="isColumnName">第一行是否为列名</param>
/// <param name="startRow">从第几行开始</param>
/// <returns></returns>
public static DataTable ExcelToDataTable(string fileName, string sheetName, bool isColumnName, int startRow = )
{
IWorkbook workBook = null;
ISheet sheet = null;
DataTable dt = new DataTable();
using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read))
{
//低于2007版本
if (Path.GetExtension(fileName) == ".xls")
{
workBook = new HSSFWorkbook(fs);
}
//2007及以上版本
else if (Path.GetExtension(fileName) == ".xlsx")
{
workBook = new XSSFWorkbook(fs);
}
}
//判断是否指定sheet上传
if (sheetName != null)
{
//获取指定sheet
sheet = workBook.GetSheet(sheetName);
if (sheet == null)
{
//获取不到时取第一个sheet
sheet = workBook.GetSheetAt();
}
}
else
{
sheet = workBook.GetSheetAt();
}
if (sheet != null)
{
//sheet中第一行
IRow firstRow = sheet.GetRow();
if (firstRow == null)
{
throw new Exception("首行无数据");
} //遍历第一行的单元格
for (int i = firstRow.FirstCellNum; i < firstRow.LastCellNum; i++)
{
//得到列名
ICell cell = firstRow.GetCell(i);
if (cell != null)
{
//得到列名的值,若列名不是字符则不能使用StringCellValue,最好使用ToString()
string cellValue = cell.ToString();
if (cellValue != null)
{
try
{
//判断第一行是否是列名
if (isColumnName)
{
//将列放入datatable中
DataColumn column = new DataColumn(cellValue);
dt.Columns.Add(column);
}
else
{
//将空列放入datatable中
DataColumn column = new DataColumn();
dt.Columns.Add(column);
}
}
catch
{
throw new Exception("列名有误!");
}
}
startRow = sheet.FirstRowNum + ;
}
}
//遍历所有行
for (int i = startRow; i <= sheet.LastRowNum; i++)
{
//得到i行
IRow row = sheet.GetRow(i);
if (row == null)
{
continue;
}
//datatable新增行
DataRow dr = dt.NewRow();
//遍历i行的单元格
for (int j = row.FirstCellNum; j < row.LastCellNum; j++)
{
if (row.GetCell(j) != null)
{
dr[j] = row.GetCell(j).ToString();
}
}
try
{
//将行放入datatable中
dt.Rows.Add(dr);
}
catch
{
throw new Exception("第" + i + "行有误!");
}
}
}
return dt;
}
/// <summary>
/// DataTable导出到Excel
/// </summary>
/// <param name="fileName">导出文件的路径</param>
/// <param name="templetName">导出模板路径</param>
/// <param name="dt">DataTable</param>
/// <param name="titleName">文件标题</param>
/// <param name="sheetName">文件sheet名称</param>
public static void DataTableToExcel(string fileName,string templetName, DataTable dt, string titleName,string sheetName)
{
FileStream fs1 = new FileStream(templetName, FileMode.Open, FileAccess.Read);
IWorkbook workBook = new HSSFWorkbook(fs1);
ISheet sheet = workBook.GetSheet(sheetName); //第一行
IRow row0 = sheet.GetRow();
ICell cellTitle = row0.GetCell();
cellTitle.SetCellValue(titleName);
//第二行
IRow row1 = sheet.GetRow();
for (int j = ; j < dt.Columns.Count; j++)
{
ICell cell = row1.GetCell(j);
cell.SetCellValue(dt.Columns[j].ColumnName);
}
for (int i = ; i < dt.Rows.Count; i++)
{
IRow rowi = sheet.CreateRow(i + );
for (int j = ; j < dt.Columns.Count; j++)
{
//创建单元格
ICell cell = rowi.CreateCell(j);
//给单元格赋值
cell.SetCellValue(dt.Rows[i][j].ToString());
cell.CellStyle.BorderBottom = BorderStyle.Thin;
cell.CellStyle.BorderLeft = BorderStyle.Thin;
}
}
using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write))
{
workBook.Write(fs);
}
}
}

C# NPOI操作Excel(下)的更多相关文章

  1. C#开发中使用Npoi操作excel实例代码

    C#开发中使用Npoi操作excel实例代码 出处:西西整理 作者:西西 日期:2012/11/16 9:35:50 [大 中 小] 评论: 0 | 我要发表看法 Npoi 是什么? 1.整个Exce ...

  2. 使用NPOI操作Excel文件及其日期处理

    工作中经常遇到需要读取或导出Excel文件的情况,而NPOI是目前最宜用.效率最高的操作的Office(不只是Excel哟)文件的组件,使用方便,不详细说明了. Excel工作表约定:整个Excel表 ...

  3. NPOI操作Excel辅助类

    /// <summary> /// NPOI操作excel辅助类 /// </summary> public static class NPOIHelper { #region ...

  4. NPOI操作excel之写入数据到excel表

    在上一篇<NPOI操作excel之读取excel数据>我们把excel数据写入了datatable中,本篇就讲如何把datatable数据写入excel中. using System; u ...

  5. 用NPOI操作EXCEL关于HSSFClientAnchor(dx1,dy1,dx2,dy2,col1,row1,col2,row2)的参数

    2.4.1 用NPOI操作EXCEL关于HSSFClientAnchor(dx1,dy1,dx2,dy2,col1,row1,col2,row2)的参数   NPOI教程:http://www.cnb ...

  6. C# 如何使用NPOI操作Excel以及读取合并单元格等

    C#操作Excel方法有很多,以前用的需要电脑安装office才能用,但因为版权问题公司不允许安装office.所以改用NPOI进行Excel操作,基本上一些简单的Excel操作都没有问题,读写合并单 ...

  7. 用NPOI操作EXCEL-锁定列CreateFreezePane()

    public void ExportPermissionRoleData(string search, int roleStatus) { var workbook = new HSSFWorkboo ...

  8. .NET 通过 NPOI 操作 Excel

    目录 .NET 通过 NPOI 操作 Excel 第一步:通过 NuGet 获取 NPOI 包并引入程序集 第二步:引入 NPOI 帮助类 第三步:在程序中调用相应的方法对数据进行导出导入操作 将 D ...

  9. 2.6.2 用NPOI操作EXCEL--设置密码才可以修改单元格内容

    2.6.2 用NPOI操作EXCEL--设置密码       有时,我们可能需要某些单元格只读,如在做模板时,模板中的数据是不能随意让别人改的.在Excel中,可以通过“审阅->保护工作表”来完 ...

  10. [Solution] NPOI操作Excel

    NPOI 是 POI 项目的 .NET 版本.POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目.使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 ...

随机推荐

  1. HDU 1556.Color the ball-差分数组-备忘

    备忘. 差分数组: 区间更新查询有很多方法,线段树.树状数组等都可以.如果为离线查询,就可以考虑使用差分数组. 假设对于区间[l,r]的每个数都加1,我们用一个数组a来记录,a[l]+=1;a[r+1 ...

  2. (1)Maven安装及配置

    一.下载 http://maven.apache.org/download.cgi 解压 二.配置环境变量  1 2.path mvn -version 三.本地仓库 本地仓库用来存放远程下载的包,默 ...

  3. Ubuntu 14.04 安装JDK 8

    1.安装JDK,参考 1.下载 JDK 8 从http://www.oracle.com/technetwork/java/javasebusiness/downloads/选择下载JDK的最新版本 ...

  4. ZCMU Problem A: Good Joke!

      Problem A: Good Joke! Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 25  Solved: 16[Submit][Status ...

  5. python formatters 与字符串 小结 (python 2)

    最近学习python 2 ,觉得有必要小结一下关于字符串处理中的formatters, 转载请声明本文的引用出处:仰望大牛的小清新 0.%进行变量取值使用的时机 在python中,如果我们只是需要在字 ...

  6. Python与数据结构[3] -> 树/Tree[1] -> 表达式树和查找树的 Python 实现

    表达式树和查找树的 Python 实现 目录 二叉表达式树 二叉查找树 1 二叉表达式树 表达式树是二叉树的一种应用,其树叶是常数或变量,而节点为操作符,构建表达式树的过程与后缀表达式的计算类似,只不 ...

  7. 训练指南 UVALive - 3713 (2-SAT)

    layout: post title: 训练指南 UVALive - 3713 (2-SAT) author: "luowentaoaa" catalog: true mathja ...

  8. poj2778(AC 自动机)

    poj2778 题意 构造只包含 \(A, T, C, G\) 的字符串,且满足不出现指定的一些字符串,问长度为 \(n\) 的字符串有多少种 ? 分析 AC 自动机 + 矩阵快速幂的神题 ,知识点很 ...

  9. Windows 环境下 Redis 安装

    1.redis官方下载地址:https://redis.io/download,redis 64位下载地址:https://github.com/MicrosoftArchive/redis/rele ...

  10. [LOJ#2540][PKUWC2018]随机算法(概率DP)

    场上数据很水,比较暴力的做法都可以过90分以上,下面说几个做法. 1. 暴力枚举所有最大独立集,对每个独立集分别DP.复杂度玄学,但是由于最大独立集并不多,所以可以拿90. 2. dp[S][k]表示 ...