同事反應透過 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:從零開始的軟體開發生活」
請大家繼續支持 ^_^