none
Как внедрить Excel в resx файл RRS feed

  • Вопрос

  • Добрый день!

    Как можно внедрить Excel файл в Resx файл? до Visual C# я работал в Delphi7  , там спокойно можно было внедрить любой файл , а Visual C# только рисунки!

    зарание СПС!

    • Перемещено Tagore Bandlamudi 1 октября 2010 г. 21:08 MSDN Forums consolidation (От:Visual C#)
    21 сентября 2010 г. 9:00

Ответы

  • Долго писать, но ладно

    К примеру создал ты приложение TestResx, хочешь добавить в него произвольные ресурсы.

    1 способ без Resx файла

    Просто добаляешь файл в проект, допустим файл называется book.xlsx , щелкаешь на него в Solution Explorer, выбираешь Properties, на вкладке свойств выставляешь Build Action в Embedded Resource. Всё, он будет внедряться в твой экзешник как двоичные данные. Для чтения его во время выполнения делаешь так

       //Получить ссылку на выполняющуюся сборку
       Assembly currentAssembly = Assembly.GetExecutingAssembly();
       //Получить поток ресурса из сборки по имени ресурса
       Stream stream = currentAssembly.GetManifestResourceStream("TestResx.book.xlsx");
       //Читаем поток в массив байтов
       byte[] bytes = new byte[stream.Length];
       stream.Read(bytes, 0, bytes.Length);
       stream.Close();
    
       Console.WriteLine("Length of data: " + bytes.Length);
    
       //Записываем массив байтов на диск, аки файл
       using (FileStream fs = new FileStream(@"c:\book.xlsx", FileMode.Create, FileAccess.Write))
       {
        fs.Write(bytes, 0, bytes.Length);
        fs.Close();
       }
    

    2 способ с помощью resx-файла

    Добавляем к проекту файл resx, назовем его Res.resx. В дизайнере этого файла, добавляем любые ресурсы.(например файл book.xlsx) Для считывания во время выполнения используем такой код

       ResourceManager manager = new ResourceManager("TestResx.Res", Assembly.GetExecutingAssembly());
       var bbytes = (byte[])manager.GetObject("book");
    
       FileStream ffs = new FileStream("book.xlsx", FileMode.Create, FileAccess.Write);
       ffs.Write(bbytes, 0, bbytes.Length);
       ffs.Close();
    

    В обоих методах нужно знать базовые имена ресурсов. Чтобы получить базовые имена ресурсов в данной сборки используй такой код

    string[] resourceNames = Assembly.GetExecutingAssembly().GetManifestResourceNames();
    

    Это что касается встраивания в текущую выполняемую сборку.

    По нормальному надо для ресурсво создавать отдельные сборки, так называемые satellite assemblies, но там не обойтись без использования утилит командной строки resgen.exe и al.exe

    • Помечено в качестве ответа Jualy 23 сентября 2010 г. 8:13
    22 сентября 2010 г. 13:24
  • Добавляется просто как бинарные данные.

    В Visual Studio в дизайнере resx-файла щелкаете Add Resource => Add Existing File

    Считываете потом как массив байтов

       ResourceManager manager = new ResourceManager("Resource1", Assembly.LoadFrom(@"Resource1.dll"));
       var bytes = (byte[])manager.GetObject("Book1");
       
       FileStream fs = new FileStream("book.xlsx", FileMode.Create, FileAccess.Write);
       fs.Write(bytes, 0, bytes.Length);
       fs.Close();
    
    • Помечено в качестве ответа I.Vorontsov 22 сентября 2010 г. 5:33
    21 сентября 2010 г. 16:28

Все ответы

  • Добавляется просто как бинарные данные.

    В Visual Studio в дизайнере resx-файла щелкаете Add Resource => Add Existing File

    Считываете потом как массив байтов

       ResourceManager manager = new ResourceManager("Resource1", Assembly.LoadFrom(@"Resource1.dll"));
       var bytes = (byte[])manager.GetObject("Book1");
       
       FileStream fs = new FileStream("book.xlsx", FileMode.Create, FileAccess.Write);
       fs.Write(bytes, 0, bytes.Length);
       fs.Close();
    
    • Помечено в качестве ответа I.Vorontsov 22 сентября 2010 г. 5:33
    21 сентября 2010 г. 16:28
  • Вы можете написать полный код? я в не понятке откуда что взялся!

    22 сентября 2010 г. 11:28
  • Долго писать, но ладно

    К примеру создал ты приложение TestResx, хочешь добавить в него произвольные ресурсы.

    1 способ без Resx файла

    Просто добаляешь файл в проект, допустим файл называется book.xlsx , щелкаешь на него в Solution Explorer, выбираешь Properties, на вкладке свойств выставляешь Build Action в Embedded Resource. Всё, он будет внедряться в твой экзешник как двоичные данные. Для чтения его во время выполнения делаешь так

       //Получить ссылку на выполняющуюся сборку
       Assembly currentAssembly = Assembly.GetExecutingAssembly();
       //Получить поток ресурса из сборки по имени ресурса
       Stream stream = currentAssembly.GetManifestResourceStream("TestResx.book.xlsx");
       //Читаем поток в массив байтов
       byte[] bytes = new byte[stream.Length];
       stream.Read(bytes, 0, bytes.Length);
       stream.Close();
    
       Console.WriteLine("Length of data: " + bytes.Length);
    
       //Записываем массив байтов на диск, аки файл
       using (FileStream fs = new FileStream(@"c:\book.xlsx", FileMode.Create, FileAccess.Write))
       {
        fs.Write(bytes, 0, bytes.Length);
        fs.Close();
       }
    

    2 способ с помощью resx-файла

    Добавляем к проекту файл resx, назовем его Res.resx. В дизайнере этого файла, добавляем любые ресурсы.(например файл book.xlsx) Для считывания во время выполнения используем такой код

       ResourceManager manager = new ResourceManager("TestResx.Res", Assembly.GetExecutingAssembly());
       var bbytes = (byte[])manager.GetObject("book");
    
       FileStream ffs = new FileStream("book.xlsx", FileMode.Create, FileAccess.Write);
       ffs.Write(bbytes, 0, bbytes.Length);
       ffs.Close();
    

    В обоих методах нужно знать базовые имена ресурсов. Чтобы получить базовые имена ресурсов в данной сборки используй такой код

    string[] resourceNames = Assembly.GetExecutingAssembly().GetManifestResourceNames();
    

    Это что касается встраивания в текущую выполняемую сборку.

    По нормальному надо для ресурсво создавать отдельные сборки, так называемые satellite assemblies, но там не обойтись без использования утилит командной строки resgen.exe и al.exe

    • Помечено в качестве ответа Jualy 23 сентября 2010 г. 8:13
    22 сентября 2010 г. 13:24
  • Большое СПС! все получилось!

    23 сентября 2010 г. 9:02