2016-11-29 4 views
0

У меня возникла проблема с импортом рабочих листов Excel в сводную рабочую книгу.использовать объекты Excel (рабочий лист, рабочие книги ...) в классах/объектах

Сначала я пытаюсь импортировать данные как DataTable, используя:

`Dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); 

      tableName = GetTableNames(Dt); 

      com = new OleDbDataAdapter(SqlQuery(tableName[0]), conn); 

      com.Fill(DtSet); 

      Dt = DtSet.Tables[0];` 

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

private static void ImportData(DataTable source, string p) 
    { 
     int pos = Globals.ThisWorkbook.Sheets.Count; 
     object lastSheet = Globals.ThisWorkbook.Sheets.get_Item(pos); 
     Globals.ThisWorkbook.Sheets.Add(Type.Missing, lastSheet, Type.Missing, Type.Missing); 
     Excel.Worksheet ws = (Excel.Worksheet)Globals.ThisWorkbook.ActiveSheet; 
     ws.Name = p; 
     // column headings 
     for (var i = 0; i < source.Columns.Count; i++) 
     { 
      ws.Cells[1, i + 1] = source.Columns[i].ColumnName; 
     } 

     // rows 
     for (var i = 0; i < source.Rows.Count; i++) 
     { 
      // to do: format datetime values before printing 
      for (var j = 0; j < source.Columns.Count; j++) 
      { 
       ws.Cells[i + 2, j + 1] = source.Rows[i][j]; 
      } 
     } 
    } 

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

 public Excel.Worksheet GetWorksheet(string path) 
    { 
     Excel.Application vApp = new Excel.Application(); 
     Excel.Workbook vBook = vApp.Workbooks.Open(path); 
     Excel.Worksheet ws = vBook.Sheets.get_Item(1); 
     vBook.Close(); 
     vApp.Quit(); 
     return ws; 
    } 

, кажется, работает также хорошо, пока я не пытаюсь скопировать этот лист в активной книге:

 private static void ImportData(Excel.Worksheet source, string p) 
    { 
     int pos = Globals.ThisWorkbook.Sheets.Count; 
     source.Copy(Globals.ThisWorkbook.Worksheets[pos]);    
    } 

это должно скопировать источник в последнюю позицию в Globals.ThisWorkbook ... но все, что я получил это COMException

Теперь у меня заканчиваются идеи, как это исправить. Надеюсь, вы сможете помочь.

Mirko

ответ

0

благодаря парню отправил это здесь: StackOverflow

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

  Excel.Application destApp = Globals.ThisWorkbook.Application; 
      Excel.Workbook destWB = destApp.Workbooks[1]; 
      Excel.Workbook sourceWB = destApp.Workbooks.Open(d.Path); 
      int pos = Globals.ThisWorkbook.Sheets.Count; 
      Excel.Worksheet destWS = ((Excel.Worksheet)destWB.Worksheets[pos]); 
      Excel.Worksheet sourceWS = ((Excel.Worksheet)sourceWB.Worksheets[1]); 
      sourceWS.Name = d.Name; 
      sourceWB.Save(); 
      sourceWS.Copy(destWS); 
      sourceWB.Close(); 

Вот и все и довольно быстро.

1

Предлагаю не использовать COM-объекты. Попробуйте OpenXML и ClosedXML для динамического создания Excel-листов.

[http://www.c-sharpcorner.com/article/closed-xml-to-read-excel-files-in-asp-net-c-sharp/]

Надеется, что это помогает!

+0

Thansk для вашего комментария, проблема в использовании внешних библиотек или программного обеспечения не разрешена в моей компании до утверждения. Программное обеспечение должно быть завершено в течение двух дней, принятие решения длится долго. :-) – Mirko

+1

Да, я могу понять. Вы используете Microsoft.Interop.Excel? Я тоже это использовал. Наш продукт был размещен на облачном сервере, приобретенном клиентом. Мы не смогли убедить нашего клиента установить пакет Microsoft Office Primary Interop Assembly на сервере. Поэтому я использовал openXML и ClosedXML, что абсолютно бесплатно. Эффективность также была отличной с эффективным кодом. –

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