分享使用NPOI导出Excel树状结构的数据,如部门用户菜单权限
大家都知道使用NPOI导出Excel格式数据 很简单,网上一搜,到处都有示例代码。
因为工作的关系,经常会有处理各种数据库数据的场景,其中处理Excel 数据导出,以备客户人员确认数据,场景很常见。
一个系统开发出来,系统要运行起来,很多数据要初始化,这个时候也是需要客户提供各种业务的基础数据。客户提供的数据中,其中除了word、pdf,最常见的就是Excel。
废话不多说,直接上图上代码:
如图,
左侧三列,作为 一个系统 所有菜单的树状结构。
其他列 以用户的信息(如用户名、登录名) 作为表头,需要注意的是,在整理数据进行导出时,需保证列名不能重复。
public static void DataTree(string path, DataTable table, int treeIndex = )
{
using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
IWorkbook workBook = new HSSFWorkbook();
//现在使用的仍然是生成Excel2003的Excel文件,由于03对行数(65535)和列数(255)有限制,所以当数据超出范围后难免出错
//ArgumentException: Invalid column index (256). Allowable column range for BIFF8 is (0..255) or ('A'..'IV') ...
if (Path.GetExtension(path).Equals(".xlsx", System.StringComparison.OrdinalIgnoreCase))
{
workBook = new XSSFWorkbook();
} string sheetName = string.IsNullOrWhiteSpace(table.TableName) ? "Sheet1" : table.TableName;
ISheet sheet = workBook.CreateSheet(sheetName);
IRow row = null;
int colNum = table.Columns.Count;
if (treeIndex < table.Columns.Count || treeIndex > )
{
colNum = treeIndex;
} ICellStyle cellCenterStyle = GetCenter(workBook); int beginNum = ;//排除列头,从1开始 //处理表格列头
row = sheet.CreateRow(beginNum - );
for (int i = ; i < table.Columns.Count; i++)
{
string strVal = table.Columns[i].ColumnName;
ICell cell = row.CreateCell(i);
cell.SetCellValue(strVal);
cell.CellStyle = cellCenterStyle;
row.Height = ;
sheet.AutoSizeColumn(i);
} //处理数据内容
for (int i = ; i < table.Rows.Count; i++)
{
row = sheet.CreateRow(beginNum + i);
row.Height = ;
for (int j = ; j < table.Columns.Count; j++)
{
string strVal = table.Rows[i][j].ToString();
ICell currCell = row.CreateCell(j);
currCell.SetCellValue(strVal);
currCell.CellStyle = cellCenterStyle;
sheet.SetColumnWidth(j, * );
}
} for (int i = ; i < colNum; i++)
{
List<int> lstColWidth = new List<int>();
string currVal = string.Empty;
string nextVal = string.Empty;
for (int j = beginNum; j <= sheet.LastRowNum; j++)
{
currVal = sheet.GetRow(j).Cells[i].StringCellValue; int mk = j;
if (!string.IsNullOrWhiteSpace(currVal))//排除 空值,空值不做合并处理
{
for (int k = j + ; k <= sheet.LastRowNum; k++)
{
nextVal = sheet.GetRow(k).Cells[i].StringCellValue; if (currVal != nextVal)
{
//因为k 累加所以导致当前值与下个值 不相同,所以记录 当前行数要 减去1
mk = k - ;
break;
}
else if (k == sheet.LastRowNum) //边界值,处理最后一行,则提前Break 并记录当前 k
{
mk = k;
break;
}
}
} if (mk != j)//排除 空值外,下个值的行数不等于当前行数,则需要合并
{
sheet.AddMergedRegion(new CellRangeAddress(j, mk, i, i));
} //if (i == 0) //如果是第一列,则 垂直水平居中
{
sheet.GetRow(j).Cells[i].CellStyle = cellCenterStyle;
}
//跳到执行下一个不同数据的行
j = mk; //记录列长度
lstColWidth.Add(DataLength(currVal));
} //设置列宽
int maxWidth = lstColWidth.Max() * ;
sheet.SetColumnWidth(i, maxWidth);
}
//固定列、行 滚动时不变
sheet.CreateFreezePane(, , , ); //写入数据流
workBook.Write(fs);
}
} private static ICellStyle GetCenter(IWorkbook workBook, short fontSize = )
{
ICellStyle cellStyle = workBook.CreateCellStyle();
IFont font = workBook.CreateFont();
font.FontName = "微软雅黑";
font.FontHeightInPoints = fontSize;
cellStyle.SetFont(font);
cellStyle.VerticalAlignment = VerticalAlignment.Center;
cellStyle.Alignment = HorizontalAlignment.Center;
return cellStyle;
} /// <summary>
/// 获取字符串长度(中文按2个字节长度)
/// </summary>
/// <param name="stringWithEnglishAndChinese"></param>
/// <returns></returns>
private static int DataLength(string stringWithEnglishAndChinese)
{
int lng = ;
for (int i = ; i < stringWithEnglishAndChinese.Length; i++)
{
byte[] b = System.Text.Encoding.Default.GetBytes(stringWithEnglishAndChinese.Substring(i, ));
if (b.Length > )
lng += ;
else
lng += ;
}
return lng;
}
分享使用NPOI导出Excel树状结构的数据,如部门用户菜单权限的更多相关文章
- NPOI导出Excel (C#) 踩坑 之--The maximum column width for an individual cell is 255 charaters
/******************************************************************* * 版权所有: * 类 名 称:ExcelHelper * 作 ...
- Asp.Net 使用Npoi导出Excel
引言 使用Npoi导出Excel 服务器可以不装任何office组件,昨天在做一个导出时用到Npoi导出Excel,而且所导Excel也符合规范,打开时不会有任何文件损坏之类的提示.但是在做导入时还是 ...
- NPOI导出EXCEL 打印设置分页及打印标题
在用NPOI导出EXCEL的时候设置分页,在网上有查到用sheet1.SetRowBreak(i)方法,但一直都没有起到作用.经过研究是要设置 sheet1.FitToPage = false; 而 ...
- .NET NPOI导出Excel详解
NPOI,顾名思义,就是POI的.NET版本.那POI又是什么呢?POI是一套用Java写成的库,能够帮助开发者在没有安装微软Office的情况下读写Office的文件. 支持的文件格式包括xls, ...
- 树状结构Java模型、层级关系Java模型、上下级关系Java模型与html页面展示
树状结构Java模型.层级关系Java模型.上下级关系Java模型与html页面展示 一.业务原型:公司的组织结构.传销关系网 二.数据库模型 很简单,创建 id 与 pid 关系即可.(pid:pa ...
- NPOI导出Excel(含有超过65335的处理情况)
NPOI导出Excel的网上有很多,正好自己遇到就学习并总结了一下: 首先说明几点: 1.Excel2003及一下:后缀xls,单个sheet最大行数为65335 Excel2007 单个sheet ...
- [转]NPOI导出EXCEL 打印设置分页及打印标题
本文转自:http://www.cnblogs.com/Gyoung/p/4483475.html 在用NPOI导出EXCEL的时候设置分页,在网上有查到用sheet1.SetRowBreak(i)方 ...
- 由简入繁实现Jquery树状结构
在项目中,我们经常会需要一些树状结构的样式来显示层级结构等,比如下图的样式,之前在学.net的时候可以直接拖个服务端控件过来直接使用非常方便.但是利用Jquery的一些插件,也是可以实现这些效果的,比 ...
- php实现树状结构无级分类
php实现树状结构无级分类 ).",'树2-1-1-2')";mysql_query($sql);?>
随机推荐
- LICEcap – 灵活好用,GIF 屏幕录制工具
LICEcap – 灵活好用,GIF 屏幕录制工具 http://www.appinn.com/licecap/
- 忘记hmailiserver邮件服务器后台登陆密码解决
进入后台进行hmailiserver的相关设置,发现登陆密码忘记了,如下图:
- Linux 中的grep命令单引号,不加任何参数以及双引号的作用
单引号: 可以说是所见即所得:即将单引号内的内容原样输出,或者描述为单引号里面看到的是什么就会输出什么.单引号''是全引用,被单引号括起的内容不管是常量还是变量者不会发生替换. 双引号: 把双引号内的 ...
- spring-boot 加载本地静态资源文件路径配置
1.spring boot默认加载文件的路径是 /META-INF/resources/ /resources/ /static/ /public/ 这些目录下面, 当然我们也可以从spring bo ...
- Jmeter调试工具---HTTP Mirror Server
之前我介绍过Jmeter的一种调试工具Debug Sampler,它可以输出Jmeter的变量.属性甚至是系统属性而不用发送真实的请求到服务器.既然这样,那么HTTP Mirror Server又是做 ...
- 闲聊Redshift与日本CG行业的近况
最近不少朋友跟我说Redshift如何如何,恰巧我目前工作的工作室花费了巨资购买了Redshift和Quadro M4000,妄图在艺术家工作站上做一个新的动画项目,把渲染时间控制在15分钟以下.结果 ...
- 读取XML的问题
利用SAX读取写了代码,调试了一下午却一直在parse里抛异常.尼玛,Java的库函数还真心不怎么好用. 把代码贴上来先: package com.example.gulanfinddemo; imp ...
- Web 开发常备工具
工欲善其事,必先利其器.如今 Web 开发标准越来越高,Web 开发者也在不断寻找途径提升自己的技能.为使大家的开发工作更顺利进行,本文整理了 10+ 款比较优秀的 Web 开发工具,希望对你有帮助. ...
- Zone.js 简介 & 抛砖引玉
Zone.js是angular团队参照NodeJS的Domain,Dart的Zone,为angular 2开发的核心组件. 一开始,我对Zone.js是拒绝的.我们知道类似的 Domain 模块,主要 ...
- js获取gridview模板列中textbox行列的值
下面一个例子:在gridview中第一列输入数值,第二列输入数值,点击第三列的时候进行计算 求和,如果不符合标记为红色字体. 如图: 代码 : <html xmlns="http:// ...