2013-04-25 31 views
6

Potrzebuję załadować plik Excel i napisać na nim. Dodałem już plik do zasobów i ustawię działanie kompilacji na Embedded Resource. Mój problem polega na tym, że nie mogę załadować go z zasobów/zestawu. Obecnie mam ten kod:Załaduj plik Excel z zasobów/złożenia w C#

Assembly assembly = Assembly.GetExecutingAssembly(); 
     Assembly asm = Assembly.GetExecutingAssembly(); 
     string file = string.Format("{0}.UTReportTemplate.xls", asm.GetName().Name); 
     var ms = new MemoryStream(); 
     Stream fileStream = asm.GetManifestResourceStream(file); 

     xlWorkBook = xlApp.Workbooks.Open(file); 
     if (xlApp == null) 
     { 
      MessageBox.Show("Error: Unable to create Excel file."); 
      return; 
     } 
     xlApp.Visible = false; 

Co robię źle? Jak mogę uzyskać dostęp do pliku? Każda pomoc będzie doceniona. Dzięki.

+0

Nie używasz filestream .... Nie można otworzyć (plik), gdzie plik jest nazwą zasobu wbudowanego ... –

+0

Jak powinienem to zrobić? Jestem na to nowy i obecnie nie mam pojęcia, jak postępować. Próbowałem przeczytać o tym w: http: //support.microsoft.com/kb/319292. Ale trudno mi zrozumieć, jak ... – jaqui

+0

zapisać strumień plików do lokalizacji, a następnie załaduj go! –

Odpowiedz

13
Assembly asm = Assembly.GetExecutingAssembly(); 
string file = string.Format("{0}.UTReportTemplate.xls", asm.GetName().Name); 
Stream fileStream = asm.GetManifestResourceStream(file); 
SaveStreamToFile(@"c:\Temp\Temp.xls",fileStream); //<--here is where to save to disk 
Excel.Application xlApp = new Excel.Application(); 
xlWorkBook = xlApp.Workbooks.Open(@"c:\Temp\Temp.xls"); 
if (xlWorkBook == null) 
{ 
    MessageBox.Show("Error: Unable to open Excel file."); 
    return; 
} 
xlApp.Visible = false; 

...

public void SaveStreamToFile(string fileFullPath, Stream stream) 
{ 
    if (stream.Length == 0) return; 

    // Create a FileStream object to write a stream to a file 
    using (FileStream fileStream = System.IO.File.Create(fileFullPath, (int)stream.Length)) 
    { 
     // Fill the bytes[] array with the stream data 
     byte[] bytesInStream = new byte[stream.Length]; 
     stream.Read(bytesInStream, 0, (int)bytesInStream.Length); 

     // Use FileStream object to write to the specified file 
     fileStream.Write(bytesInStream, 0, bytesInStream.Length); 
    } 
} 
+0

Dzięki! To działało dobrze. – jaqui

+0

Twoje powitanie, obok odpowiedzi znajduje się pole wyboru. Zaznaczenie go daje ci kilka punktów i pozwala, aby wszyscy wiedzieli, że twój problem został rozwiązany. Powodzenia! –

0
//save resource to disk 
string strPathToResource = @"c:\UTReportTemplate.xls"; 
using (FileStream cFileStream = new FileStream(strPathToResource, FileMode.Create)) 
{ 
      cFileStream.Write(Resources.UTReportTemplate, 0, Resources.UTReportTemplate.Length); 
} 

//open workbook 
Excel.Application xlApp = new Excel.Application(); 
xlWorkBook = xlApp.Workbooks.Open(strPathToResource); 
if (xlWorkBook == null) 
{ 
    MessageBox.Show("Error: Unable to open Excel file."); 
    return; 
} 
xlApp.Visible = false; 
+1

Czy mógłbyś wyjaśnić swoją odpowiedź? – jaibatrik

+0

zapisywanie pliku (UTReportTemplate) z zasobów na dysk – Sergey1380528

1

Chciałbym dodać mój tutaj fragment kodu, który działa dobrze w Visual Studio 2015 (tylko poprawiła Jeremy Thompson „s answer.)

(Nie zapomnij ustawić właściwości zasobu pliku Excel Build Action do Embedded Resource w oknie właściwości.)

public void launchExcel() 
{ 
    String resourceName = "Sample.xls"; 
    String path = System.Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); 


    Assembly asm = Assembly.GetExecutingAssembly(); 
    string res = string.Format("{0}.Resources." + resourceName, asm.GetName().Name); 
    Stream stream = asm.GetManifestResourceStream(res); 
    try 
    { 
     using (Stream file = File.Create(path + @"\" + resourceName)) 
     { 
      CopyStream(stream, file); 
     } 
     Process.Start(path + @"\" + resourceName); 
    }catch (IOException ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
} 

public void CopyStream(Stream input, Stream output) 
{ 
    byte[] buffer = new byte[8 * 1024]; 
    int len; 
    while ((len = input.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     output.Write(buffer, 0, len); 
    } 
} 

Mam nadzieję, że pomoże ci to z twoimi problemami.

Pozdrawiamy.