Подтвердить что ты не робот

Изменение обратного цвета ячейки Excel с использованием шестнадцатеричного результата в Excel, отображающем совершенно другой цвет в электронной таблице

Итак, я устанавливаю цвет внутренней части ячейки Excel в определенное значение, например ниже:

worksheet.Cells[1, 1].Interior.Color = 0xF1DCDB;

Однако, когда я открываю электронную таблицу в Excel, я вижу, что цвет, который вышел, полностью отличается (в приведенном выше случае цвет в полученной таблице равен 0xDCDCEF). Я попробовал несколько разных цветов, и он всегда меняет его, и я не вижу шаблона.

Есть ли причина для этого? Я даже попытался установить цвет, написав Color.FromArgb(241, 220, 219).ToArgb(), и произошло то же самое.

4b9b3361

Ответ 1

Я, наконец, понял это после множества тестов, и это было действительно просто. По-видимому, библиотека Excel Interop имеет ошибку и изменяет значения красного и синего, поэтому вместо передачи шестнадцатеричного RGB мне нужно передать BGR, и внезапно цвета работают просто отлично. Я поражен тем, что эта ошибка не документирована нигде в Интернете.

Поэтому, если кто-либо еще сталкивается с этой проблемой, просто передайте значения Excel в значениях BGR. (Или, если вы используете Color.FromArgb(), пройдите в Color.FromArgb(B, G, R))

Ответ 2

Вам нужно преобразовать цвет из шестнадцатеричной в цветовую систему Excel следующим образом:

ColorConverter cc = new ColorConverter();
worksheet.Cells[1, 1].Interior.Color = ColorTranslator.ToOle((Color)cc.ConvertFromString("#F1DCDB"));

Это не ошибка, так как система цветов Excel всегда была такой. Это еще одна вещь, которая заставляет С# - Excel взаимодействовать с болью.

Ответ 3

Обратите внимание, что это не ошибка! Красный начинается с нижнего бита, а зеленый - посередине, а синий принимает самые высокие бит

B G R
00000000 00000000 00000000

Расчет: (65536 * Синий) + (256 * Зеленый) + (Красный)

Спасибо.

Ответ 4

Попробуйте worksheet.cells(1,1).interior.color = rgb(241, 220, 219).

РЕДАКТИРОВАТЬ Я тупой, просто заметил, что вы не используете VBA 8). Это немного длиннее, но можете ли вы попробовать отправить его в виде десятичного числа? Для чего это стоит,... interior.color = & HF1DCDB работает в VBA, как и = 15850715.

Ответ 5

Это справочная информация, которая может объяснить ответы.

Если с HTML вы указываете цвет # FF9900, вы получите то, что Excel вызывает Light orange. Если вы укажете цвет # 003366, вы получите то, что Excel вызывает Dark Teal. Но если вам нужен светло-оранжевый или тёмный тиал с vba, вы должны указать & H0099FF и H663300.

То есть, хотя функция vba - это RGB (& Hrr, & Hgg, & Hbb), число, которое он генерирует, является & Hbbggrr, потому что это то, что хочет движок отображения Excel.

Я бы предположил, что человек, который закодировал Excel Interop, не знал, что Excel использует нестандартные номера для указания цветов.

Ответ 6

Цвет RGB может быть проанализирован из строки HTML hex:

Color colour = ColorTranslator.FromHtml("#E7EFF2");

Если у вас есть отдельное альфа-значение, вы можете применить это (docs):

Color colour = ColorTranslator.FromHtml("#E7EFF2");
Color transparent = Color.FromArgb(128, colour);

Ответ 7

Просто хочу опубликовать мой код. Поскольку для меня не было экземпляра copy & paste. На основе кода Sandesh:

private void ColorMe(Color thisColor){
rng = xlApp.ActiveCell;
Color mycolour = ColorTranslator.FromHtml("#" + thisColor.Name.Substring(2, 6));
rng.Interior.Color = Color.FromArgb(mycolour.R, mycolour.G, mycolour.B);
}