Изменение заднего цвета ячейки Excel с использованием шестнадцатеричных результатов в Excel, отображающего совершенно другой цвет в электронной таблице - PullRequest
11 голосов
/ 15 сентября 2011

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

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

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

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

Ответы [ 7 ]

17 голосов
/ 15 сентября 2011

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

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

7 голосов
/ 15 сентября 2011

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

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

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

2 голосов
/ 02 февраля 2012

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

B G R
00000000 00000000 00000000

Расчет: (65536 * синий) + (256 * зеленый) + (красный)

Спасибо.

1 голос
/ 19 октября 2016

Просто хотел опубликовать мой код тоже.Так как для меня не было решения для копирования и вставки.На основе кода Сандеша:

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);
}
1 голос
/ 19 сентября 2014

Только RGB-цвет можно проанализировать из строки HTML hex:

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

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

Color colour = ColorTranslator.FromHtml("#E7EFF2");
Color transparent = Color.FromArgb(128, colour);
1 голос
/ 12 ноября 2011

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

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

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

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

1 голос
/ 15 сентября 2011

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

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

...