[.NET]為什麼 NPOI 設定合併儲存格(跨欄置中)沒有效果

同事反應透過 NPOI 設定合併儲存格(跨欄置中) AddMergedRegion 卻沒有效果,

用以下的程式來測試,發現雖然程式有去叫它做 AddMergedRegion ,

NPOI.SS.UserModel.IWorkbook wb;
//開啟f1.xls
using (FileStream file = new FileStream(@"D:\DevExpress\f1.xls",
	FileMode.Open, FileAccess.Read))
{
	wb = new HSSFWorkbook(file);
	file.Close();
}

//取得第1個 sheet
var sheet = wb.GetSheetAt(0);
int rowIdx = 24; //要設定跨欄的 row index
//將第25列的內容清掉
sheet.GetRow(rowIdx).Cells.Clear();
var cra = new NPOI.SS.Util.CellRangeAddress(rowIdx, rowIdx, 0, 69);
//合併儲存格
sheet.AddMergedRegion(cra);
sheet.GetRow(rowIdx).GetCell(0).SetCellValue("***查無該項資訊***");
sheet.GetRow(rowIdx).GetCell(0).CellStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
//另存新檔
using (FileStream file = new FileStream(@"D:\DevExpress\f1Result.xls", 
	FileMode.OpenOrCreate, FileAccess.Write))
{
	wb.Write(file);
	file.Close();
}

但用Excel看起來卻是沒有變,如上圖。

後來開啟原始檔案,突然發現,原有的 Row 上面就已經有設定 合併儲存格 了,如下圖,

猜想有可能是因原本就有設定 合併儲存格 ,所以後來設定的就會無效,

用 Excel 2016看是不對的,但 Excel 2013/2010 看卻是有效果的。

所以就寫一個 Method 在設定 合併儲存格 之前,先將該 Row 原有的 合併儲存格 效果清除掉(RemoveMergeCells),如下,

private static void RemoveMergeCells(int times, int rowIndex, ISheet sheet)
{
	for(int execTime =0;execTime< times; execTime++)
	{
		for (int i = 0; i < sheet.NumMergedRegions; i++)
		{
			CellRangeAddress cellRangeAddress = sheet.GetMergedRegion(i);
			if (cellRangeAddress.FirstRow == rowIndex)
			{
				sheet.RemoveMergedRegion(i);
			}
		}
	}
}

然後在設定之前呼叫該Method(times是因為該Row上面有可能會有次的合併儲存格在上面,我是用3次,您可依檔案調整),如下,

NPOI.SS.UserModel.IWorkbook wb;
//開啟f1.xls
using (FileStream file = new FileStream(@"D:\DevExpress\f1.xls",
	FileMode.Open, FileAccess.Read))
{
	wb = new HSSFWorkbook(file);
	file.Close();
}

//取得第1個 sheet
var sheet = wb.GetSheetAt(0);
int rowIdx = 24; //要設定跨欄的 row index

//設定之前先將原有的合併儲存格清除掉
RemoveMergeCells(3, rowIdx, sheet);

//將第25列的內容清掉
sheet.GetRow(rowIdx).Cells.Clear();
var cra = new NPOI.SS.Util.CellRangeAddress(rowIdx, rowIdx, 0, 69);
//合併儲存格
sheet.AddMergedRegion(cra);
sheet.GetRow(rowIdx).GetCell(0).SetCellValue("***查無該項資訊***");
sheet.GetRow(rowIdx).GetCell(0).CellStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
//另存新檔
using (FileStream file = new FileStream(@"D:\DevExpress\f1Result.xls",
	FileMode.OpenOrCreate, FileAccess.Write))
{
	wb.Write(file);
	file.Close();
}

這樣就可以正常了,如下,

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^