.NET NPOI导出Excel详解

时间:2023-02-24 09:40:50

NPOI,顾名思义,就是POI的.NET版本。那POI又是什么呢?POI是一套用Java写成的库,能够帮助开发者在没有安装微软Office的情况下读写Office的文件。

支持的文件格式包括xls, doc, ppt等。

官方网站:http://npoi.codeplex.com/

nuget直接获取使用

.NET NPOI导出Excel详解

一、NPOI生成Excel

            //创建工作薄
var workbook = new HSSFWorkbook();
//创建表
var table = workbook.CreateSheet("joye.net"); //模拟20行20列数据
for (var i = ; i < ; i++)
{
var row = table.CreateRow(i);
for (int j = ; j < ; j++)
{
var cell = row.CreateCell(j);
cell.SetCellValue(j);
}
}
//打开xls文件,如没有则创建,如存在则在创建是不要打开该文件
using (var fs = File.OpenWrite(@"c:/joye.net.xls"))
{
workbook.Write(fs); //向打开的这个xls文件中写入mySheet表并保存。
Console.WriteLine("生成成功");
}

二、NPOI读取Excel

using (var fs = File.OpenRead(@"c:/joye.net.xls"))
{
//把xls文件中的数据写入workbook1中
var workbook1 = new HSSFWorkbook(fs);
for (var i = ; i < workbook1.NumberOfSheets; i++)
{
var sheet = workbook1.GetSheetAt(i);
for (var j = ; j <= sheet.LastRowNum; j++)
{
//读取当前行数据
var row = sheet.GetRow(j);
if (row != null)
{
for (var k = ; k <= row.LastCellNum; k++)
{ //当前表格
var cell = row.GetCell(k);
if (cell != null)
{
Console.Write(cell.ToString() + " ");
}
}
}
Console.WriteLine();
}
}
}

读出的结果

.NET NPOI导出Excel详解

三、简单学习

/// <summary>
/// 组装workbook.
/// </summary>
/// <param name="dt">dataTable资源</param>
/// <param name="columnHeader">表头</param>
/// <returns></returns>
public static HSSFWorkbook BuildWorkbook1(DataTable dt, string columnHeader = "")
{
var workbook = new HSSFWorkbook();
ISheet sheet = workbook.CreateSheet(string.IsNullOrWhiteSpace(dt.TableName) ? "Sheet1" : dt.TableName); #region 文件属性信息
{
var dsi = PropertySetFactory.CreateDocumentSummaryInformation();
dsi.Company = "NPOI";
workbook.DocumentSummaryInformation = dsi; SummaryInformation si = PropertySetFactory.CreateSummaryInformation();
si.Author = "文件作者信息";
si.ApplicationName = "创建程序信息";
si.LastAuthor = "最后保存者信息";
si.Comments = "作者信息";
si.Title = "标题信息";
si.Subject = "主题信息";
si.CreateDateTime = DateTime.Now;
workbook.SummaryInformation = si;
}
#endregion var dateStyle = workbook.CreateCellStyle();
var format = workbook.CreateDataFormat();
dateStyle.DataFormat = format.GetFormat("yyyy-mm-dd"); //取得列宽
var arrColWidth = new int[dt.Columns.Count];
foreach (DataColumn item in dt.Columns)
{
arrColWidth[item.Ordinal] = Encoding.GetEncoding().GetBytes(item.ColumnName.ToString()).Length;
}
for (var i = ; i < dt.Rows.Count; i++)
{
for (var j = ; j < dt.Columns.Count; j++)
{
int intTemp = Encoding.GetEncoding().GetBytes(dt.Rows[i][j].ToString()).Length;
if (intTemp > arrColWidth[j])
{
arrColWidth[j] = intTemp;
}
}
}
int rowIndex = ;
foreach (DataRow row in dt.Rows)
{
#region 表头 列头
if (rowIndex == || rowIndex == )
{
if (rowIndex != )
{
sheet = workbook.CreateSheet();
} #region 表头及样式
{
var headerRow = sheet.CreateRow();
headerRow.HeightInPoints = ;
headerRow.CreateCell().SetCellValue(columnHeader);
//CellStyle
ICellStyle headStyle = workbook.CreateCellStyle();
headStyle.Alignment = HorizontalAlignment.Center;// 左右居中
headStyle.VerticalAlignment = VerticalAlignment.Center;// 上下居中
// 设置单元格的背景颜色(单元格的样式会覆盖列或行的样式)
headStyle.FillForegroundColor = (short);
//定义font
IFont font = workbook.CreateFont();
font.FontHeightInPoints = ;
font.Boldweight = ;
headStyle.SetFont(font);
headerRow.GetCell().CellStyle = headStyle;
sheet.AddMergedRegion(new CellRangeAddress(, , , dt.Columns.Count - ));
}
#endregion #region 列头及样式
{
var headerRow = sheet.CreateRow();
//CellStyle
ICellStyle headStyle = workbook.CreateCellStyle();
headStyle.Alignment = HorizontalAlignment.Center;// 左右居中
headStyle.VerticalAlignment = VerticalAlignment.Center;// 上下居中
//定义font
IFont font = workbook.CreateFont();
font.FontHeightInPoints = ;
font.Boldweight = ;
headStyle.SetFont(font); foreach (DataColumn column in dt.Columns)
{
headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
headerRow.GetCell(column.Ordinal).CellStyle = headStyle;
sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + ) * );
}
}
#endregion
if (columnHeader != "")
{
//header row
IRow row0 = sheet.CreateRow();
for (int i = ; i < dt.Columns.Count; i++)
{
ICell cell = row0.CreateCell(i, CellType.String);
cell.SetCellValue(dt.Columns[i].ColumnName);
}
} rowIndex = ;
}
#endregion #region 内容
var dataRow = sheet.CreateRow(rowIndex);
foreach (DataColumn column in dt.Columns)
{
var newCell = dataRow.CreateCell(column.Ordinal); string drValue = row[column].ToString(); switch (column.DataType.ToString())
{
case "System.String"://字符串类型
newCell.SetCellValue(drValue);
break;
case "System.DateTime"://日期类型
DateTime dateV;
DateTime.TryParse(drValue, out dateV);
newCell.SetCellValue(dateV); newCell.CellStyle = dateStyle;//格式化显示
break;
case "System.Boolean"://布尔型
bool boolV = false;
bool.TryParse(drValue, out boolV);
newCell.SetCellValue(boolV);
break;
case "System.Int16"://整型
case "System.Int32":
case "System.Int64":
case "System.Byte":
int intV = ;
int.TryParse(drValue, out intV);
newCell.SetCellValue(intV);
break;
case "System.Decimal"://浮点型
case "System.Double":
double doubV = ;
double.TryParse(drValue, out doubV);
newCell.SetCellValue(doubV);
break;
case "System.DBNull"://空值处理
newCell.SetCellValue("");
break;
default:
newCell.SetCellValue("");
break;
} }
#endregion rowIndex++;
}
//自动列宽
for (int i = ; i <= dt.Columns.Count; i++)
sheet.AutoSizeColumn(i, true); return workbook;
}

学习代码

            var dt = new DataTable();
//模拟20行20列数据
for (var i = ; i < ; i++)
{
dt.Columns.Add(i.ToString());
}
for (var j = ; j < ; j++)
{
dt.Rows.Add(new object[] { ,, });
}
var newBook = BuildWorkbook(dt);
using (var fs = File.OpenWrite(@"c:/joye.net1.xls"))
{
newBook.Write(fs);
Console.WriteLine("生成成功");
}

代码调用

四、NPOI导出Excel 65536问题

        public static HSSFWorkbook BuildWorkbook(DataTable dt)
{
var book = new HSSFWorkbook(); ISheet sheet = book.CreateSheet("Sheet1");
//Data Rows
for (int i = ; i < dt.Rows.Count; i++)
{
IRow drow = sheet.CreateRow(i);
for (int j = ; j < dt.Columns.Count; j++)
{
ICell cell = drow.CreateCell(j, CellType.String);
cell.SetCellValue(dt.Rows[i][j].ToString());
}
}
//自动列宽
for (int i = ; i <= dt.Columns.Count; i++)
sheet.AutoSizeColumn(i, true);
return book;
}

NPOI导出Excel超过65536会报异常,原来是由于NPOI这个动态库导致的,然后看了下版本,发现是1.2.5。然后百度了下,发现这个版本的NPOI只支持office2003,二office2003最多支持65536行

解决方式:

1、只是在插入数据的时候,加个判断,如果数据条数大于65536时,就在创建一个sheet

        //65536判断处理
public static HSSFWorkbook BuildWorkbook(DataTable dt)
{
var book = new HSSFWorkbook(); ISheet sheet1 = book.CreateSheet("Sheet1");
ISheet sheet2 = book.CreateSheet("Sheet2"); //填充数据
for (int i = ; i < dt.Rows.Count; i++)
{
if (i < )
{
IRow drow = sheet1.CreateRow(i);
for (int j = ; j < dt.Columns.Count; j++)
{
ICell cell = drow.CreateCell(j, CellType.String);
cell.SetCellValue(dt.Rows[i][j].ToString());
}
}
if (i >= )
{
IRow drow = sheet2.CreateRow(i - );
for (int j = ; j < dt.Columns.Count; j++)
{
ICell cell = drow.CreateCell(j, CellType.String);
cell.SetCellValue(dt.Rows[i][j].ToString());
}
} } //自动列宽
for (int i = ; i <= dt.Columns.Count; i++)
{
sheet1.AutoSizeColumn(i, true);
sheet2.AutoSizeColumn(i, true);
}
return book;
}

.NET NPOI导出Excel详解

2、考虑使用高版本Office,使用用对象支持高版本的NPOI

        //高版本
public static XSSFWorkbook BuildWorkbook(DataTable dt)
{
var book = new XSSFWorkbook();
ISheet sheet = book.CreateSheet("Sheet1");
//Data Rows
for (int i = ; i < dt.Rows.Count; i++)
{
IRow drow = sheet.CreateRow(i);
for (int j = ; j < dt.Columns.Count; j++)
{
ICell cell = drow.CreateCell(j, CellType.String);
cell.SetCellValue(dt.Rows[i][j].ToString());
}
}
//自动列宽
for (int i = ; i <= dt.Columns.Count; i++)
sheet.AutoSizeColumn(i, true); return book;
}

.NET NPOI导出Excel详解

五、web开发中导出Excel

        public static void ExportExcel(DataTable dt, string fileName = "")
{
//生成Excel
IWorkbook book = BuildWorkbook(dt); //web 下载
if (fileName == "")
fileName = string.Format("{0:yyyyMMddHHmmssffff}", DateTime.Now);
fileName = fileName.Trim();
string ext = Path.GetExtension(fileName); if (ext.ToLower() == ".xls" || ext.ToLower() == ".xlsx")
fileName = fileName.Replace(ext, string.Empty); HttpResponse httpResponse = HttpContext.Current.Response;
httpResponse.Clear();
httpResponse.Buffer = true;
httpResponse.Charset = Encoding.UTF8.BodyName;
httpResponse.AppendHeader("Content-Disposition", "attachment;filename=" + fileName + ".xls");
httpResponse.ContentEncoding = Encoding.UTF8;
httpResponse.ContentType = "application/vnd.ms-excel; charset=UTF-8";
book.Write(httpResponse.OutputStream);
httpResponse.End();
}
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Reflection;
using System.Text;
using System.Linq; namespace Gto.Report.Contract
{
public static class ExcelHelperForCs
{ /// <summary>
/// 组装workbook.
/// </summary>
/// <param name="dt">dataTable资源</param>
/// <param name="columnHeader">表头</param>
/// <returns></returns>
public static HSSFWorkbook BuildWorkbook1(DataTable dt, string columnHeader = "")
{
var workbook = new HSSFWorkbook();
ISheet sheet = workbook.CreateSheet(string.IsNullOrWhiteSpace(dt.TableName) ? "Sheet1" : dt.TableName); var dateStyle = workbook.CreateCellStyle();
var format = workbook.CreateDataFormat();
dateStyle.DataFormat = format.GetFormat("yyyy-mm-dd"); //取得列宽
var arrColWidth = new int[dt.Columns.Count];
foreach (DataColumn item in dt.Columns)
{
arrColWidth[item.Ordinal] = Encoding.GetEncoding().GetBytes(item.ColumnName.ToString()).Length;
}
for (var i = ; i < dt.Rows.Count; i++)
{
for (var j = ; j < dt.Columns.Count; j++)
{
int intTemp = Encoding.GetEncoding().GetBytes(dt.Rows[i][j].ToString()).Length;
if (intTemp > arrColWidth[j])
{
arrColWidth[j] = intTemp;
}
}
}
int rowIndex = ;
foreach (DataRow row in dt.Rows)
{
#region 表头 列头
if (rowIndex == || rowIndex == )
{
if (rowIndex != )
{
sheet = workbook.CreateSheet();
} #region 表头及样式
{
var headerRow = sheet.CreateRow();
headerRow.HeightInPoints = ;
headerRow.CreateCell().SetCellValue(columnHeader);
//CellStyle
ICellStyle headStyle = workbook.CreateCellStyle();
headStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;// 左右居中
headStyle.VerticalAlignment = VerticalAlignment.Center;// 上下居中
// 设置单元格的背景颜色(单元格的样式会覆盖列或行的样式)
headStyle.FillForegroundColor = (short);
//定义font
IFont font = workbook.CreateFont();
font.FontHeightInPoints = ;
font.Boldweight = ;
headStyle.SetFont(font);
headerRow.GetCell().CellStyle = headStyle;
sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(, , , dt.Columns.Count - ));
}
#endregion #region 列头及样式
{
var headerRow = sheet.CreateRow();
//CellStyle
ICellStyle headStyle = workbook.CreateCellStyle();
headStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;// 左右居中
headStyle.VerticalAlignment = VerticalAlignment.Center;// 上下居中
//定义font
IFont font = workbook.CreateFont();
font.FontHeightInPoints = ;
font.Boldweight = ;
headStyle.SetFont(font); foreach (DataColumn column in dt.Columns)
{
headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
headerRow.GetCell(column.Ordinal).CellStyle = headStyle;
sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + ) * );
}
}
#endregion
if (columnHeader != "")
{
//header row
IRow row0 = sheet.CreateRow();
for (int i = ; i < dt.Columns.Count; i++)
{
ICell cell = row0.CreateCell(i, CellType.String);
cell.SetCellValue(dt.Columns[i].ColumnName);
}
} rowIndex = ;
}
#endregion #region 内容
var dataRow = sheet.CreateRow(rowIndex);
foreach (DataColumn column in dt.Columns)
{
var newCell = dataRow.CreateCell(column.Ordinal); string drValue = row[column].ToString(); switch (column.DataType.ToString())
{
case "System.String"://字符串类型
newCell.SetCellValue(drValue);
break;
case "System.DateTime"://日期类型
DateTime dateV;
DateTime.TryParse(drValue, out dateV);
newCell.SetCellValue(dateV); newCell.CellStyle = dateStyle;//格式化显示
break;
case "System.Boolean"://布尔型
bool boolV = false;
bool.TryParse(drValue, out boolV);
newCell.SetCellValue(boolV);
break;
case "System.Int16"://整型
case "System.Int32":
case "System.Int64":
case "System.Byte":
int intV = ;
int.TryParse(drValue, out intV);
newCell.SetCellValue(intV);
break;
case "System.Decimal"://浮点型
case "System.Double":
double doubV = ;
double.TryParse(drValue, out doubV);
newCell.SetCellValue(doubV);
break;
case "System.DBNull"://空值处理
newCell.SetCellValue("");
break;
default:
newCell.SetCellValue("");
break;
} }
#endregion rowIndex++;
}
//自动列宽
for (int i = ; i <= dt.Columns.Count; i++)
sheet.AutoSizeColumn(i, true); return workbook;
}
public static DataTable ToDataTable<T>(IList<T> items)
{
var tb = new DataTable(typeof(T).Name); PropertyInfo[] props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance); foreach (PropertyInfo prop in props)
{
Type t = GetCoreType(prop.PropertyType);
tb.Columns.Add(prop.Name, t);
} foreach (T item in items)
{
var values = new object[props.Length]; for (int i = ; i < props.Length; i++)
{
values[i] = props[i].GetValue(item, null);
} tb.Rows.Add(values);
} return tb;
}
public static bool IsNullable(Type t)
{
return !t.IsValueType || (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>));
} public static Type GetCoreType(Type t)
{
if (t != null && IsNullable(t))
{
if (!t.IsValueType)
{
return t;
}
else
{
return Nullable.GetUnderlyingType(t);
}
}
else
{
return t;
}
} /// <summary>
/// DataTable导出Excel2007(.xlsx)
/// </summary>
/// <param name="dt">DataTable</param>
/// <param name="file">文件路径(.xlsx)</param>
/// <param name="sheetname">Excel工作表名</param>
public static void TableToExcelForXLSX2007(DataTable dt, string file, string sheetname)
{
XSSFWorkbook xssfworkbook = new XSSFWorkbook();//建立Excel2007对象
ISheet sheet = xssfworkbook.CreateSheet(sheetname);//新建一个名称为sheetname的工作簿 //设置基本样式
ICellStyle style = xssfworkbook.CreateCellStyle();
style.WrapText = true;
IFont font = xssfworkbook.CreateFont();
font.FontHeightInPoints = ;
font.FontName = "Arial";
style.SetFont(font); //设置统计样式
ICellStyle style1 = xssfworkbook.CreateCellStyle();
style1.WrapText = true;
IFont font1 = xssfworkbook.CreateFont();
font1.FontHeightInPoints = ;
font1.Boldweight = (short)NPOI.SS.UserModel.FontBoldWeight.Bold;
font1.FontName = "Arial";
style1.SetFont(font1); //设置大类样式
ICellStyle style2 = xssfworkbook.CreateCellStyle();
style2.WrapText = true;
//style2.FillBackgroundColor = NPOI.HSSF.Util.HSSFColor.Gold.Index;
//style2.FillPattern = FillPattern.SolidForeground;
IFont font2 = xssfworkbook.CreateFont();
font2.FontHeightInPoints = ;
font2.Boldweight = (short)NPOI.SS.UserModel.FontBoldWeight.Bold;
font2.FontName = "Arial";
style2.SetFont(font2); //设置列名
IRow row = sheet.CreateRow();
for (int i = ; i < dt.Columns.Count; i++)
{
ICell cell = row.CreateCell(i);
var rowName = dt.Columns[i].ColumnName;
string rowRealName = "";
switch (rowName)
{
case "IncomeType":
rowRealName = "交易类型";
break;
case "CreateDate":
rowRealName = "发生日期";
break;
case "ChangeAmount":
rowRealName = "合计金额";
break;
case "SubsectionName":
rowRealName = "分段名称";
break;
case "CorporateName":
rowRealName = "公司名称";
break;
case "Province":
rowRealName = "省份";
break;
case "ShuntName":
rowRealName = "项目";
break;
case "CountAmount":
rowRealName = "本年累计金额";
break;
default:
rowRealName = "";
break;
}
cell.SetCellValue(rowRealName);
cell.CellStyle = style;
}
int paymentRowIndex = ;
//单元格赋值
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); if (dt.Rows[i][j].ToString().Contains("小计") || dt.Rows[i][j].ToString().Contains("流量净额"))
{
cell.SetCellValue(dt.Rows[i][j].ToString());
cell.CellStyle = style2;
}
else if (dt.Rows[i][j].ToString().Contains("一") || dt.Rows[i][j].ToString().Contains("二") || dt.Rows[i][j].ToString().Contains("三"))
{
cell.SetCellValue(dt.Rows[i][j].ToString());
cell.CellStyle = style1;
}
else
{
cell.SetCellValue(dt.Rows[i][j].ToString());
cell.CellStyle = style;
} }
paymentRowIndex++;
} //列宽自适应,只对英文和数字有效
for (int i = ; i <= dt.Rows.Count; i++)
{
sheet.AutoSizeColumn(i);
}
//获取当前列的宽度,然后对比本列的长度,取最大值
for (int columnNum = ; columnNum <= dt.Rows.Count; columnNum++)
{
int columnWidth = sheet.GetColumnWidth(columnNum) / ;
for (int rowNum = ; rowNum <= sheet.LastRowNum; rowNum++)
{
IRow currentRow;
//当前行未被使用过
if (sheet.GetRow(rowNum) == null)
{
currentRow = sheet.CreateRow(rowNum);
}
else
{
currentRow = sheet.GetRow(rowNum);
} if (currentRow.GetCell(columnNum) != null)
{
ICell currentCell = currentRow.GetCell(columnNum);
int length = Encoding.Default.GetBytes(currentCell.ToString()).Length;
if (columnWidth < length)
{
columnWidth = length;
}
}
}
sheet.SetColumnWidth(columnNum, columnWidth * );
} using (System.IO.Stream stream = System.IO.File.OpenWrite(file))
{
//写入文件
xssfworkbook.Write(stream);
stream.Close();
}
} /// <summary>
/// DataTable导出Excel2003(.xls)
/// </summary>
/// <param name="dt">DataTable</param>
/// <param name="file">文件路径(.xls)</param>
/// <param name="sheetname">Excel工作表名</param>
public static void TableToExcelForXLSX2003(DataTable dt, string file, string sheetname)
{
HSSFWorkbook xssfworkbook = new HSSFWorkbook();//建立Excel2003对象
HSSFSheet sheet = (HSSFSheet)xssfworkbook.CreateSheet(sheetname);//新建一个名称为sheetname的工作簿 //设置基本样式
ICellStyle style = xssfworkbook.CreateCellStyle();
style.WrapText = true;
IFont font = xssfworkbook.CreateFont();
font.FontHeightInPoints = ;
font.FontName = "Arial";
style.SetFont(font); //设置统计样式
ICellStyle style1 = xssfworkbook.CreateCellStyle();
style1.WrapText = true;
IFont font1 = xssfworkbook.CreateFont();
font1.FontHeightInPoints = ;
font1.Boldweight = (short)NPOI.SS.UserModel.FontBoldWeight.Bold;
font1.FontName = "Arial";
style1.SetFont(font1); //设置大类样式
ICellStyle style2 = xssfworkbook.CreateCellStyle();
style2.WrapText = true;
//style2.FillBackgroundColor = NPOI.HSSF.Util.HSSFColor.Gold.Index;
//style2.FillPattern = FillPattern.SolidForeground;
IFont font2 = xssfworkbook.CreateFont();
font2.FontHeightInPoints = ;
font2.Boldweight = (short)NPOI.SS.UserModel.FontBoldWeight.Bold;
font2.FontName = "Arial";
style2.SetFont(font2); //设置列名
HSSFRow row = (HSSFRow)sheet.CreateRow();
for (int i = ; i < dt.Columns.Count; i++)
{
ICell cell = (ICell)row.CreateCell(i);
var rowName = dt.Columns[i].ColumnName;
//cell.SetCellValue(dt.Columns[i].ColumnName);
string rowRealName = "";
switch (rowName)
{
case "IncomeType":
rowRealName = "交易类型";
break;
case "CreateDate":
rowRealName = "发生日期";
break;
case "ChangeAmount":
rowRealName = "合计金额";
break;
case "SubsectionName":
rowRealName = "分段名称";
break;
case "CorporateName":
rowRealName = "公司名称";
break;
case "Province":
rowRealName = "省份";
break;
case "ShuntName":
rowRealName = "项目";
break;
case "CountAmount":
rowRealName = "本年累计金额";
break;
default:
rowRealName = "";
break;
}
cell.SetCellValue(rowRealName);
cell.CellStyle = style;
}
int paymentRowIndex = ;
//单元格赋值
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); if (dt.Rows[i][j].ToString().Contains("小计") || dt.Rows[i][j].ToString().Contains("流量净额"))
{
cell.SetCellValue(dt.Rows[i][j].ToString());
cell.CellStyle = style2;
}
else if (dt.Rows[i][j].ToString().Contains("一") || dt.Rows[i][j].ToString().Contains("二") || dt.Rows[i][j].ToString().Contains("三"))
{
cell.SetCellValue(dt.Rows[i][j].ToString());
cell.CellStyle = style1;
}
else
{
cell.SetCellValue(dt.Rows[i][j].ToString());
cell.CellStyle = style; } }
paymentRowIndex++;
}
//列宽自适应,只对英文和数字有效
for (int i = ; i <= dt.Rows.Count; i++)
{
sheet.AutoSizeColumn(i);
}
//获取当前列的宽度,然后对比本列的长度,取最大值
for (int columnNum = ; columnNum <= dt.Rows.Count; columnNum++)
{
int columnWidth = sheet.GetColumnWidth(columnNum) / ;
for (int rowNum = ; rowNum <= sheet.LastRowNum; rowNum++)
{
IRow currentRow;
//当前行未被使用过
if (sheet.GetRow(rowNum) == null)
{
currentRow = sheet.CreateRow(rowNum);
}
else
{
currentRow = sheet.GetRow(rowNum);
} if (currentRow.GetCell(columnNum) != null)
{
ICell currentCell = currentRow.GetCell(columnNum);
int length = Encoding.Default.GetBytes(currentCell.ToString()).Length;
if (columnWidth < length)
{
columnWidth = length;
}
}
}
sheet.SetColumnWidth(columnNum, columnWidth * );
}
using (System.IO.Stream stream = System.IO.File.OpenWrite(file))
{
xssfworkbook.Write(stream);
stream.Close();
} }
} }

基于.xls模板生成Excel文件有时间再看

代码下载:https://yunpan.cn/cRBVnTCSchz7k (提取码:779e)

.NET NPOI导出Excel详解的更多相关文章

  1. &period;NET Core使用NPOI导出复杂,美观的Excel详解

    前言: 这段时间一直专注于数据报表的开发,当然涉及到相关报表的开发数据导出肯定是一个不可避免的问题啦.客户要求要导出优雅,美观的Excel文档格式的来展示数据,当时的第一想法就是使用NPOI开源库来做 ...

  2. NPOI导出Excel &lpar;C&num;&rpar; 踩坑 之--The maximum column width for an individual cell is 255 charaters

    /******************************************************************* * 版权所有: * 类 名 称:ExcelHelper * 作 ...

  3. Asp&period;Net 使用Npoi导出Excel

    引言 使用Npoi导出Excel 服务器可以不装任何office组件,昨天在做一个导出时用到Npoi导出Excel,而且所导Excel也符合规范,打开时不会有任何文件损坏之类的提示.但是在做导入时还是 ...

  4. NPOI导出EXCEL 打印设置分页及打印标题

    在用NPOI导出EXCEL的时候设置分页,在网上有查到用sheet1.SetRowBreak(i)方法,但一直都没有起到作用.经过研究是要设置  sheet1.FitToPage = false; 而 ...

  5. NPOI导出Excel(含有超过65335的处理情况)

    NPOI导出Excel的网上有很多,正好自己遇到就学习并总结了一下: 首先说明几点: 1.Excel2003及一下:后缀xls,单个sheet最大行数为65335 Excel2007 单个sheet ...

  6. &lbrack;转&rsqb;NPOI导出EXCEL 打印设置分页及打印标题

    本文转自:http://www.cnblogs.com/Gyoung/p/4483475.html 在用NPOI导出EXCEL的时候设置分页,在网上有查到用sheet1.SetRowBreak(i)方 ...

  7. 分享使用NPOI导出Excel树状结构的数据,如部门用户菜单权限

    大家都知道使用NPOI导出Excel格式数据 很简单,网上一搜,到处都有示例代码. 因为工作的关系,经常会有处理各种数据库数据的场景,其中处理Excel 数据导出,以备客户人员确认数据,场景很常见. ...

  8. 用NPOI导出Excel

    用NPOI导出Excel public void ProcessRequest(HttpContext context) { context.Response.ContentType = " ...

  9. NPOI导出Excel示例

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

随机推荐

  1. Android文件下载之进度检测

    近期因为项目的需要,研究了一下Android文件下载进度显示的功能实现,接下来就和大家一起分享学习一下,希望对广大初学者有帮助. 先上效果图: 上方的蓝色进度条,会根据文件下载量的百分比进行加载,中部 ...

  2. u3d&lowbar;shader&lowbar;surface&lowbar;shader&lowbar;5

    CubeMap 的实现 参考: http://blog.csdn.net/candycat1992/article/details/21827365     制作cubeMap三维纹理,surface ...

  3. java无符号移位&lpar;&gt&semi;&gt&semi;&gt&semi;&rpar;和有符号移位&lpar;&gt&semi;&gt&semi;&rpar;

    java中>>(<<)表示有符号的移位.<<<(>>>)表示无符号移位 如: int num = 22; 二进制是0001 0110, nu ...

  4. Scrum10-22

    Time:2013-10-22 Author:居玉皓 Things we have done since yesterday's meeting: 在今天的Scrum中,STORY1 开发前期准备工作 ...

  5. Java程序员学C&num;基本语法两个小时搞定(对比学习)

    对于学习一门新的语言,关键是学习新语言和以前掌握的语言的区别,但是也不要让以前语言的东西,固定了自己的思维模式,多看一下新的语言的编程思想. 1.引包 using System;java用import ...

  6. 几个app maker的网站

    简网APP工场:http://www.cutt.com/app 爱传iappk:http://www.iappk.com 安米网:http://www.appbyme.com/mobcentACA/i ...

  7. arm-linux移植MT7601Uusb无线网卡(小度wifi,360随身WIFI 2代)

    前段时间移植过RT3070.RT5370 http://blog.csdn.net/ofaith12345/article/details/24138399 发现各种arm移植都大同小异,所以就不要纠 ...

  8. 分析一个socket通信: server&sol;client

    分析一个socket通信: server/client1 server 1. 创建一个server_socket文件,并绑定端口,然后监听端口 (socket, bind, listen) 2. 查询 ...

  9. jq实现碰到边缘反弹的动画

    先上效果图: 录出来有点卡顿的赶脚,实际上还是挺顺畅的. 1.HTML: <div class="box"></div> 2.CSS: body{ back ...

  10. 委托&lpar;2&rpar;&period;net 1&period;x中的委托

    上一篇已经演示了使用委托实现一个多语言问候的程序,这一篇文章来总结一下在.net 1.x中委托的使用方法. 既然委托是一个类型(class),那么它就要经历像类一个先声明,然后new一个对象,最后调用 ...