if(ExcelCells.MergeCells){
...
}
else{
...
}
Excel. Как определить границы объединенной ячейки?
Подскажите, пожалуйста, как можно определить границы объединенной ячейки в таблице Excel?
Вот вырезка из кода
Код:
// Создаем новое приложение excel и загружаем в него выбранный файл xls
ExcelApp = new Excel.Application();
ExcelAppWorkBook = ExcelApp.Workbooks.Open(textBoxFile.Text, 0, false, 5, "", "", true, Excel.XlPlatform.xlWindows,
"\t", false, false, 0, true, true, false);
// Выбираем первый лист книги
ExcelWorkSheet = (Excel.Worksheet)ExcelAppWorkBook.Worksheets.get_Item(1);
// Определяем размеры таблицы
int Row = ExcelWorkSheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell, Type.Missing).Row; //макс строка
int Col = ExcelWorkSheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell, Type.Missing).Column; //макс столбик
// Здесь, как вариант, щупаем каждую ячейку, потому что нам еще и значения нужны
for (i = 1; i <= Row; i++)
{
for (y = 1; y <= Col; y++)
{
ExcelCells = ((Excel.Range)ExcelWorkSheet.Cells[i, y]);
......
//Вот здесь и нужна функция определения, является ли ячейка объединенной и какие у нее границы, если да
.......
}
}
ExcelApp = new Excel.Application();
ExcelAppWorkBook = ExcelApp.Workbooks.Open(textBoxFile.Text, 0, false, 5, "", "", true, Excel.XlPlatform.xlWindows,
"\t", false, false, 0, true, true, false);
// Выбираем первый лист книги
ExcelWorkSheet = (Excel.Worksheet)ExcelAppWorkBook.Worksheets.get_Item(1);
// Определяем размеры таблицы
int Row = ExcelWorkSheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell, Type.Missing).Row; //макс строка
int Col = ExcelWorkSheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell, Type.Missing).Column; //макс столбик
// Здесь, как вариант, щупаем каждую ячейку, потому что нам еще и значения нужны
for (i = 1; i <= Row; i++)
{
for (y = 1; y <= Col; y++)
{
ExcelCells = ((Excel.Range)ExcelWorkSheet.Cells[i, y]);
......
//Вот здесь и нужна функция определения, является ли ячейка объединенной и какие у нее границы, если да
.......
}
}
Цитата: Makseg
Добрый день!
Подскажите, пожалуйста, как можно определить границы объединенной ячейки в таблице Excel?
Вот вырезка из кода
Подскажите, пожалуйста, как можно определить границы объединенной ячейки в таблице Excel?
Вот вырезка из кода
Код:
// Создаем новое приложение excel и загружаем в него выбранный файл xls
ExcelApp = new Excel.Application();
ExcelAppWorkBook = ExcelApp.Workbooks.Open(textBoxFile.Text, 0, false, 5, "", "", true, Excel.XlPlatform.xlWindows,
"\t", false, false, 0, true, true, false);
// Выбираем первый лист книги
ExcelWorkSheet = (Excel.Worksheet)ExcelAppWorkBook.Worksheets.get_Item(1);
// Определяем размеры таблицы
int Row = ExcelWorkSheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell, Type.Missing).Row; //макс строка
int Col = ExcelWorkSheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell, Type.Missing).Column; //макс столбик
// Здесь, как вариант, щупаем каждую ячейку, потому что нам еще и значения нужны
for (i = 1; i <= Row; i++)
{
for (y = 1; y <= Col; y++)
{
ExcelCells = ((Excel.Range)ExcelWorkSheet.Cells[i, y]);
......
//Вот здесь и нужна функция определения, является ли ячейка объединенной и какие у нее границы, если да
.......
}
}
ExcelApp = new Excel.Application();
ExcelAppWorkBook = ExcelApp.Workbooks.Open(textBoxFile.Text, 0, false, 5, "", "", true, Excel.XlPlatform.xlWindows,
"\t", false, false, 0, true, true, false);
// Выбираем первый лист книги
ExcelWorkSheet = (Excel.Worksheet)ExcelAppWorkBook.Worksheets.get_Item(1);
// Определяем размеры таблицы
int Row = ExcelWorkSheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell, Type.Missing).Row; //макс строка
int Col = ExcelWorkSheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell, Type.Missing).Column; //макс столбик
// Здесь, как вариант, щупаем каждую ячейку, потому что нам еще и значения нужны
for (i = 1; i <= Row; i++)
{
for (y = 1; y <= Col; y++)
{
ExcelCells = ((Excel.Range)ExcelWorkSheet.Cells[i, y]);
......
//Вот здесь и нужна функция определения, является ли ячейка объединенной и какие у нее границы, если да
.......
}
}
Код:
http://msdn.microsoft.com/en-us/library/microsoft.office.tools.excel.namedrange.mergecells%28VS.80%29.aspx
"Не удается неявно преобразовать тип "object" в "bool". Существует явное преобразование (возможно, пропущено приведение типов)"
Сделал явное преобразование в bool
Код:
if((bool)ExcelCells.MergeCells)
{
...
}
else
{
....
}
{
...
}
else
{
....
}
и все заработало. спасибо большое.
Причем пробовал раньше так делать, как вы написали, но преобразовать явно в bool, почему-то не додумался.
Нашел как ее границы определить по ссылке
Код:
string afterMergeAddress = ExcelCells.MergeArea.get_Address(
Type.Missing, Type.Missing, Excel.XlReferenceStyle.xlA1, Type.Missing, Type.Missing);
MessageBox.Show("After merging, the MergeArea property is '" +
afterMergeAddress + "' and the MergeCells property is " +
" '" + ExcelCells.MergeCells.ToString() + "'.");
Type.Missing, Type.Missing, Excel.XlReferenceStyle.xlA1, Type.Missing, Type.Missing);
MessageBox.Show("After merging, the MergeArea property is '" +
afterMergeAddress + "' and the MergeCells property is " +
" '" + ExcelCells.MergeCells.ToString() + "'.");
Например, я получил границы ячейки в виде строки "$A$1:$A$2" а как мне отсюда в разные переменные записать начальную точку [1,1] и конечную [1,2]? Неужели регулярными выражениями обрабатывать строку?
Код:
if(ExcelCells.MergeCells.ToBoolean)
По поводу второго вопроса - а как вы вообще можете разделить - что в одну ячейку, что во вторую? Я бы поступил следующим образом - в первую ячейку записал бы строку, вторую же оставил бы пустой.
Цитата: kot_
На самом деле использовать приведение типов в С-стиле - это не очень хорошая идея. ИМХО лучше использовать чтото типа такого (это пример, название конкретного метода смотрите сами):
По поводу второго вопроса - а как вы вообще можете разделить - что в одну ячейку, что во вторую? Я бы поступил следующим образом - в первую ячейку записал бы строку, вторую же оставил бы пустой.
Код:
if(ExcelCells.MergeCells.ToBoolean)
По поводу второго вопроса - а как вы вообще можете разделить - что в одну ячейку, что во вторую? Я бы поступил следующим образом - в первую ячейку записал бы строку, вторую же оставил бы пустой.
Спасибо за пример приведения типов.
По второму вопросу.
Дело в том, что мне и не надо определять, что в одну ячейку что в другую. Таблица берется из экселевского файлика, где могут быть объединенные ячейки и, в данном случае, мне просто надо определить границы ячеек в виде [1,1] - начальная координата, [1,2] - конечная (если объединенная ячейка имеет границы "А1:А2"). Значение же, которое соответствует данной области хранится в ячейке [1,1]
поробуйте использовать свойство NamedRange.Colums - по идее должно вернуть количество столбцов, которое занимает ячейка (и соотвественно Rows).
Я не думаю что регулярка - это лучшее решение.
Спасибо. буду копаться
Код:
// Создаем новое приложение excel и загружаем в него выбранный файл xls
ExcelApp = new Excel.Application();
ExcelAppWorkBook = ExcelApp.Workbooks.Open(textBoxFile.Text, 0, false, 5, "", "", true, Excel.XlPlatform.xlWindows,
"\t", false, false, 0, true, true, false);
// Выбираем первый лист книги
ExcelWorkSheet = (Excel.Worksheet)ExcelAppWorkBook.Worksheets.get_Item(1);
// Определяем размеры таблицы
int Row = ExcelWorkSheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell, Type.Missing).Row; //макс строка
int Col = ExcelWorkSheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell, Type.Missing).Column; //макс столбик
// Здесь, как вариант, щупаем каждую ячейку, потому что нам еще и значения нужны
for (i = 1; i <= Row; i++)
{
for (y = 1; y <= Col; y++)
{
ExcelCells = ((Excel.Range)ExcelWorkSheet.Cells[i, y]); // получаем координаты ячейки
// проверяем объединенная ли ячейка
if((bool)ExcelCells.MergeCells)
{
CellBeginY = ExcelCells.MergeArea.Row; // индекс строки крайней первой ячеки области
CellBeginX = ExcelCells.MergeArea.Column; // индекс столбца
// индекс строки крайней последней ячейки области
CellEndY = ExcelCells.MergeArea.Row + ExcelCells.MergeArea.Rows.Count - 1;
// индекс столбца
CellEndX = ExcelCells.MergeArea.Column + ExcelCells.MergeArea.Columns.Count - 1;
}
}
}
ExcelApp = new Excel.Application();
ExcelAppWorkBook = ExcelApp.Workbooks.Open(textBoxFile.Text, 0, false, 5, "", "", true, Excel.XlPlatform.xlWindows,
"\t", false, false, 0, true, true, false);
// Выбираем первый лист книги
ExcelWorkSheet = (Excel.Worksheet)ExcelAppWorkBook.Worksheets.get_Item(1);
// Определяем размеры таблицы
int Row = ExcelWorkSheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell, Type.Missing).Row; //макс строка
int Col = ExcelWorkSheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell, Type.Missing).Column; //макс столбик
// Здесь, как вариант, щупаем каждую ячейку, потому что нам еще и значения нужны
for (i = 1; i <= Row; i++)
{
for (y = 1; y <= Col; y++)
{
ExcelCells = ((Excel.Range)ExcelWorkSheet.Cells[i, y]); // получаем координаты ячейки
// проверяем объединенная ли ячейка
if((bool)ExcelCells.MergeCells)
{
CellBeginY = ExcelCells.MergeArea.Row; // индекс строки крайней первой ячеки области
CellBeginX = ExcelCells.MergeArea.Column; // индекс столбца
// индекс строки крайней последней ячейки области
CellEndY = ExcelCells.MergeArea.Row + ExcelCells.MergeArea.Rows.Count - 1;
// индекс столбца
CellEndX = ExcelCells.MergeArea.Column + ExcelCells.MergeArea.Columns.Count - 1;
}
}
}