C# NPOI导出Excel以及动态设置列宽
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C# NPOI导出Excel以及动态设置列宽,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2953字,纯文字阅读大概需要5分钟。
内容图文
通过NPOI将DataTable导出成Excel时,每列内容长度不一,统一设置宽度当然不太合理了,所以研究了下动态设置列宽。
首先根据表头内容长度计算列宽,并将每列的列宽存于Dictionary<int, int>中,分别为每列序号和每列宽度。
然后在循环每行信息对每列内容赋值时,计算内容对应列宽,如超过表头的宽度则替换Dictionary中的宽度值,注意Excel限制最大宽度为15000,超出则指定为15000。
注:内容自动换行后,行高会被撑开,项目导出格式需要,所以下面代码中固定了行高,可根据需求自行判断是否需要固定行高。
/// <summary>
/// Datable导出成Excel
/// </summary>
/// <param name="dt"></param>
/// <param name="file">导出路径(包括文件名与扩展名)</param>
public static void TableToExcel(DataTable dt, string file)
{
IWorkbook workbook;
string fileExt = Path.GetExtension(file).ToLower();
if (fileExt == ".xlsx")
{
workbook = new XSSFWorkbook();
}
else if (fileExt == ".xls")
{
workbook = new HSSFWorkbook();
}
else
{
return;
}
// 标题及内容单元格样式
var headCellStyle = CreateCellStyle(workbook, true);
var contentCellStyle = CreateCellStyle(workbook, false);
// 每列列宽字典
var dic = new Dictionary<int, int>();
ISheet sheet = string.IsNullOrEmpty(dt.TableName) ? workbook.CreateSheet("Sheet1") : workbook.CreateSheet(dt.TableName);
//表头
IRow row = sheet.CreateRow(0);
for (int i = 0; i < dt.Columns.Count; i++)
{
ICell cell = row.CreateCell(i);
cell.SetCellValue(dt.Columns[i].ColumnName);
cell.CellStyle = headCellStyle;
dic.Add(i, Encoding.Default.GetBytes(cell.StringCellValue).Length * 256 + 200);
}
//数据
for (int i = 0; i < dt.Rows.Count; i++)
{
IRow row1 = sheet.CreateRow(i + 1);
// 行高,避免自动换行的内容将行高撑开
row1.HeightInPoints = 20f;
for (int j = 0; j < dt.Columns.Count; j++)
{
ICell cell = row1.CreateCell(j);
cell.SetCellValue(dt.Rows[i][j].ToString());
cell.CellStyle = contentCellStyle;
int length = Encoding.Default.GetBytes(cell.StringCellValue).Length * 256 + 200;
length = length > 15000 ? 15000 : length;
// 若比已存在列宽更宽则替换,Excel限制最大宽度为15000
if (dic[j] < length)
{
dic[j] = length;
}
}
}
for (int i = 0; i < dt.Columns.Count; i++)
{
sheet.SetColumnWidth(i, dic[i]);
}
//转为字节数组
MemoryStream stream = new MemoryStream();
workbook.Write(stream);
var buf = stream.ToArray();
//保存为Excel文件
using (FileStream fs = new FileStream(file, FileMode.Create, FileAccess.Write))
{
fs.Write(buf, 0, buf.Length);
fs.Flush();
}
}
/// <summary>
/// 单元格样式
/// </summary>
/// <param name="workbook"></param>
/// <param name="isHead"></param>
/// <returns></returns>
private static ICellStyle CreateCellStyle(IWorkbook workbook, bool isHead)
{
var cellStyle = workbook.CreateCellStyle();
var font = workbook.CreateFont();
font.IsBold = isHead; // 粗体
cellStyle.SetFont(font);
if (isHead)
{
cellStyle.Alignment = HorizontalAlignment.Center; // 水平居中
cellStyle.VerticalAlignment = VerticalAlignment.Center; // 垂直居中
}
cellStyle.BorderTop = BorderStyle.Thin;
cellStyle.BorderBottom = BorderStyle.Thin;
cellStyle.BorderLeft = BorderStyle.Thin;
cellStyle.BorderRight = BorderStyle.Thin;
cellStyle.WrapText = true;//内容自动换行,避免存在换行符的内容合并成单行
return cellStyle;
}
原文:https://www.cnblogs.com/LukeSteven/p/14643499.html
内容总结
以上是互联网集市为您收集整理的C# NPOI导出Excel以及动态设置列宽全部内容,希望文章能够帮你解决C# NPOI导出Excel以及动态设置列宽所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。