2011-08-10 9 views
11

Muszę utworzyć aplikację konsolową, która eksportuje zestaw danych do programu Excel. Próbowałem googlować i przeglądać posty na ten temat, ale tak naprawdę nie znalazłem tego, czego szukam. Problem polega na tym, że nie powinien pojawić się okno zapisu, powinien automatycznie utworzyć plik Excel. Do tej pory mam następujący kod, ale nie wiem jak to zrobić automatycznie. Doceniam każdą pomoc.Excel interop: zapisywanie skoroszytu bez pokazywania okna dialogowego zapisu

public static void CreateWorkbook(DataSet ds, String path) 
    { 
     int rowindex = 0; 
     int columnindex = 0; 

     Microsoft.Office.Interop.Excel.Application wapp = new Microsoft.Office.Interop.Excel.Application(); 
     Microsoft.Office.Interop.Excel.Worksheet wsheet; 
     Microsoft.Office.Interop.Excel.Workbook wbook; 

     wapp.Visible = false; 

     wbook = wapp.Workbooks.Add(true); 
     wsheet = (Worksheet)wbook.ActiveSheet; 

     try 
     { 
      for (int i = 0; i < ds.Tables[0].Columns.Count; i++) 
      { 
       wsheet.Cells[1, i + 1] = ds.Tables[0].Columns[i].ColumnName; 

      } 

      foreach (DataRow row in ds.Tables[0].Rows) 
      { 
       rowindex++; 
       columnindex = 0; 
       foreach (DataColumn col in ds.Tables[0].Columns) 
       { 
        columnindex++; 
        wsheet.Cells[rowindex + 1, columnindex] = row[col.ColumnName]; 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      String err = ex.Message; 
     } 
     wapp.UserControl = true; 
    } 

Odpowiedz

24

wszystkie argumenty do WorkBook.SaveAs() są opcjonalne, ale można po prostu użyć Type.Missing dla większości z nich, jeśli chcesz.

Typowa rozmowa będzie wyglądać następująco:

wbook.SaveAs("c:\\temp\\blah", Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookDefault, Type.Missing, Type.Missing, 
      false, false, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, 
      Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); 
wbook.Close(); 

pamiętać, że nie zawiera rozszerzenia pliku, Excel będzie ustawiona, że ​​dla ciebie.

http://msdn.microsoft.com/en-us/library/microsoft.office.tools.excel.workbook.saveas(v=VS.100).aspx opisuje każdy z argumentów.

+0

dzięki Charles, to zadziałało :) – ha1ogen

5

Spróbuj wywołać metodę ze skoroszytu SaveAs. W przypadku wielu parametrów spróbuj przekazać Type.Missing do wszystkich parametrów oprócz pierwszej (nazwy pliku).

+0

ya próbowałem tego, ale to trwa tak wiele: parametry void SaveAs (object pliku, obiekt fileformat, obiekt hasło, obiekt WriteResPassword, obiekt ReadOnlyRecommended, obiekt CreateBackup, XlSaveAsAccessMode AccessMode, obiekt ConflictResolution, obiekt AddToMru, obiekt TextCodepage, obiekt TextVisualLayout , obiekt Local); że nie wiem jak go używać ... – ha1ogen

+0

Myślę, że tylko pierwsze dwa są obowiązkowe, wszystkie inne mogą być używane jako brakujące parametry. –

+0

, więc czym byłaby "nazwa pliku obiektu"? czy możesz dać mi przykład – ha1ogen

2

Użyj open xml sdk do generowania dokumentów zamiast automatyzacji; jest o wiele bardziej niezawodny.

+0

czy mógłbyś podać więcej szczegółów na odpowiedź i rozwiązanie –

2
wapp.DisplayAlerts = false; 

ustawienie Application.DisplayAlerts właściwość false przestanie wyświetlać wszystkie alerty dla wszystkich swoich skoroszytów.

2

Użyj właściwości DisplayAlerts. Jest bardzo prosty i szybki.

private void SaveAs(Excel.Workbook WorkBook, string FileName) 
    { 
     m_Saving = true; 
     try 
     { 
      if (Global.CreatingCopy) 
       this.ExcelApp.DisplayAlerts = false; 

      WorkBook.SaveAs(FileName); 
     } 
     finally 
     { 
      m_Saving = false; 
      if (this.ExcelApp.DisplayAlerts == false) 
       this.ExcelApp.DisplayAlerts = true; 
     } 
    } 

Nigdy nie pozwól, aby program Excel określał rodzaj pliku, gdy zamierzasz zapisać plik. Ponieważ możliwe jest, że format zostanie zmieniony.

Jeśli oryginalny dokument był .xls, a bieżący użytkownik ma biuro 2013, domyślny format to .xlsx, a następnie Excel przekonwertuje plik na .xlsx, a użytkownicy nie będą mieć programu Excel 2010 lub lepszego pliku cant. .

4
m_xlApp.DisplayAlerts = false; 

// Quit Excel and clean up. 
m_xlWorkbook.SaveAs(Filename: m_xlFilePath, FileFormat: excelFileExtension, 
Password: false, ReadOnlyRecommended: XlSaveAsAccessMode.xlNoChange, 
ConflictResolution: XlSaveConflictResolution.xlLocalSessionChanges); 

m_xlWorkbook.Close(); 

Dodaj Konfliktów do XlSaveConflictResolution.xlLocalSessionChanges

i ustawić właściwość DisplayAlerts aplikacji false więc okno nie pokaże.

zobacz https://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.xlsaveconflictresolution.aspx, aby uzyskać więcej informacji.