大家都知道使用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树状结构的数据,如部门用户菜单权限的更多相关文章

  1. NPOI导出Excel (C#) 踩坑 之--The maximum column width for an individual cell is 255 charaters

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

  2. Asp.Net 使用Npoi导出Excel

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

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

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

  4. .NET NPOI导出Excel详解

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

  5. 树状结构Java模型、层级关系Java模型、上下级关系Java模型与html页面展示

    树状结构Java模型.层级关系Java模型.上下级关系Java模型与html页面展示 一.业务原型:公司的组织结构.传销关系网 二.数据库模型 很简单,创建 id 与 pid 关系即可.(pid:pa ...

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

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

  7. [转]NPOI导出EXCEL 打印设置分页及打印标题

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

  8. 由简入繁实现Jquery树状结构

    在项目中,我们经常会需要一些树状结构的样式来显示层级结构等,比如下图的样式,之前在学.net的时候可以直接拖个服务端控件过来直接使用非常方便.但是利用Jquery的一些插件,也是可以实现这些效果的,比 ...

  9. php实现树状结构无级分类

    php实现树状结构无级分类   ).",'树2-1-1-2')";mysql_query($sql);?>

随机推荐

  1. Leetcode 110 Balanced Binary Tree 二叉树

    判断一棵树是否是平衡树,即左右子树的深度相差不超过1. 我们可以回顾下depth函数其实是Leetcode 104 Maximum Depth of Binary Tree 二叉树 /** * Def ...

  2. Leetcode 202 Happy Number 弗洛伊德判环解循环

    今天先谈下弗洛伊德判环,弗洛伊德判环原来是在一个圈内有两人跑步,同时起跑,一人的速度是另一人的两倍,则那个人能在下一圈追上另一个人,弗洛伊德判环能解数字会循环出现的题,比如说判断一个链表是不是循环链表 ...

  3. 吐槽C++:C++ 类成员变量初始化 之 初始化带有参数的构造函数 的类成员变量。

    本来我想写这样的代码: class MatchManager{ public: MatchManager() { } class OnTimerRunFuncHelper{ public: OnTim ...

  4. INFO - InstallShield中的InstallScript工程Setup.exe /s的使用细节

    在InstallShield的各种工程类型中,Basic MSI工程Build出的安装包基于Windows Installer标准,所以默认就支持静默安装(至于如何静默安装,请自行补充相关知识).而对 ...

  5. 阿里云产品介绍(二):云服务器ECS的孪生兄弟们

    上一篇介绍的云服务器ECS,是阿里云最基础的产品,也是每一个云计算厂商最基础的产品,俗称爆款.除了标准的云服务器,阿里云也不停的在推出面向特殊业务场地的云服务器,可以说是ECS的孪生兄弟们. 这一篇就 ...

  6. Cocos2d-x3.x塔防游戏(保卫萝卜)从零开始(二)

    一.前提: 完成前一篇的内容. 具体参考:Cocos2d-x3.x塔防游戏(保卫萝卜)从零开始(一)篇 二.本篇目标: l  说说关于cocos2dx手机分辨率适配 l  对前一篇完成的塔防游戏原型进 ...

  7. iOS javascript js 交互

    //JS里的一个回调.比如网页上的某个按钮点一下之后.JS会调用setKey这个方法. JSContext *context1 = [self.startView valueForKeyPath:@& ...

  8. java获取点击微信自定义菜单的用户openid

    测试: 先上 请求类 HttpRequesto package reyo.sdk.utils.weixin; import java.io.BufferedReader; import java.io ...

  9. Search-ADaccount

    查询被锁定用户 Search-ADAccount -LockedOut | FT Name,ObjectClass -A Search-ADAccount Search-ADAccount Gets ...

  10. linux中ssh可以登录sftp不能登录解决办法

    我的服务器一直正常使用,平时使用secureCRT进行管理,使用secureFX进行文件的上传下载,突然有一天secureFX连接的时候出问题了,secureFX的日志如下: i SecureFX 版 ...