利用NPOI 导出Excel 文件后,当用Excel 工具打开后,会提示 “此文件中某些文本格式可能已经更改,因为它已经超出最多允许的字体数。关闭其他文档再试一次可能有用” ,当生成的内容很少是不会提示该错误,当生成多个sheet (220个)就会造成后面单元格样式全部丢失。 解决方法如下:
下面的代码是:每一次生成一个sheet 的时候就会重新创建一个CellStyle ,当然了程序里不止创建一个cellStyle, 而且标题栏目,列表头等需要创建cellStyle,我在这只是把问题给说明。下面的代码是有问题,等于说生成一个sheet我要创建一个CellStyle,生成多个Sheet 我要创建多个CellStyle,个人感觉Excel 应该对CellStyle 有个数限制的。
/// <summary>
/// 创建单元格样式
/// </summary>
/// <param name="wb"></param>
/// <returns></returns>
public virtual ICellStyle CreateContentEvenRowCellStyle(IWorkbook wb)
{
///创建单元格样式
ICellStyle cellStyle = wb.CreateCellStyle();
cellStyle.BorderTop = BorderStyle.Thin;
cellStyle.BorderLeft = BorderStyle.Thin;
cellStyle.BorderRight = BorderStyle.Thin;
cellStyle.BorderBottom = BorderStyle.Thin;
//水平对齐
cellStyle.Alignment = HorizontalAlignment.Left;
cellStyle.VerticalAlignment = VerticalAlignment.Center;
设置字体
IFont font = wb.CreateFont();
font.FontHeightInPoints = 12;
font.FontName = "宋体";
cellStyle.SetFont(font);
cellStyle.WrapText = true;
DataEvenRowCellStyle = cellStyle;
return cellStyle;
}
解决方法如下: 定义一个成员变量,来保证一个WorkBook 只生成一个CellStyle,如果格式不一样那可以生成多个CellStyle,但是每个类别的CellStyle尽量唯一。
/// <summary>
/// 数据偶数行表格数据
/// </summary>
private ICellStyle DataEvenRowCellStyle = null;
/// <summary>
/// 创建单元格样式
/// </summary>
/// <param name="wb"></param>
/// <returns></returns>
public virtual ICellStyle CreateContentEvenRowCellStyle(IWorkbook wb)
{
if (DataEvenRowCellStyle == null)
{
///创建单元格样式
ICellStyle cellStyle = wb.CreateCellStyle();
cellStyle.BorderTop = BorderStyle.Thin;
cellStyle.BorderLeft = BorderStyle.Thin;
cellStyle.BorderRight = BorderStyle.Thin;
cellStyle.BorderBottom = BorderStyle.Thin;
//水平对齐
cellStyle.Alignment = HorizontalAlignment.Left;
cellStyle.VerticalAlignment = VerticalAlignment.Center;
设置字体
IFont font = wb.CreateFont();
font.FontHeightInPoints = 12;
font.FontName = "宋体";
cellStyle.SetFont(font);
cellStyle.WrapText = true;
DataEvenRowCellStyle = cellStyle;
return cellStyle;
}
else
{
return DataEvenRowCellStyle;
}
}