之前转过一篇类似的文章,那个是用C#自带的excel类操作Excel的,还有一种在c#上操作excel的方法便是npoi了,npoi是poi的C#版本。
npoi操作excel有两种形式,一种是hssf和xssf。hssf是用来生成excel2003之前的版本,生成的excel后缀是“.xls”,而xssf是excel2007的版本,操作的excel的后缀是“.xlsx”。
npoi中常用的类型:
XSSF/HSSFWorkbook:excel文件的工作簿,
Isheet:excel文件的工作簿中的工作表,
IRow:excel文件的工作簿中的工作表中的行,
ICell:excel文件的工作簿中的工作表中的行中的单元格。
举一个简单的导出excel的方法
public static IWorkbook TableToExcel(DataTable dt, string fileExt = ".xlsx")
{
IWorkbook workbook;
if (fileExt == ".xlsx")
{
workbook = new XSSFWorkbook();
}
else if (fileExt == ".xls")
{
workbook = new HSSFWorkbook();
}
else
{
workbook = null;
}
if (workbook == null)
{
return null;
}
ISheet sheet = string.IsNullOrEmpty(dt.TableName) ? workbook.CreateSheet("Sheet1") : workbook.CreateSheet(dt.TableName); //表头
IRow row = sheet.CreateRow();
for (int i = ; i < dt.Columns.Count; i++)
{
ICell cell = row.CreateCell(i);
cell.SetCellValue(dt.Columns[i].ColumnName); } //数据
for (int i = ; i < dt.Rows.Count; i++)
{
IRow row1 = sheet.CreateRow(i + );
for (int j = ; j < dt.Columns.Count; j++)
{
ICell cell = row1.CreateCell(j);
cell.SetCellValue(dt.Rows[i][j].ToString()); }
}
//设置宽度
for (int i = ; i < dt.Columns.Count; i++)
{
int length = Encoding.Default.GetBytes(row.GetCell(i).ToString()).Length;
sheet.SetColumnWidth(i, (length + ) * );
}
return workbook; } //生成excel:
using (MemoryStream ms = new MemoryStream())
{
workbook.Write(ms);
var buffer = ms.GetBuffer();
ms.Close();
return File(buffer, "application/vnd.ms-excel", "个人提成补录模板.xls");
}
如果要更改单元格颜色的样式,可以用下面的方法:
ICellStyle style = workbook.CreateCellStyle();
style.FillPattern = FillPattern.SolidForeground;//很重要
style.FillBackgroundColor = NPOI.HSSF.Util.HSSFColor.Red.Index;
style.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.Red.Index; IRow excelRow = workbook.GetSheetAt().GetRow();
for (int i = ; i <= ; i++)
{
excelRow.GetCell(i).CellStyle = style;
}
excelRow.GetCell().CellStyle = style;
excelRow.GetCell().CellStyle = style;
excelRow.GetCell().CellStyle = style;
改颜色纠结了好久,也查了好多资料,网上有好多用cell.setcellstyle()这个方法的,我试了一下,根本没有,而且好多都是那样写的,不知道是java的还是啥的,应该不是.net的。