如何知道合并单元格中的可编辑单元格地址
How to know editable cell address in merged cells
enter image description here
这里有四个单元格(A1,B1,C1,D1)被合并,我想得到可编辑的单元格地址(A1)。
根据Excel A1单元格可编辑,其他不可编辑。
我可以使用下面的代码将合并的单元格计数为 4。
我也可以获得单元格是否已合并。
但无法获取合并单元格中可编辑单元格(A1) 的地址。
Microsoft.Office.Interop.Excel.Application appl = null;
appl = new Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop.Excel.Workbook wbk;
wbk = appl.Workbooks.Open("C:\Users\test\Desktop\test.xlsx");
Worksheet sheet = wbk.Worksheets.get_Item(1);
Range range = sheet.Cells[1, 2]; //B1 Cell
var a = range.Cells.MergeArea.Count; // can be able to get merged count cells
string b = range.Address;
**int ab = range.Cells.Areas.Count;**
Range ac = range.Cells.Areas.get_Item(1);
for (int i = 1; i <= 4; i++)
{
**if (sheet.Cells[1, i].Mergecells)** //merged cell
{
MessageBox.Show("Merged");
}
else //Unmerged cell
{
MessageBox.Show("UnMerged Cells");
}
}
wbk.Save();
wbk.Close(false);
appl.Quit();
Range 的 MergeArea
属性 又是一个 Range。如果你有一个单元格,只需使用类似下面的东西来获取合并区域的第一个(=左上角)单元格(在 C# 中未经测试,因为我没有它,但在 VBA 中工作并且也应该为 C# 工作):
Range range = sheet.Cells[1, 2];
Range firstCell = range.MergeArea.Cells[1, 1];
即使单元格未合并也能正常工作,MergeArea
始终设置,因此在未合并的单元格上 range
和 firstCell
将指向同一个单元格。
如果我正确理解了您的真正需求,请尝试下一种方法。它基于这样一个事实,即合并区域将值 保留在其第一个单元格 :
'your existing code...
if (sheet.Cells[1, i].Mergecells) //merged cell
{
MessageBox.Show(sheet.Cells[1, i].MergeArea.cells[1, 1].Value);
}
else //Unmerged cell
{
MessageBox.Show(sheet.Cells[1, i].Value);
}
'your existing code...
这是解决方案
string mergedCellsAddress = mergedRange.Address;
string[] firstMergedCell = mergedCellsAddress.Split(':');
string firstCell = firstMergedCell.GetValue(0).ToString().Replace("$", "");
enter image description here
这里有四个单元格(A1,B1,C1,D1)被合并,我想得到可编辑的单元格地址(A1)。 根据Excel A1单元格可编辑,其他不可编辑。 我可以使用下面的代码将合并的单元格计数为 4。 我也可以获得单元格是否已合并。 但无法获取合并单元格中可编辑单元格(A1) 的地址。
Microsoft.Office.Interop.Excel.Application appl = null;
appl = new Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop.Excel.Workbook wbk;
wbk = appl.Workbooks.Open("C:\Users\test\Desktop\test.xlsx");
Worksheet sheet = wbk.Worksheets.get_Item(1);
Range range = sheet.Cells[1, 2]; //B1 Cell
var a = range.Cells.MergeArea.Count; // can be able to get merged count cells
string b = range.Address;
**int ab = range.Cells.Areas.Count;**
Range ac = range.Cells.Areas.get_Item(1);
for (int i = 1; i <= 4; i++)
{
**if (sheet.Cells[1, i].Mergecells)** //merged cell
{
MessageBox.Show("Merged");
}
else //Unmerged cell
{
MessageBox.Show("UnMerged Cells");
}
}
wbk.Save();
wbk.Close(false);
appl.Quit();
Range 的 MergeArea
属性 又是一个 Range。如果你有一个单元格,只需使用类似下面的东西来获取合并区域的第一个(=左上角)单元格(在 C# 中未经测试,因为我没有它,但在 VBA 中工作并且也应该为 C# 工作):
Range range = sheet.Cells[1, 2];
Range firstCell = range.MergeArea.Cells[1, 1];
即使单元格未合并也能正常工作,MergeArea
始终设置,因此在未合并的单元格上 range
和 firstCell
将指向同一个单元格。
如果我正确理解了您的真正需求,请尝试下一种方法。它基于这样一个事实,即合并区域将值 保留在其第一个单元格 :
'your existing code...
if (sheet.Cells[1, i].Mergecells) //merged cell
{
MessageBox.Show(sheet.Cells[1, i].MergeArea.cells[1, 1].Value);
}
else //Unmerged cell
{
MessageBox.Show(sheet.Cells[1, i].Value);
}
'your existing code...
这是解决方案
string mergedCellsAddress = mergedRange.Address;
string[] firstMergedCell = mergedCellsAddress.Split(':');
string firstCell = firstMergedCell.GetValue(0).ToString().Replace("$", "");