http://blog.csdn.net/fireghost57/article/details/25623143

http://www.cnblogs.com/jiagoushi/archive/2012/12/19/2825712.html

为了操作Excel,npoi.net当然也需要对应的类来对应不同的分类,其中

HSSFWorkbook对应的就是Excel文件  工作簿,

HSSFSheet对应的就是Excel中sheet 工作表,

HSSFCell对应的就是Excel的单元格,

HSSFRow对应的就是Excel的行。

有了这几个不同的类,我们就可以创建Excel文件,创建sheet,给sheet重命名或删除sheet,创建行,添加单元格,为单元格设置格式,我个人感觉其他的都很简单,唯独这个给单元格设置格式的做法很令人讨厌

public class NpoiNet
{
public void CreateWorkBook()
{
string filePath = HttpContext.Current.Server.MapPath("~/npoi.xls");
//表示一个文件流
FileStream fileStream = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite);
HSSFWorkbook workBook = new HSSFWorkbook();//相当于创建了一个内存中的Excel 只是还没有写到硬盘上
try
{
/*按照约定在每个Excel文件中至少要包含一个sheet,如果没有任何sheet,打开Excel文件的时候会报错。
在以前的npoi版本中,如果不是自己手动的创建一个sheet,npoi框架是不会自动创建一个的,但是在最新版的1.2.5中,
我发现即使你忘记了创建sheet的操作,框架会自动创建一个sheet,当然如果你手动创建了一个sheet,则框架就不会
自动的创建一个sheet,这就像构造函数,如果没有写任何一个,.Net会默认存在一个,但是你创建了一个构造函数,则
* 框架就不会自动创建了
* */ workBook.CreateSheet("guozhiqi");//sheet的名称为guozhiqi
workBook.CreateSheet();//sheet的名称为sheet1 从1开始命名
workBook.CreateSheet("yuanjinzhou");
workBook.CreateSheet();//这个sheet的名称应该为什么?答案是sheet3
//创建了sheet 下面我们来创建单元格
HSSFSheet sheetGuozhiqi = (HSSFSheet)workBook.GetSheet("guozhiqi");//获取到sheet名称为guozhiqi的那个工作簿
//创建了工作簿 添加单元格之前首先要添加行
//在这里请注意 行和列的下标都是从0开始的 而不是Excel文件中的1
for (int i = 0; i <= 10; i++)
{
sheetGuozhiqi.CreateRow(i);//创建了11行
} //创建了行之后 就要在每个行中创建单元格
//如果没有在之前创建行
// HSSFRow newRow = (HSSFRow)sheetGuozhiqi.GetRow(12);这是错误的 程序会报异常 这就告诉我们 如果行还没有创建
//就不可以获取
HSSFRow newRow = (HSSFRow)sheetGuozhiqi.GetRow(0); HSSFCell[] cells = new HSSFCell[11];
//在第0行的位置创建单元格
for (int i = 0; i <= 10; i++)
{
cells[i] = (HSSFCell)newRow.CreateCell(i);//为第0行创建了10个单元格
}
//这里取得单元格的异常出现位置相同 就是如果没有创建就不要试图获取
HSSFCell newCell = (HSSFCell)newRow.GetCell(0);//取得第0行第0个单元格 //获取到了单元格 赋值 为了方便说明 我多获取几个单元格的值
//Excel单元格有很多类型 例如字符串 数字 bool等类型,
cells[0].SetCellValue(false);//赋值为bool型
cells[1].SetCellValue(DateTime.Now);//赋值为日期型
cells[2].SetCellValue(3.1415926);//赋值为double类型
cells[3].SetCellValue("guozhiqi");//赋值为字符串guozhiqi //为单元格赋值以后 我们就要开始取值了
bool cell0 = cells[0].BooleanCellValue;
// string cell00 = cells[0].StringCellValue; 错误 这句话的意思就是说存储的时候是什么类型 就必须用对应的
//取值方法取值
DateTime dateTime = cells[1].DateCellValue;
double cell2 = cells[2].NumericCellValue;
string cell3 = cells[3].StringCellValue; //可以正常创建单元格 从单元格取值是远远不够的 还有就是客户可能会要求合并单元格 为单元格设置样式
//合并单元格的操作不必要创建所有的行或列,只需要制定范围即可
sheetGuozhiqi.AddMergedRegion(new NPOI.SS.Util.Region(1,1,20,20));//合并单元格 HSSFCellStyle cellStyle = (HSSFCellStyle)workBook.CreateCellStyle();
cellStyle.Alignment = HorizontalAlignment.CENTER;//居中显示
cellStyle.FillBackgroundColor = 244;
cellStyle.FillPattern = FillPatternType.BRICKS;//填充模式
cellStyle.IsHidden = false;//单元格是否隐藏
cellStyle.IsLocked = false;//单元格是否锁定
cellStyle.VerticalAlignment = VerticalAlignment.CENTER;//垂直居中 //设置单元格字体
HSSFFont font =(HSSFFont) workBook.CreateFont();
font.Color = 200;
font.FontHeight = 18;//设置字体大小
font.FontName = "黑体";//设置字体为黑体
font.IsItalic = false;//是否是斜体
font.IsStrikeout = true;//是否有中间线
font.Underline = (byte)FontUnderlineType.DOUBLE;//设置下划线 cellStyle.SetFont(font);
//将设置好的样式应用到对应的单元格上 否则是没有效果的
cells[0].CellStyle = cellStyle; if (!workBook.IsWriteProtected)
{
workBook.Write(fileStream);
}
}
catch (Exception ex)
{
HttpContext.Current.Response.Write(ex.Message+ex.Source+ex.StackTrace);
}
finally
{
if (fileStream != null)
{
fileStream.Close();
}
}
}
}

使用npoi.net会遇到的一些小问题总结一下。

  1. 在实例化了一个WorkBook之后,最好添加一个sheet,虽然在最新版的Npoi.net中自动添加了,但是遇到迁移到原来版本就会出现问题。所以我建议还是最少添加一个sheet
  2. 在从单元格取值时要注意单元格的类型,一定要用对应的类型的方法来取单元格中的对应类型的值,如果不确定,那只能是强制转换成为string类型,毕竟string类型是excel中其他类型都可以转换过来的
  3. 在获取sheet中的某一行或者某一行的某一个单元格的时候,还要注意就是一定要确保创建了该行,并且取单元格还要确保创建了单元格,否则会报Null reference not to object 这个我们经常会看到的异常信息。在外层一定要加上try捕获异常
  4. 合并单元格是sheet的工作,因此需要获取对应的sheet,然后调用其AddMergedRegion方法合并单元格,在合并单元格的时候,我们不需要确保该单元格已经存在或创建。
  5. 在为单元格设置样式的过程中,我们会发现所有和样式相关的类的创建都是通过workBook.Create(Font)..这种方式来执行的,我们不可以直接new一个类的实例。
  6. 如果前面的工作都已经做好,需要把内存中的excel表写到硬盘上时,需要调用 workBook.write()方法,传入一个文件流进行创建。在这里有可能会出现一个问题,就是你要创建的文件你已经打开了,这时程序就会出现异常, 因此我们在调试程序的时候一定要记得打开了excel文件以后要关闭
  7. 最后需要注意的就是文件流,在我们把excel写到硬盘上以后,要显式的调用其close()方法关闭文件流。因为如果不关闭文件流的话,以后就会出现无法重新创建该文件的错误,并且会提示 某文件正由另一进程使用,因此该进程无法访问此文件。

npoi z的更多相关文章

  1. 【Python】使用torrentParser1.03对多文件torrent的分析结果

    Your environment has been set up for using Node.js 8.5.0 (x64) and npm. C:\Users\horn1>cd C:\User ...

  2. npoi与memcached中的ICSharpCode.SharpZipLib版本冲突的解决方案

    项目中一直使用NPOI与memcached,一直相安无事,但是最近升级了npoi到最新版本,发生了ICSharpCode.SharpZipLib的版本冲突问题. 因为此前一直使用的是NPOI的1.x的 ...

  3. NPOI 读取excel到DataTable 读取隐藏列 读取公式列

    处理思路: 1.打开excel 用NPOI进行读取: 2.读取第一个Sheet: 读取过程中: a.先设置相应列 不隐藏 b.读取Cell时 先判断是否的包含公式 相应代码如下: public sta ...

  4. NPOI导出Excel示例

    摘要:使用开源程序NPOI导出Excel示例.NPOI首页地址:http://npoi.codeplex.com/,NPOI示例博客:http://tonyqus.sinaapp.com/. 示例编写 ...

  5. Unity3d 使用NPOI读写Excel 遇到的问题

    开发环境:unity5.3  NPOI(.net 2.0版  http://npoi.codeplex.com/) 运行环境:PC版, 其他平台没有测试 先上效果图: 实现步骤: 1.新建一个Exce ...

  6. asp.net使用MVC4框架基于NPOI做导出数据到Excel表

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

  7. asp.net mvc 使用NPOI插件导出excel

    /// <summary> /// 交易账单 导出交易列表 /// </summary> /// <returns></returns> public ...

  8. npoi实现数据导出Excel

    npoi     .NET第三方的Office功能组件. 链接地址 http://npoi.codeplex.com/ 引用命名空间 using NPOI.HSSF.UserModel; using ...

  9. NPOI 上传Excel功能

    1.首先写一个Excel表格,第一行数据库类型(varchar.date.decimal).第二行数据库类型长度(100.12,4.时间日期为空)2.html 加按钮 { type: "bu ...

随机推荐

  1. 高通/苹果/联发科:手机CPU那些事

    如今人们买手机,都比较关心采用了什么CPU,因为CPU直接决定了这台手机的性能,CPU之于手机就好比人的大脑,它是整台手机的控制中枢系统,也是逻辑部分的控制中心.又相当于车的发动机,发动机越强劲,车子 ...

  2. 怎么样能让自己的虚拟机上网win7 for linux

    我的电脑是win7 32位 虚拟机是linux 我是通过无线连接互联网的 点无线网络连接 右键 点共享 按照我的方式设置 接下来进入 里面会自动的选择这个 如果没有可以自己按照这个设置 接下来进入虚拟 ...

  3. 整合Struts2+SiteMesh+Spring+MyFaces(JSF)+Freemarker的时候启动服务器报错ClassNotFoundException: org.apache.struts2.sitemesh.FreeMarkerPageFilter

    我一琢磨,难道freemarker与struts2的整合也需要添加一个struts2-freemarker-plugin的jar包? 后来找了半天,确认不需要这个. 然后我就上网搜,这个FreeMar ...

  4. Myeclipse 2014 javascript 添加 jquery 代码提示

    近日在写js,在myeclipse中没有jquery代码的提示着实不方便,在网上使用度娘搜索添加提示方式,试了多种,现经测试以下方式可取. 1.打开help菜单下的install from site. ...

  5. mysql view

    定义:在 SQL 中,视图是基于 SQL 语句的结果集的可视化的表. 1.视图是一个虚拟存在的表,视图可以包含表的全部或者部分记录,也可以由一个表或者多个表来创建.使用视图就可以不用看到数据表中的所有 ...

  6. Android 判断用户2G/3G/4G移动数据网络

    Android 判断用户2G/3G/4G移动数据网络 在做 Android App 的时候,为了给用户省流量,为了不激起用户的愤怒,为了更好的用户体验,是需要根据用户当前网络情况来做一些调整的,也可以 ...

  7. Java @override报错的解决方法

    在eclipse中导入工程后@Overide报错 到入工程后,所有的@Override都报如下错误: Multiple markers at this line - The method getCou ...

  8. 《c程序设计语言》读书笔记--字符串比较

    举例如下: char a[10]; 1.定义的时候直接用字符串赋值 char a[10]="hello"; 注意:不能先定义再给它赋值,如  char a[10];  a[10]= ...

  9. AOJ -0189 Convenient Location && poj 2139 Six Degrees of Cowvin Bacon (floyed求任意两点间的最短路)

    http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=78207 看懂题就好. 求某一办公室到其他办公室的最短距离. 多组输入,n表示 ...

  10. BZOJ 1502 月下柠檬树(simpson积分)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1502 题意:给出如下一棵分层的树,给出每层的高度和每个面的半径.光线是平行的,与地面夹角 ...