2013-09-23 2 views
3

Эй, все, я испытываю транспонированное поведение при работе с массивом Excel.Worksheet.Cells. Excel.Worksheet.Cells имеет обратное поведение?

Моя первая ячейка должна быть в [строка = 10, колонка = 3]
Моя вторая ячейка должна быть в [строке = 11, колонки = 17]

Затем, используя эти две ячейки в качестве границ, я создаю диапазон и объединяя его. Как вы можете сказать по значениям, отмеченным выше, диапазон должен быть в основном горизонтальным. Таким образом, чтобы помочь мне, я создал простую вспомогательную функцию, которая объединяет клетки:

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 Worksheet.Cells

В документации MSDN они дают пример, в котором указаны строки первого, то столбец следует после ,

Так что мой вопрос в том, что ... что правильно? Должно ли первое поле или должно быть должно быть столбец? Когда я изменяю свой код, который должен быть связан с документацией MSDN, выделенные ячейки транспонируются.

+2

Если я вас правильно понял, то при использовании сказать ' ячейки [1] [2] ', то это означает' A2' В этом случае сначала стоит столбец, а затем строка. Если вы напишете его как 'cells [1,2]', тогда вы получите 'B2'. В этом случае сначала появится строка Row, а затем столбец. –

+2

Это то же самое в Excel-VBA. '? Cells (1) (2) .address' в непосредственном окне дает' $ A $ 2' и '? Cells (1,2) .address' дает' $ B $ 1'. Если вы чувствуете, что я не понял ваш запрос, пожалуйста, перефразируйте его для меня ... –

+0

@SiddharthRout, что заявляет OP, похоже, не представляется возможным в C#. – varocarbas

ответ

3

Если я правильно вас понял, то когда вы используете, скажите 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(); 
      } 
     } 
    } 
} 

ScreenShot

enter image description here

enter image description here

+0

Только для будущих читателей: я не смог подражать этому диапазону поведения [] [] с VS 2008 и Office 2010. – varocarbas

+0

Да, я пробовал его с VS 2008, и он не работает :) Но тогда датируется 2008;) Напоминает, что мне нужно обновить эту версию на этом компьютере до 2013 года! –

+0

Если вы имеете в виду Office 2013, это не слишком рекомендуется (то же самое, что и VS 2012). Последние версии имеют тенденцию быть проблематичными. У меня есть VS 2008, 2010 и 2012; для большинства вещей, которые я использую в 2010 или 2008 годах. На самом деле, 2008 год очень надежный (эта «проблема» была действительно шокирующей для меня, никогда раньше такого не видала ... но имейте в виду, что это не очень важно) , может иметь некоторые недостающие функции, но по-прежнему гораздо более рекомендуется, чем 2012 (с точки зрения общей надежности), на мой взгляд. – varocarbas

Смежные вопросы