2012-10-30 2 views
0

Я пишу содержимое в файл excel через C#. У меня 4 столбца и много строк в excel. Когда приложение запускается, мне нужно проверить, присутствует ли в листе data1, а затем его следует переместить в sheet2. Если sheet2 также содержит данные, тогда он должен быть добавлен с данными sheet2. Я использую interop dll для доступа к excel. Я сделал с написанием содержимого, но как я могу его программно переместить? Это то, что я пробовал.Как переместить данные в sheet1 в sheet2 в excel

Excel.Workbook xlwb; 
    Excel.Application excelApp = new Excel.Application(); 
    Excel.Worksheet xlssheet1; 
    Excel.Worksheet xlssheet2; 
xlwb = excelApp.Workbooks.Open(myPath, objMissing, objMissing, objMissing, objMissing, objMissing, objMissing, 
            objMissing, objMissing, objMissing, objMissing, objMissing, objMissing, objMissing, objMissing); 
      int rowIndex = 2; int colIndex = 1; 
      if (excelApp.Cells[rowIndex, colIndex] != null) 
      { 
       xlssheet1 = (Worksheet)xlwb.Worksheets[1]; 
       xlssheet2 = (Worksheet)xlwb.Worksheets[2]; 

       xlwb.Sheets.Move(System.Reflection.Missing.Value, xlssheet2); 
       xlwb.Save();     

      } 
+0

я использовал Interop в прошлом и нашел это очень хлопотным. Если вы знаете, что не будете обрабатывать старые файлы excel, я предлагаю вам взглянуть на [OpenXML-библиотеку] (http://msdn.microsoft.com/en-us/library/office/bb448854.aspx) (или упрощенная сторонняя сторона [ClosedXML] (http://closedxml.codeplex.com/)). – Joe

ответ

2

Прежде всего, я бы определить функция, чтобы узнать последнюю использованную строку листа:

private int LastUsedRow(Excel.Worksheet aSheet) 
{ 
    object hmissing = System.Reflection.Missing.Value; 
    string usedAddress = aSheet.UsedRange.get_Address(hmissing, hmissing, Excel.XlReferenceStyle.xlA1, hmissing, hmissing); 
    return int.Parse(usedAddress.Substring(usedAddress.LastIndexOf('$') + 1)); 
} 

Тогда ваш код может итеративно скопировать ячейки из одного листа к другому таким образом:

Excel.Workbook xlwb; 
Excel.Application excelApp = new Excel.Application(); 
Excel.Worksheet xlssheet1; 
Excel.Worksheet xlssheet2; 
xlwb = excelApp.Workbooks.Open(myPath, objMissing, objMissing, objMissing, objMissing, objMissing, objMissing, objMissing, objMissing, objMissing, objMissing, objMissing, objMissing, objMissing, objMissing); 
xlssheet1 = (Worksheet)xlwb.Worksheets[1]; 
xlssheet2 = (Worksheet)xlwb.Worksheets[2]; 
int lastRow1 = LastUsedRow(xlssheet1); 
int lastRow2 = LastUsedRow(xlssheet2); 
int curRow = lastRow2 + 1; 
for (int i = 1; i <= lastRow1; i++) 
{ 
    object toCopy = xlsheet1.getRange("A"+i, "D" + i).get_Value(null); 
    xlsheet2.getRange("A"+curRow, "D" + curRow).set_Value(null, toCopy); 
    curRow++; 
} 
xlwb.Save();     
+0

@Baruchelli: Привет, Это хорошо работает. Всего одно обновление, нам нужно увеличить curRow на 1. Осталось только одно значение, которое будет скопировано на sheet2. Внутри для цикла: if (i> 1) curRow = curRow + 1 ;. Большое спасибо за ваше решение. – sachin

+0

Конечно, вы правы. Я исправил ответ. благодаря –

0

Если вы не можете найти способ «Переместить» данные, переместить его вручную:

  1. Скопируйте значения над
  2. Убедитесь, что копии работали
  3. сделать оригинальную клетку заготовки
  4. Сохранить
+0

Я не могу двигаться вручную. Потому что он может содержать много строк и ежедневную задачу – sachin

+0

Пошел я сказал «Вручную», я действительно имел в виду программно. Как и в случае, если вы не можете найти функцию «Переместить», просто скопируйте + сделайте исходные ячейки пробелов (через код). Это будет иметь тот же эффект. В вашем первоначальном вопросе говорилось: «Я могу писать ячейки, но как их перемещать» - также обратите внимание, что выбранный вами ответ фактически не переносит значения, он копирует их. – Joe

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