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

个人建议:使用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. python数据转换工具Into

    转:http://python.jobbole.com/81564/ 再次介绍Into包:整洁地数据迁移 2015/03/12 ·  基础知识 ·  into, 数据迁移 分享到:3 本文由 伯乐在线 ...

  2. HDU 4857 逃生 【拓扑排序+反向建图+优先队列】

    逃生 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission ...

  3. HDU 多校1.12

  4. lunux多线程编程

    1.进程与线程 1)用户空间角度: 进程:fork()创建进程,在创建时,重新申请了内存空间,copy了父进程的所有信息. 线程:pthread_create()创建进程时,只申请自己的栈空间. 2) ...

  5. Android学习--探究服务(一)

    什么是服务? 服务(service)是Android中实现程序后台运行的解决方案,它非常适合去执行那些不需要和用户交互而且还要求长期运行的任务.服务的运行不依赖任何的用户界面,即使应用被切换到后台或者 ...

  6. The 15th Zhejiang Provincial Collegiate Programming Contest Sponsored by TuSimple - B King of Karaoke

    King of Karaoke Time Limit: 1 Second      Memory Limit: 65536 KB It's Karaoke time! DreamGrid is per ...

  7. Codeforces 863F - Almost Permutation

    863F - Almost Permutation 题意 给出每个位置可以放的数字的范围,定义 \(cost = \sum_{i=1}^{n}(cnt(i))^2\) ,其中 \(cnt(i)\) 为 ...

  8. shell head tail

    head:  打印文件的前10行(默认) tail:     打印文件的后10行(默认) 如果你是个典型的开发或者部署人员,是不是觉得开始亲切起来.我们平时用的最多的命令 $tail -f  cata ...

  9. 【贪心】【DFS】Codeforces Round #403 (Div. 2, based on Technocup 2017 Finals) C. Andryusha and Colored Balloons

    从任意点出发,贪心染色即可. #include<cstdio> #include<algorithm> using namespace std; int v[200010< ...

  10. 【分块】【树状数组】bzoj3744 Gty的妹子序列

    离散化,分块. 预处理出:ans[i][j] 第i块到第j块的逆序对数. f[i][j] 第1~i块中大于j的数的个数. g[i][j] 第1~j块中小于j的数的个数. 每次询问时对于整块部分可以O( ...