请教用npoi2.0导出word 2.0中4.0的版本CellType.FORMULA 这种单元格怎么取值

NPOI导入EXCEL数据类
编辑:www.fx114.net
本篇文章主要介绍了"NPOI导入EXCEL数据类",主要涉及到NPOI导入EXCEL数据类方面的内容,对于NPOI导入EXCEL数据类感兴趣的同学可以参考一下。
使用NPOI能够帮助开发者在没有安装微软Office的情况下读写Office 97-2003的文件,支持的文件格式包括xls, doc, ppt等。NPOI是构建在POI 3.x版本之上的,它可以在没有安装Office的情况下对Word/Excel文档进行读写操作。
using System.Collections.G
using System.L
using System.T
using NPOI.HSSF.UserM
using System.D
using System.IO;
using NPOI.SS.UserM
using System.Windows.F
using NPOI.XSSF.UserM
& & public class ExcelHelper
& & & & static IW
& & & & #region 导入数据
& & & & public static DataTable ImportExcelFile(string filePath)
& & & & & & #region//初始化信息
& & & & & & try
& & & & & & {
& & & & & & & & using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read))
& & & & & & & & {
& & & & & & & & & & hssfworkbook = new HSSFWorkbook(file);
& & & & & & & & }
& & & & & & }
& & & & & & catch (Exception e)
& & & & & & {
& & & & & & & &
& & & & & & }
& & & & & & #endregion
& & & & & & ISheet sheet = hssfworkbook.GetSheetAt(0);
& & & & & & System.Collections.IEnumerator rows = sheet.GetRowEnumerator();
& & & & & & DataTable dt = new DataTable();
& & & & & & for (int j = 0; j & (sheet.GetRow(0).LastCellNum); j++)
& & & & & & {
& & & & & & & & dt.Columns.Add(Convert.ToChar(((int)'A') + j).ToString());
& & & & & & }
& & & & & & while (rows.MoveNext())
& & & & & & {
& & & & & & & & HSSFRow row = (HSSFRow)rows.C
& & & & & & & & DataRow dr = dt.NewRow();
& & & & & & & & for (int i = 0; i & row.LastCellN i++)
& & & & & & & & {
& & & & & & & & & & ICell cell = row.GetCell(i);
& & & & & & & & & & if (cell == null)
& & & & & & & & & & {
& & & & & & & & & & & & dr[i] =
& & & & & & & & & & }
& & & & & & & & & & else
& & & & & & & & & & {
& & & & & & & & & & & & if (cell.CellType == CellType.Formula)//如果单元格是公式
& & & & & & & & & & & & {
& & & & & & & & & & & & & & dr[i] = cell.NumericCellValue.ToString();
& & & & & & & & & & & & }
& & & & & & & & & & & & else
& & & & & & & & & & & & & & dr[i] = cell.ToString();
& & & & & & & & & & }
& & & & & & & & }
& & & & & & & & dt.Rows.Add(dr);
& & & & & & }
& & & & & &
& & & & public static DataSet ImportExcelFiles(string filePath)
& & & & & & #region//初始化信息
& & & & & & try
& & & & & & {
& & & & & & & & using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read))
& & & & & & & & {
& & & & & & & & & & if (filePath.IndexOf(&.xlsx&) & 0) // 2007版本
& & & & & & & & & & & & hssfworkbook = new XSSFWorkbook(file );
& & & & & & & & & & else if (filePath.IndexOf(&.xls&) & 0) // 2003版本
& & & & & & & & & & & & hssfworkbook = new HSSFWorkbook(file );
& & & & & & & & }
& & & & & & }
& & & & & & catch (Exception e)
& & & & & & {
& & & & & & & &
& & & & & & }
& & & & & & #endregion
& & & & & & DataSet ds = new DataSet();
& & & & & & int numberOfSheets = hssfworkbook.NumberOfS//sheets数量
& & & & & & for (int n = 0; n & numberOfS n++)
& & & & & & {
& & & & & & & & ISheet sheet = hssfworkbook.GetSheetAt(n);
& & & & & & & & System.Collections.IEnumerator rows = sheet.GetRowEnumerator();
& & & & & & & & DataTable dt = new DataTable();
& & & & & & & & for (int j = 0; j & (sheet.GetRow(0).LastCellNum); j++)
& & & & & & & & {
& & & & & & & & & & dt.Columns.Add(Convert.ToChar(((int)'A') + j).ToString());
& & & & & & & & }
& & & & & & & & while (rows.MoveNext())
& & & & & & & & {
& & & & & & & & & & HSSFRow row = (HSSFRow)rows.C
& & & & & & & & & & DataRow dr = dt.NewRow();
& & & & & & & & & & for (int i = 0; i & row.LastCellN i++)
& & & & & & & & & & {
& & & & & & & & & & & & ICell cell = row.GetCell(i);
& & & & & & & & & & & & if (cell == null)
& & & & & & & & & & & & {
& & & & & & & & & & & & & & dr[i] =
& & & & & & & & & & & & }
& & & & & & & & & & & & else
& & & & & & & & & & & & {
& & & & & & & & & & & & &
& & & & & & & & & & & & & & if (cell.CellType == CellType.Formula )//如果单元格是公式
& & & & & & & & & & & & & & {
& & & & & & & & & & & & & & & & dr[i] = cell.NumericCellValue.ToString();
& & & & & & & & & & & & & & }
& & & & & & & & & & & & & & else
& & & & & & & & & & & & & & & & dr[i] = cell.ToString();
& & & & & & & & & & & & }
& & & & & & & & & & }
& & & & & & & & & & dt.Rows.Add(dr);
& & & & & & & & }
& & & & & & & & ds.Tables.Add(dt);
& & & & & & }
& & & & & &
& & & & #endregion
& & & & #region 导出excel
& & & & //Datatable导出Excel
& & & & public static void GridToExcel(DataTable dt, string strExcelFileName)
& & & & & & HSSFWorkbook workbook = new HSSFWorkbook();
& & & & & & try
& & & & & & {
& & & & & & & & ISheet sheet = workbook.CreateSheet(&Sheet1&);
& & & & & & & & ICellStyle HeadercellStyle = workbook.CreateCellStyle();
& & & & & & & & HeadercellStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.T
& & & & & & & & HeadercellStyle.BorderLeft = NPOI.SS.UserModel.BorderStyle.T
& & & & & & & & HeadercellStyle.BorderRight = NPOI.SS.UserModel.BorderStyle.T
& & & & & & & & HeadercellStyle.BorderTop = NPOI.SS.UserModel.BorderStyle.T
& & & & & & & & HeadercellStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.C
& & & & & & & & //字体
& & & & & & & & NPOI.SS.UserModel.IFont headerfont = workbook.CreateFont();
& & & & & & & & headerfont.Boldweight = (short)FontBoldWeight.B
& & & & & & & & HeadercellStyle.SetFont(headerfont);
& & & & & & & & //用column name 作为列名
& & & & & & & & int icolIndex = 0;
& & & & & & & & IRow headerRow = sheet.CreateRow(0);
& & & & & & & & foreach (DataColumn item in dt.Columns)
& & & & & & & & {
& & & & & & & & & & ICell cell = headerRow.CreateCell(icolIndex);
& & & & & & & & & & cell.SetCellValue(item.ColumnName);
& & & & & & & & & & cell.CellStyle = HeadercellS
& & & & & & & & & & icolIndex++;
& & & & & & & & }
& & & & & & & & ICellStyle cellStyle = workbook.CreateCellStyle();
& & & & & & & & //为避免日期格式被Excel自动替换,所以设定 format 为 『@』 表示一率当成text來看
& & & & & & & & cellStyle.DataFormat = HSSFDataFormat.GetBuiltinFormat(&@&);
& & & & & & & & cellStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.T
& & & & & & & & cellStyle.BorderLeft = NPOI.SS.UserModel.BorderStyle.T
& & & & & & & & cellStyle.BorderRight = NPOI.SS.UserModel.BorderStyle.T
& & & & & & & & cellStyle.BorderTop = NPOI.SS.UserModel.BorderStyle.T
& & & & & & & & NPOI.SS.UserModel.IFont cellfont = workbook.CreateFont();
& & & & & & & & cellfont.Boldweight = (short)FontBoldWeight.N
& & & & & & & & cellStyle.SetFont(cellfont);
& & & & & & & & //建立内容行
& & & & & & & & int iRowIndex = 1;
& & & & & & & & int iCellIndex = 0;
& & & & & & & & foreach (DataRow Rowitem in dt.Rows)
& & & & & & & & {
& & & & & & & & & & IRow DataRow = sheet.CreateRow(iRowIndex);
& & & & & & & & & & foreach (DataColumn Colitem in dt.Columns)
& & & & & & & & & & {
& & & & & & & & & & & & ICell cell = DataRow.CreateCell(iCellIndex);
& & & & & & & & & & & & cell.SetCellValue(Rowitem[Colitem].ToString());
& & & & & & & & & & & & cell.CellStyle = cellS
& & & & & & & & & & & & iCellIndex++;
& & & & & & & & & & }
& & & & & & & & & & iCellIndex = 0;
& & & & & & & & & & iRowIndex++;
& & & & & & & & }
& & & & & & & & //自适应列宽度
& & & & & & & & for (int i = 0; i & icolI i++)
& & & & & & & & {
& & & & & & & & & & sheet.AutoSizeColumn(i);
& & & & & & & & }
& & & & & & & & //写Excel
& & & & & & & & FileStream file = new FileStream(strExcelFileName, FileMode.OpenOrCreate);
& & & & & & & & workbook.Write(file);
& & & & & & & & file.Flush();
& & & & & & & & file.Close();
& & & & & & & & MessageBox.Show(&导出成功&);
& & & & & & }
& & & & & & catch (Exception ex)
& & & & & & {
& & & & & & & & MessageBox.Show(ex.Message);
& & & & & & }
& & & & & & finally { workbook = }
& & & & #endregion
一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!
二、互相尊重,对自己的言论和行为负责。
本文标题:
本页链接:每一个xls都对应一个唯一的HSSFWorkbook,每一个HSSFWorkbook会有若干个HSSFSheet,而每一个HSSFSheet包含若干HSSFRow(Excel 2003中不得超过65535行),每一个HSSFRow又包含若干个HSSFCell(Excel 2003中不得超过256列)。
为了遍历所有的单元格,我们就得获得某一个HSSFSheet的所有HSSFRow,通常可以用HSSFSheet.GetRowEnumerator()。如果要获得某一特定行,可以直接用HSSFSheet.GetRow(rowIndex)。另外要遍历我们就必须知道边界,有一些属性我们是可以用的,比如
HSSFSheet.FirstRowNum(工作表中第一个有数据行的行号)、HSSFSheet.LastRowNum(工作表中最后一个有数据行的行号)、HSSFRow.FirstCellNum(一行中第一个有数据列的列号)、HSSFRow.LastCellNum(一行中最后一个有数据列的列号)。
首先我们要准备一个用于打开文件流的函数InitializeWorkbook,由于文件读完后就没用了,所以这里直接用using。
using (var file = new FileStream(path, FileMode.Open, FileAccess.Read))
var hssfworkbook = new HSSFWorkbook(file);
var sheet = hssfworkbook.GetSheetAt(0);
var rows = sheet.GetRowEnumerator();
var dt = new DataTable();
for (var j = 0; j & 5; j++)
dt.Columns.Add(Convert.ToChar(((int) 'A') + j).ToString());
while (rows.MoveNext())
var row = (HSSFRow) rows.C
var dr = dt.NewRow();
for (var i = 0; i & row.LastCellN i++)
var cell = row.GetCell(i);
if (cell == null)
dr[i] = null;
dr[i] = cell.ToString();
dt.Rows.Add(dr);
上面的结构大家都应该能看懂吧,无非就是先遍历行,再遍历行中的每一列。这里引出了一个难点,由于Excel的单元格有好几种类型,类型不同显示的东西就不同,具体的类型有 布尔型、数值型、文本型、公式型、空白、错误。
public enum HSSFCellType
Unknown = -1,
NUMERIC = 0,
STRING = 1,
FORMULA = 2,
BLANK = 3,
BOOLEAN = 4,
这里的HSSFCellType描述了所有的类型,但细心的朋友可能已经发现了,这里没有日期型,这是为什么呢?这是因为Excel底层并没有一定日期型,而是通过数值型来替代,至于如何区分日期和数字,都是由文本显示的样式决定的,在NPOI中则是由
HSSFDataFormat来处理。为了能够方便的获得所需要的类型所对应的文本,我们可以使用HSSFCell.ToString()来处理。
于是刚才的代码则变成了这样:
switch(cell.CellType)
case HSSFCellType.BLANK:
dr[i] = "[null]";
case HSSFCellType.BOOLEAN:
dr[i] = cell.BooleanCellV
case HSSFCellType.NUMERIC:
dr[i] = cell.ToString();
case HSSFCellType.STRING:
dr[i] = cell.StringCellV
case HSSFCellType.ERROR:
dr[i] = cell.ErrorCellV
case HSSFCellType.FORMULA:
dr[i] = "=" + cell.CellF
阅读(...) 评论()NPOI读取单元格日期问题
&&& 最近在使用ASP.Net
MVC3来开发一个网站,需要实现数据的Excel导入导出功能。在处理导入时,遇到了一个问题:将所有的单元格都按字符串单元格来处理,运行时对日期类型的就会出错。上网搜了一下解决办法,最终解决了,将我的代码贴上:
&&&&&&&&&&&&&&&
row = (HSSFRow)rows.C
&&&&&&&&&&&&&&&
DataRow dataRow = dt.NewRow();
&&&&&&&&&&&&&&&
for (int i = 0; i & row.LastCellN i++)
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&
ICell cell = row.GetCell(i);
&&&&&&&&&&&&&&&&&&&
if (cell.CellType == CellType.NUMERIC)
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&
//NPOI中数字和日期都是NUMERIC类型的,这里对其进行判断是否是日期类型
&&&&&&&&&&&&&&&&&&&&&&&
if (HSSFDateUtil.IsCellDateFormatted(cell))//日期类型
&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&
dataRow[i] = cell.DateCellV
&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&
else//其他数字类型
&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&
dataRow[i] = cell.NumericCellV
&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&
else if (cell.CellType == CellType.BLANK)//空数据类型
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&
dataRow[i] = "";
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&
else if (cell.CellType == CellType.FORMULA)//公式类型
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&
HSSFFormulaEvaluator eva = new
HSSFFormulaEvaluator(workbook);
&&&&&&&&&&&&&&&&&&&&&&&
dataRow[i] = eva.Evaluate(cell).StringV
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&
else //其他类型都按字符串类型来处理
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&
dataRow[i] = cell.StringCellV
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
dt.Rows.Add(dataRow);
----------------------------------------淡淡的分隔符-----------------------------------------------
关键的处理就是红色部分对单元格的判断了。
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。所有回答(1)
这种类型是字符串类型,取值时直接ICell.StringValue的属性,转换成数值类型。
&&&您需要以后才能回答,未注册用户请先。

我要回帖

更多关于 npoi2.0 的文章

 

随机推荐