NPOI如何获取合并单元格行列跨度

清泉灵弦 2014-05-09 03:28:05
我用了很多办法都不行,而且NPOI的手册查的太少了,有没有类似MSDN那样的全面的文档库,要NPOI的不是POI

现在是可以合并单元格,但没法拆,也没法统计合并的单元格跨度多少,这样在实际读取EXCEL时根本无法判断表格结构,有对这方面研究的同行看看有什么好办法
...全文
2343 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ezio Mao 2017-01-09
  • 打赏
  • 举报
回复
没必要每个单元格都判断,过滤掉大部分后;针对是MergedCell的单元格获得rowSpam和colSpan. 有个怪的地方是,为什么不能根据当前rowNum和colNum获得CellRangeAddress,需要遍历sheet.NumMergedRegions后判断 (range.FirstRow == rowNum && range.FirstColumn == colNum,得到的MergedCell

                        if (sheet.GetRow(rowNum).GetCell(colNum).IsMergedCell)
                        {
                            int rowSpan = 0;
                            int colSpan = 0;
                            int regionsCount = sheet.NumMergedRegions;
                            for (int i = 0; i < regionsCount; i++)
                            {
                                CellRangeAddress range = sheet.GetMergedRegion(i);
                                sheet.IsMergedRegion(range);
                                if (range.FirstRow == rowNum && range.FirstColumn == colNum)
                                {
                                    rowSpan = range.LastRow - range.FirstRow + 1;
                                    colSpan = range.LastColumn - range.FirstColumn + 1;
                                    break;
                                }
                            }
                         }
xunmidisiye 2015-11-05
  • 打赏
  • 举报
回复
引用 3 楼 Xinke57 的回复:
	// 判断合并单元格重载
	// 调用时要在输出变量前加 out
	public bool isMergeCell(ISheet sheet,int rowNum,int colNum,out int rowSpan,out int colSpan)
	{
		bool result = false;
		rowSpan = 0;
		colSpan = 0;
		if ((rowNum < 1) || (colNum < 1)) return result;
		int rowIndex = rowNum - 1;
		int colIndex = colNum - 1;
		int regionsCount = sheet.NumMergedRegions;
		rowSpan = 1;
		colSpan = 1;
		for (int i = 0; i < regionsCount; i++ )
		{
			CellRangeAddress range = sheet.GetMergedRegion(i);
			sheet.IsMergedRegion(range);
			if (range.FirstRow == rowIndex && range.FirstColumn == colIndex)
			{
				rowSpan = range.LastRow - range.FirstRow + 1;
				colSpan = range.LastColumn - range.FirstColumn + 1;
				break;
			}
		}
		try
		{
			result = sheet.GetRow(rowIndex).GetCell(colIndex).IsMergedCell;
		}
		catch
		{
		}
		return result;
	}
其中 rowSpan 和 colSpan 变量调用时要用 out 行跨度变量a out 列跨度变量b 格式返回给变量存储, 如:

int spanR=0,spanC=0;
bool result=isMergeCell(sheet,5,4,out spanR,out spanC);
此时spanR和spanC返回后的结果就是行列跨度,核心原理就是用了range.LastRow和range.LastColumn读区域表格的最后行列位置 希望可以解决你的问题
表示这个代码有点问题
Xinke57 2014-11-16
  • 打赏
  • 举报
回复
	// 判断合并单元格重载
	// 调用时要在输出变量前加 out
	public bool isMergeCell(ISheet sheet,int rowNum,int colNum,out int rowSpan,out int colSpan)
	{
		bool result = false;
		rowSpan = 0;
		colSpan = 0;
		if ((rowNum < 1) || (colNum < 1)) return result;
		int rowIndex = rowNum - 1;
		int colIndex = colNum - 1;
		int regionsCount = sheet.NumMergedRegions;
		rowSpan = 1;
		colSpan = 1;
		for (int i = 0; i < regionsCount; i++ )
		{
			CellRangeAddress range = sheet.GetMergedRegion(i);
			sheet.IsMergedRegion(range);
			if (range.FirstRow == rowIndex && range.FirstColumn == colIndex)
			{
				rowSpan = range.LastRow - range.FirstRow + 1;
				colSpan = range.LastColumn - range.FirstColumn + 1;
				break;
			}
		}
		try
		{
			result = sheet.GetRow(rowIndex).GetCell(colIndex).IsMergedCell;
		}
		catch
		{
		}
		return result;
	}
其中 rowSpan 和 colSpan 变量调用时要用 out 行跨度变量a out 列跨度变量b 格式返回给变量存储, 如:

int spanR=0,spanC=0;
bool result=isMergeCell(sheet,5,4,out spanR,out spanC);
此时spanR和spanC返回后的结果就是行列跨度,核心原理就是用了range.LastRow和range.LastColumn读区域表格的最后行列位置 希望可以解决你的问题
qq_18939213 2014-08-05
  • 打赏
  • 举报
回复
你好。请问你这个问题解决了吗,我也想问!

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧