Задать вопрос
  • Как в c# экспортировать данные в Excel?

    Zerpico
    @Zerpico
    Давно где-то на просторах интернета нашел самописный класс для работы с Excel. До сих пор им пользуюсь и меня устраивает.
    Ссылка

    Вот например как

    //создаем экземпляр
    MSO.Excel.Excel ex = new MSO.Excel.Excel();
    
    try
    {
    //проверяем есть ли файл
        if (System.IO.File.Exists(AppDomain.CurrentDomain.BaseDirectory + "Reports\\Naklad.xltx"))
        {
            ex.OpenBook(AppDomain.CurrentDomain.BaseDirectory + "Reports\\Naklad.xltx");
    
            //пишем значения
            ex.SetValue("A1", "Значение1");
            ex.SetValue("A2", "Значение1");
    
            ex.Visible = true;  //показываем сам Excel
            ex.Dispose(); //закрываемся
        }
    }
    catch(Exception) {   }
    Ответ написан
    Комментировать
  • Как реализовать сохранение пароля в приложении на C#?

    Zerpico
    @Zerpico
    Я пользуюсь SHA1, не самый безопасный конечно но у меня тут и не ФСБ всё таки.
    вот 2 метода для шифровки и дешифровки:
    //шифрование
    public static string Encrypt(string plainText, string password,
           string salt = "Kosher", string hashAlgorithm = "SHA1",
           int passwordIterations = 2, string initialVector = "OFRna73m*aze01xY",
           int keySize = 256)
    {
        if (string.IsNullOrEmpty(plainText))
    		return "";
     
        byte[] initialVectorBytes = Encoding.ASCII.GetBytes(initialVector);
        byte[] saltValueBytes = Encoding.ASCII.GetBytes(salt);
        byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);
     
        PasswordDeriveBytes derivedPassword = new PasswordDeriveBytes(password, saltValueBytes, hashAlgorithm, passwordIterations);
        byte[] keyBytes = derivedPassword.GetBytes(keySize / 8);
        RijndaelManaged symmetricKey = new RijndaelManaged();
        symmetricKey.Mode = CipherMode.CBC;
     
        byte[] cipherTextBytes = null;
     
        using (ICryptoTransform encryptor = symmetricKey.CreateEncryptor(keyBytes, initialVectorBytes))
        {
            using (MemoryStream memStream = new MemoryStream())
            {
                using (CryptoStream cryptoStream = new CryptoStream(memStream, encryptor, CryptoStreamMode.Write))
                {
                    cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);
                    cryptoStream.FlushFinalBlock();
                    cipherTextBytes = memStream.ToArray();
                    memStream.Close();
                    cryptoStream.Close();
                }
            }
        }
     
         symmetricKey.Clear();
           return Convert.ToBase64String(cipherTextBytes);
    }
     
     
     
    //дешифрование
    public static string Decrypt(string cipherText, string password,
           string salt = "Kosher", string hashAlgorithm = "SHA1",
           int passwordIterations = 2, string initialVector = "OFRna73m*aze01xY",
           int keySize = 256)
    {         
        if (string.IsNullOrEmpty(cipherText))
            return "";
     
        byte[] initialVectorBytes = Encoding.ASCII.GetBytes(initialVector);
        byte[] saltValueBytes = Encoding.ASCII.GetBytes(salt);
        byte[] cipherTextBytes = Convert.FromBase64String(cipherText);
     
        PasswordDeriveBytes derivedPassword = new PasswordDeriveBytes(password, saltValueBytes, hashAlgorithm, passwordIterations);
        byte[] keyBytes = derivedPassword.GetBytes(keySize / 8);
     
        RijndaelManaged symmetricKey = new RijndaelManaged();
        symmetricKey.Mode = CipherMode.CBC;
     
        byte[] plainTextBytes = new byte[cipherTextBytes.Length];
        int byteCount = 0;
     
        using (ICryptoTransform decryptor = symmetricKey.CreateDecryptor(keyBytes, initialVectorBytes))
        {
            using (MemoryStream memStream = new MemoryStream(cipherTextBytes))
            {
               using (CryptoStream cryptoStream = new CryptoStream(memStream, decryptor, CryptoStreamMode.Read))
               {
                   byteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length);
                   memStream.Close();
                   cryptoStream.Close();
               }
            }
        }
     
        symmetricKey.Clear();
        return Encoding.UTF8.GetString(plainTextBytes, 0, byteCount);
    }


    Ну пользоваться просто:
    Encrypt(text, password); //где text — текст который необходимо зашифровать,password — пароль для шифровки
    Decrypt(text, password); //аналогично
     
    . . .
    // UPD1: можно воспользоваться и более сложной схемой включая размер ключа и байт
    Encrypt(text, password1, password2, «SHA1», 2,«16CHARSLONG12345», 256);
    Decrypt(text, password1, password2, «SHA1», 2,«16CHARSLONG12345», 256);
    Ответ написан
    1 комментарий
  • Как заполннить ComboBox из базы справочника и выбрать по-умолчанию тот что записан?

    Zerpico
    @Zerpico Автор вопроса
    Сам разобрался.
    Добавил в класс поле ArrayList categoryMetal.
    заполняю его при получении данных, затем биньдю его
    <mys:DataGridTemplateColumn x:Name="catMetalColumns" Header="Категория металла">
                                    <mys:DataGridTemplateColumn.CellTemplate>
                                        <DataTemplate>
                                            <ComboBox x:Name="catMetalDictColumn" ItemsSource="{Binding metalCategory}" SelectedIndex="{Binding catMetal}" />
                                        </DataTemplate>
                                    </mys:DataGridTemplateColumn.CellTemplate>
                                </mys:DataGridTemplateColumn>
    Ответ написан
    Комментировать
  • Уроки по применению ADO.NET в WPF

    Zerpico
    @Zerpico Автор вопроса
    В конечном счете я решил что WPF делали для издевательства и зарабатывания денег. Никакой полезной и удобной функции он больше не несет.
    Ответ написан
    Комментировать
  • Diablo 3 API

    Zerpico
    @Zerpico Автор вопроса
    Вообще сильно углубившись, я потом нашел эти мелочи случайно на корейском форуме близзард. А суть такова:
    возьму для примера первого попавшегося пользователя с именем Ozzy#2223 (надеюсь ты тут не сидишь). Чтобы получить данные по его профилю смотрим здесь (в имени профиля необходимо заменить знак # на тире — ) eu.battle.net/api/d3/profile/Ozzy-2223/ , всё замечательно но описание способностей на английском, чтобы посмотреть на русском добавляем - ?locale=ru_ru, получается eu.battle.net/api/d3/profile/Ozzy-2223/?locale=ru_ru.
    А как быть тех кто с русскими именами например тоже случайный человек Ипостась#2474, пробуем — eu.battle.net/api/d3/profile/Ипостась-2474/. Нам возвращают — OOPS. И даже если добавить ?locale=ru_ru, тоже ничего не вернет. Ответ мне подсказали на форуме battle.net указывая ссылку на корейский форум, всё гораздо проще необходимо добавить в конце index и оно будет отображаться на языке которого написан профиль. Получаем — eu.battle.net/api/d3/profile/Ипостась-2474/index
    Да всё замечательно и всё работает. Но почему этого нет в документации? Зачем так всё усложнять?
    Тем не менее я на скорую руку накидал тут программу для просмотра профиля по Диабло 3 —
    image
    Ответ написан
    1 комментарий