1.导出
//工作簿HSSFWorkbook
HSSFWorkbook hssfworkbook = new HSSFWorkbook();
//ISheet页
ISheet sheet1 = hssfworkbook.CreateSheet("员工资料");
//创建行
IRow rowHeader = sheet1.CreateRow(0);
//设置第一行中的每一个单元格
rowHeader.CreateCell(0, CellType.STRING).SetCellValue("工号");
//保存
using (Stream stream = File.OpenWrite(filename))
{
hssfworkbook.Write(stream);
}
2.设置样式
ICellStyle cellStyle = hssfworkbook.CreateCellStyle();
IDataFormat dataFormat = hssfworkbook.CreateDataFormat();
cellStyle.DataFormat = dataFormat.GetFormat("yyyy\"年\"m\"月\"d\"日\"");
//入职日期
ICell InDateCell = rowContent.CreateCell(3, CellType.NUMERIC);
InDateCell.CellStyle = cellStyle;
InDateCell.SetCellValue(item.InDate);
//设置Excel表格
3.设置宽度
在使用NPOI技术开发自动操作EXCEL软件时遇到不能精确设置列宽的问题。
如
ISheet sheet1 = hssfworkbook.CreateSheet("Sheet1");
sheet1.SetColumnWidth(0, 50 * 256); // 在EXCEL文档中实际列宽为49.29
sheet1.SetColumnWidth(1, 100 * 256); // 在EXCEL文档中实际列宽为99.29
sheet1.SetColumnWidth(2, 150 * 256); // 在EXCEL文档中实际列宽为149.29
到此一般人应该知道问题出在哪了,解决方法如下:
ISheet sheet1 = hssfworkbook.CreateSheet("Sheet1");
sheet1.SetColumnWidth(0, (int)((50 + 0.72) * 256)); // 在EXCEL文档中实际列宽为50
sheet1.SetColumnWidth(1, (int)((100 + 0.72) * 256)); // 在EXCEL文档中实际列宽为100
sheet1.SetColumnWidth(2, (int)((150 + 0.72) * 256)); // 在EXCEL文档中实际列宽为150
既在要设置的实际列宽中加上列宽基数:0.72
NPOI读写Excel
1、整个Excel表格叫做工作表:WorkBook(工作薄),包含的叫页(工作表):Sheet;行:Row;单元格Cell。
2、NPOI是POI的C#版本,NPOI的行和列的index都是从0开始
3、POI读取Excel有两种格式一个是HSSF,另一个是XSSF。 HSSF和XSSF的区别如下:
HSSF is the POI Project's pure Java implementation of the Excel '97(-) file format.
XSSF is the POI Project's pure Java implementation of the Excel OOXML (.xlsx) file format.
即:HSSF适用以前的版本,XSSF适用版本及其以上的。
下面是用NPOI读写Excel的例子:ExcelHelper封装的功能主要是把DataTable中数据写入到Excel中,或者是从Excel读取数据到一个DataTable中。
ExcelHelper类:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using NPOI.SS.UserModel;using NPOI.XSSF.UserModel;using NPOI.HSSF.UserModel;using System.IO;using System.Data;namespace GMapDemo{class ExcelHelper : IDisposable{private string fileName = null; //文件名private IWorkbook workbook = null;private FileStream fs = null;private bool disposed;public ExcelHelper(string fileName){this.fileName = fileName;disposed = false;}/// <summary>/// 将DataTable数据导入到excel中/// </summary>/// <param name="data">要导入的数据</param>/// <param name="isColumnWritten">DataTable的列名是否要导入</param>/// <param name="sheetName">要导入的excel的sheet的名称</param>/// <returns>导入数据行数(包含列名那一行)</returns>public int DataTableToExcel(DataTable data, string sheetName, bool isColumnWritten){int i = 0;int j = 0;int count = 0;ISheet sheet = null;fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite);if (fileName.IndexOf(".xlsx") > 0) // 版本workbook = new XSSFWorkbook();else if (fileName.IndexOf(".xls") > 0) // 版本workbook = new HSSFWorkbook();try{if (workbook != null){sheet = workbook.CreateSheet(sheetName);}else{return -1;}if (isColumnWritten == true) //写入DataTable的列名{IRow row = sheet.CreateRow(0);for (j = 0; j < data.Columns.Count; ++j){row.CreateCell(j).SetCellValue(data.Columns[j].ColumnName);}count = 1;}else{count = 0;}for (i = 0; i < data.Rows.Count; ++i){IRow row = sheet.CreateRow(count);for (j = 0; j < data.Columns.Count; ++j){row.CreateCell(j).SetCellValue(data.Rows[i][j].ToString());}++count;}workbook.Write(fs); //写入到excelreturn count;}catch (Exception ex){Console.WriteLine("Exception: " + ex.Message);return -1;}}/// <summary>/// 将excel中的数据导入到DataTable中/// </summary>/// <param name="sheetName">excel工作薄sheet的名称</param>/// <param name="isFirstRowColumn">第一行是否是DataTable的列名</param>/// <returns>返回的DataTable</returns>public DataTable ExcelToDataTable(string sheetName, bool isFirstRowColumn){ISheet sheet = null;DataTable data = new DataTable();int startRow = 0;try{fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);if (fileName.IndexOf(".xlsx") > 0) // 版本workbook = new XSSFWorkbook(fs);else if (fileName.IndexOf(".xls") > 0) // 版本workbook = new HSSFWorkbook(fs);if (sheetName != null){sheet = workbook.GetSheet(sheetName);}else{sheet = workbook.GetSheetAt(0);}if (sheet != null){IRow firstRow = sheet.GetRow(0);int cellCount = firstRow.LastCellNum; //一行最后一个cell的编号 即总的列数if (isFirstRowColumn){for (int i = firstRow.FirstCellNum; i < cellCount; ++i){DataColumn column = new DataColumn(firstRow.GetCell(i).StringCellValue);data.Columns.Add(column);}startRow = sheet.FirstRowNum + 1;}else{startRow = sheet.FirstRowNum;}//最后一列的标号int rowCount = sheet.LastRowNum;for (int i = startRow; i <= rowCount; ++i){IRow row = sheet.GetRow(i);if (row == null) continue; //没有数据的行默认是nullDataRow dataRow = data.NewRow();for (int j = row.FirstCellNum; j < cellCount; ++j){if (row.GetCell(j) != null) //同理,没有数据的单元格都默认是nulldataRow[j] = row.GetCell(j).ToString();}data.Rows.Add(dataRow);}}return data;}catch (Exception ex){Console.WriteLine("Exception: " + ex.Message);return null;}}public void Dispose(){Dispose(true);GC.SuppressFinalize(this);}protected virtual void Dispose(bool disposing){if (!this.disposed){if (disposing){if (fs != null)fs.Close();}fs = null;disposed = true;}}}}