2009-08-03 1 views
1

Я импортирую данные в листы Excel из базы данных. Для этого я использую datareader. Шаблон листа excel имеет несколько макросов и вычисляется несколько формул, а не обычный рабочий лист excel. поэтому мне приходится записывать данные в лист excel только в том случае, если конкретной ячейке разрешено писать. Если нет, данные не должны импортироваться.Как проверить, действительно ли ячейка загружена только в EXCEL, используя C#

Для этого у меня есть XML-файл, в котором говорится, из какого столбца я должен начать писать и в какой строке он должен остановиться, я сделал это для многих листов. Но в одном листе первая ячейка строки является «readonly» (заблокирована), а остальные доступны для записи.

Поскольку я получаю всю строку из БД с помощью Datareader, я застрял в необходимости писать в другие ячейки, не записывая в заблокированную ячейку.

У меня есть фрагмент кода для справки.

Пожалуйста, помогите мне в этом.

Sample ::

if (reader.HasRows) 
    { 
    minRow = 0; 
    minCol = 0; 
    Excel.Workbook SelWorkBook = excelAppln.Workbooks.Open(curfile, 0, false, 5, "", "", false, Excel.XlPlatform.xlWindows, "", true, false, 0, false, false, false); 
    Excel.Sheets excelSheets = SelWorkBook.Worksheets; 

Excel.Worksheet excelworksheet = (Excel.Worksheet)excelSheets.get_Item(CurSheetName); 

             // Process each result in the result set 
             while (reader.Read()) 
             { 
              // Create an array big enough to hold the column values 
              object[] values = new object[reader.FieldCount]; 

              // Add the array to the ArrayList 
              rowList.Add(values); 

              // Get the column values into the array 
              reader.GetValues(values); 

              int iValueIndex = 0; 

              // If the Reading Format is by ColumnByColumn 
              if (CurTaskNode.ReadFormat == "ColumnbyColumn") 
              { 
               minCol = 0; 
               // minRow = 0; 
               for (int iCol = 0; iCol < CurTaskNode.HeaderData.Length; iCol++) 
               { 

                // Checking whether the Header data exists or not 
                if (CurTaskNode.HeaderData[minCol] != "") 
                { 
                 // Assigning the Value from reader to the particular cell in excel sheet 
                 excelworksheet.Cells[CurTaskNode.DATA_MIN_ROW + minRow, CurTaskNode.DATA_MIN_COL + minCol] = values[iValueIndex]; 
                 iValueIndex++; 

                } 
                minCol++; 
               } 
               minRow++; 
              }SelWorkBook.Close(true, curfile, null); 

Пожалуйста, помогите мне в решении этого.

Спасибо,

Рамм

+0

Вы отправили код, но вы не объяснили, что он делает или почему это не работает для вас? –

+0

Извините, я забыл. Этот фрагмент кода считывает данные из БД, если у читателя есть rows.It затем открывает новый предварительно загруженный файл шаблона excel и присваивает данные считывателя объекту Values. Затем для длины заголовка (HeaderData.Length) в XML-файле он записывается в каждую ячейку excel и, наконец, сохраняет файл и закрывается. Место, где записаны данные, является excelworksheet.Cells [CurTaskNode.DATA_MIN_ROW + minRow, CurTaskNode.DATA_MIN_COL + minCol] = значения [iValueIndex]; // Собственно, проверка должна быть выполнена b4, чтобы записать в ячейку. Я не могу этого сделать. Pls Help – Ramm

+0

Хорошо, я опубликовал новый ответ, попробуйте. –

ответ

0

Ok, сначала нужно проверить запертую свойство первой ячейки, а затем, если он заблокирован Нарезать массив (так что у вас есть целый ряд минус первый столбец), затем напишите на лист. Вот код, не всегда точен, функция ЛОМТИКА только псевдо-код, существует целый ряд различных способов нарезки массивов в C#, используйте метод вашего выбора:

if (!excelworksheet.Cells[CurTaskNode.DATA_MIN_ROW + minRow, CurTaskNode.DATA_MIN_COL + 1].Locked) 
{ 
    excelworksheet.Cells[CurTaskNode.DATA_MIN_ROW + minRow, CurTaskNode.DATA_MIN_COL + minCol] = values[iValueIndex]; 
    iValueIndex++; 
} 
else 
{ 
    excelworksheet.Cells[CurTaskNode.DATA_MIN_ROW + minRow, CurTaskNode.DATA_MIN_COL + minCol] = values.SLICE(iValueIndex); 
    iValueIndex++; 
} 
+0

Привет Lance, это не работал из .. Если я использую это, говорит диапазон наклоняет быть использован, как это ... его объект ..но используются как переменные Как я использую DataReader и читает все строка из базы данных, она также записывает целую строку в excelsheet. , так что он будет писать другие ячейки в этой строке. My req пропускает ТОЛЬКО ПЕРВЫЙ КЛЕТОК в первом ряду. и напишите остаток ячеек в первой строке. Начиная со второй строки, ее нормальная .. пишите для всех ячеек во второй строке. Пожалуйста, помогите мне изменить код для этого. – Ramm

+0

Хорошо, мне нужно будет более подробно изучить его, но это может занять некоторое время. Я оставлю ответ до сих пор, чтобы никто не дублировал его. –