Загрузка файла excel из ресурсов / сборки в C#
Мне нужно загрузить файл Excel и написать на нем. Я уже добавил файл в resources и установил его действие сборки для Embedded Resource. Моя проблема в том, что я не могу загрузить его из ресурсов/сборки. В настоящее время у меня есть этот код:
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;
что я делаю не так? Как получить доступ к файлу? Любая помощь будет оценена. Спасибо.
3 ответов
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);
}
}
Я хотел бы добавить здесь фрагмент кода, который хорошо работает в Visual Studio 2015. (Просто улучшено Джереми Томпсон ' s ответ.)
(не забудьте установить файловый ресурс Excel Build Action
свойство Embedded Resource
в окне свойств.)
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);
}
}
надеюсь, это поможет вам с вашей проблемой.
С наилучшими пожеланиями.
//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;