2015-11-17 2 views
0

Ниже мой код C# для отправки динамически созданных текстовых полей в Excel. Мне нужно найти последнюю строку, используемую для этих текстовых полей, поэтому я могу запустить следующий цикл для 6 строк ниже первого набора.C# в Excel, найти последнюю строку

int StartBundleRow = 11; 
for (int BndlRow = 0; BndlRow < bundleRows; BndlRow++) //add bundle rows to spreadsheet 
{ 
    worksheet.Rows[StartBundleRow].Insert(); 
    worksheet.Cells[StartBundleRow, "D"].value = srcBundlePanel.Controls["txtQtyBundle" + BndlRow].Text; 
    worksheet.Cells[StartBundleRow, "E"].value = srcBundlePanel.Controls["txtProductNameBundle" + BndlRow].Text; 
    worksheet.Cells[StartBundleRow, "F"].value = srcBundlePanel.Controls["txtListPriceBundle" + BndlRow].Text; 
    worksheet.Cells[StartBundleRow, "G"].value = srcBundlePanel.Controls["txtMaxDiscountBundle" + BndlRow].Text; 
    worksheet.Cells[StartBundleRow++, "H"].value = srcBundlePanel.Controls["txtProposedPriceBundle" + BndlRow].Text; 
} 
+0

используйте устройство вар, такие как «ИНТ _lastRowWritten» и обновлять его, как вы идти. –

+0

Я понимаю, как создать «int», но я не уверен в его обновлении;) ... Автоматизация Excel для меня совершенно новая. – DSB

ответ

0

Вы могли бы сделать что-то вроде этого:

const int ROW_CUSHION = 6; 
int StartBundleRow = 11; 
int nextStartingRow = StartBundleRow; 
for (int BndlRow = 0; BndlRow < bundleRows; BndlRow++) //add bundle rows to spreadsheet 
{ 
    worksheet.Rows[StartBundleRow].Insert(); 
    worksheet.Cells[StartBundleRow, "D"].value = srcBundlePanel.Controls["txtQtyBundle" + BndlRow].Text; 
    worksheet.Cells[StartBundleRow, "E"].value = srcBundlePanel.Controls["txtProductNameBundle" + BndlRow].Text; 
    worksheet.Cells[StartBundleRow, "F"].value = srcBundlePanel.Controls["txtListPriceBundle" + BndlRow].Text; 
    worksheet.Cells[StartBundleRow, "G"].value = srcBundlePanel.Controls["txtMaxDiscountBundle" + BndlRow].Text; 
    worksheet.Cells[StartBundleRow++, "H"].value = srcBundlePanel.Controls["txtProposedPriceBundle" + BndlRow].Text; 
} 
nextStartingRow = nextStartingRow + ROW_CUSHION; 

Например, вот отрывок из некоторых моих, похоже, код:

const int TIMES_BEFORE_ITS_CHARMING = 3; 
private int _lastRowAdded; 
. . . 
_lastRowAdded = _curDescriptionTopRow + TIMES_BEFORE_ITS_CHARMING; 
. . . 
var descriptionColRange = _xlSheet.Range[_xlSheet.Cells[DATA_STARTING_ROW, ITEMDESC_COL], _xlSheet.Cells[_lastRowAdded, ITEMDESC_COL]]; 

Так я задаю ему на основе другое значение + значение «подушка» (3 выше); при необходимости он может обновляться по всему коду. Затем я использую значение для таких вещей, как описание диапазона ячеек для работы.

+0

Ну, это не совсем не работает, LOL. Он объединяет обе петли в основном, но он не пропускает и не запускает 6 строк ниже. Возможно, я смогу его отрегулировать. – DSB

+0

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

+1

Будет ли иметь значение, если я объявляю Row_cushion целое число вместо константы? Когда я пытаюсь сделать его постоянным, он говорит, что мне не хватает ссылки или «использования». Это единственное отличие, которое у меня есть – DSB

1

Вы также можете использовать что-то вроде этого каждый раз, когда вам нужно запустить последовательность:

int numRows = sheet.UsedRange.Rows.Count; 

лист типа Microsoft.Office.Interop.Excel.Worksheet

+0

Удивительно, я об этом не знал. –

+0

Конечно, это работает только в том случае, если он заполняет новый рабочий лист. –

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