Excel.Worksheet.Cells имеет обратное поведение?
Привет всем, я испытываю перенесенное поведение при работе с массивом Excel.Worksheet.Cells.
Моя первая ячейка должна быть в [row = 10, column = 3]
Моя вторая ячейка должна быть в [row = 11, column = 17]
Затем, используя эти две ячейки в качестве границ, я создаю диапазон и объединяя его. Как вы можете сказать из значений, отмеченных выше, диапазон должен быть в основном горизонтальным. Итак, чтобы помочь мне, я создал простую вспомогательную функцию, которая объединяет ячейки:
- Инструмент C # NPOI Excel не удаляет строку?
- Можно ли сделать лист excel справа налево с помощью closedXML
- Как читать значение столбца столбца excel с использованием OpenXML в C #
- получить данные, скопированные из файла excel в приложении в форме массива строк
- Как выделить ленту в excel?
public static void MergeRange(Excel.Worksheet worksheet, int startRowIdx, int startColIdx, int endRowIdx, int endColIdx, bool across = false) { //Get range boundaries. Excel.Range cells = worksheet.Cells; //commented out, resolved code is directly below - N. Miller, 9-24-2013 //Excel.Range topleftCell = cells[startColIdx][startRowIdx]; //Excel.Range bottomrightCell = cells[endColIdx][endRowIdx]; Excel.Range topleftCell = cells[startRowIdx, startColIdx]; Excel.Range bottomrightCell = cells[endRowIdx, endColIdx]; //Merge range. Debug.WriteLine(String.Format("({0}, {1}) to ({2}, {3}).", startRowIdx, startColIdx, endRowIdx, endColIdx)); Excel.Range range = worksheet.get_Range(topleftCell, bottomrightCell); Excel.Interior interior = range.Interior; interior.ColorIndex = XLColor.PERIWINKLE; //JUST HIGHLIGHTS RANGE FOR NOW. //range.Merge(across); //Cleanup Marshal.ReleaseComObject(interior); Marshal.ReleaseComObject(range); Marshal.ReleaseComObject(bottomrightCell); Marshal.ReleaseComObject(topleftCell); Marshal.ReleaseComObject(cells); }
В приведенном выше коде я выбираю ячейки, которые я хочу, обменивая столбцы и строки. Это, вопреки ожиданиям, приводит к желаемому поведению, но это противоречит документации MSDN:
Рабочий лист MSDN.
В документации MSDN они приводят пример, в котором первая строка указана, затем после нее следует столбец.
Итак, мой вопрос в том, что … что правильно? Должна ли строка быть первой или первым должен быть столбец ? Когда я изменяю свой код, который должен быть связан с документацией MSDN, выделенные ячейки транспонируются.
- Я ищу информацию о внедрении Excel в WinForm. (под C # 4.0)
- Редактор WPF и просмотрщик данных Excel
- Excel Interop - как изменить именованный диапазон
- Две оси в одной диаграмме excel
- Поддерживает ли Epplus Excel 2013?
- Мне нужно написать список записей из списка Row_Items в листе excel в столбце F (в разделе Incident coumn)
- От excel до datatables
- Редактируемый список DropDown через проверку
Если я правильно вас понимаю, тогда, когда вы используете say cells[1][2]
тогда это означает A2
В этом случае столбец на первом месте, а затем строка. Если вы напишете его как cells[1,2]
вы получите B2
. В этом случае сначала появляется строка, а затем столбец.
То же самое происходит в Excel-VBA. ?Cells(1)(2).address
в непосредственном окне дает $A$2
и ?Cells(1,2).address
дает $B$1
Если вы чувствуете, что я не понял ваш запрос, пожалуйста, перефразируйте его для меня. ..
Вот полный код для его проверки.
ПРИМЕЧАНИЕ . Протестировано с использованием VS 2010 Ultimate + Excel 2010
using System; using System.Windows.Forms; using System.IO; using Excel = Microsoft.Office.Interop.Excel; using System.Reflection; Namespace WindowsFormsApplication1 { public partial class Form1 : Form { Public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Excel.Application xlexcel; Excel.Workbook xlWorkBook; Excel.Worksheet xlWorkSheet; object misValue = Missing.Value; xlexcel = new Excel.Application(); xlexcel.Visible = true; //~~> Open a File (Change filename as applicable) xlWorkBook = xlexcel.Workbooks.Open("C:\\SomeFile.xlsx", 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0); //~~> Set Sheet 1 as the sheet you want to work with xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1); Excel.Range cells = xlWorkSheet.Cells; Excel.Range topleftCell = cells[1][2]; MessageBox.Show(topleftCell.Address); topleftCell = cells[1,2]; MessageBox.Show(topleftCell.Address); //~~> Once done close and quit Excel xlWorkBook.Close(false, misValue, misValue); xlexcel.Quit(); //~~> CleanUp releaseObject(xlWorkSheet); releaseObject(xlWorkBook); releaseObject(xlexcel); } private void releaseObject(object obj) { try { System.Runtime.InteropServices.Marshal.ReleaseComObject(obj); obj = null; } catch (Exception ex) { obj = null; MessageBox.Show("Unable to release the Object " + ex.ToString()); } finally { GC.Collect(); } } } }
Скриншот