using Sbroenne.ExcelMcp.ComInterop;
using Sbroenne.ExcelMcp.ComInterop.Session;
using Sbroenne.ExcelMcp.Core.Models;
namespace Sbroenne.ExcelMcp.Core.Commands.Range;
/// <summary>
/// Merge, conditional formatting, and protection operations for Excel ranges (partial class)
/// </summary>
public partial class RangeCommands
{
/// <inheritdoc />
[System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "CA2012:Use ValueTasks correctly")]
public void MergeCells(
IExcelBatch batch,
string sheetName,
string rangeAddress)
{
batch.Execute((ctx, ct) =>
{
dynamic? sheet = null;
dynamic? range = null;
try
{
// Get sheet
sheet = string.IsNullOrEmpty(sheetName)
? ctx.Book.ActiveSheet
: ctx.Book.Worksheets.Item(sheetName);
// Get range
range = sheet.Range[rangeAddress];
// Merge cells
range.Merge();
return ValueTask.CompletedTask;
}
finally
{
ComUtilities.Release(ref range!);
ComUtilities.Release(ref sheet!);
}
});
}
/// <inheritdoc />
[System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "CA2012:Use ValueTasks correctly")]
public void UnmergeCells(
IExcelBatch batch,
string sheetName,
string rangeAddress)
{
batch.Execute((ctx, ct) =>
{
dynamic? sheet = null;
dynamic? range = null;
try
{
// Get sheet
sheet = string.IsNullOrEmpty(sheetName)
? ctx.Book.ActiveSheet
: ctx.Book.Worksheets.Item(sheetName);
// Get range
range = sheet.Range[rangeAddress];
// Unmerge cells
range.UnMerge();
return ValueTask.CompletedTask;
}
finally
{
ComUtilities.Release(ref range!);
ComUtilities.Release(ref sheet!);
}
});
}
/// <inheritdoc />
public RangeMergeInfoResult GetMergeInfo(
IExcelBatch batch,
string sheetName,
string rangeAddress)
{
return batch.Execute((ctx, ct) =>
{
dynamic? sheet = null;
dynamic? range = null;
try
{
// Get sheet
sheet = string.IsNullOrEmpty(sheetName)
? ctx.Book.ActiveSheet
: ctx.Book.Worksheets.Item(sheetName);
// Get range
range = sheet.Range[rangeAddress];
// Check if merged
var isMerged = range.MergeCells ?? false;
return new RangeMergeInfoResult
{
Success = true,
FilePath = batch.WorkbookPath,
SheetName = sheetName,
RangeAddress = rangeAddress,
IsMerged = isMerged
};
}
finally
{
ComUtilities.Release(ref range!);
ComUtilities.Release(ref sheet!);
}
});
}
/// <inheritdoc />
[System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "CA2012:Use ValueTasks correctly")]
public void SetCellLock(
IExcelBatch batch,
string sheetName,
string rangeAddress,
bool locked)
{
batch.Execute((ctx, ct) =>
{
dynamic? sheet = null;
dynamic? range = null;
try
{
// Get sheet
sheet = string.IsNullOrEmpty(sheetName)
? ctx.Book.ActiveSheet
: ctx.Book.Worksheets.Item(sheetName);
// Get range
range = sheet.Range[rangeAddress];
// Set locked property
range.Locked = locked;
return ValueTask.CompletedTask;
}
finally
{
ComUtilities.Release(ref range!);
ComUtilities.Release(ref sheet!);
}
});
}
/// <inheritdoc />
public RangeLockInfoResult GetCellLock(
IExcelBatch batch,
string sheetName,
string rangeAddress)
{
return batch.Execute((ctx, ct) =>
{
dynamic? sheet = null;
dynamic? range = null;
try
{
// Get sheet
sheet = string.IsNullOrEmpty(sheetName)
? ctx.Book.ActiveSheet
: ctx.Book.Worksheets.Item(sheetName);
// Get range
range = sheet.Range[rangeAddress];
// Get locked property
var isLocked = range.Locked ?? false;
return new RangeLockInfoResult
{
Success = true,
FilePath = batch.WorkbookPath,
SheetName = sheetName,
RangeAddress = rangeAddress,
IsLocked = isLocked
};
}
finally
{
ComUtilities.Release(ref range!);
ComUtilities.Release(ref sheet!);
}
});
}
}