2014-06-05 4 views
0

Я использую xlsLib для создания электронной таблицы Excel из данных, находящихся в проприетарном формате. Данные содержат информацию RGB для окраски определенных ячеек, и я хочу, чтобы полученный файл Excel отражал эти пользовательские цвета.Как использовать пользовательские цвета с помощью xlslib

xlsLib обеспечивает способ установить цвет ячейки, как это:

myCell->fillfgcolor(color_name_t); 

и отлично работает для стандартных цветов, определенных в color_name_t. Но как мне сказать, чтобы использовать мои пользовательские цвета вместо предопределенных?

Похоже, что я могу создавать собственные цвета с:

myWorkbook->setColor(r, g, b, idx); 

где IDX является значением от 8 до 64. Он появляется SetColor() тайники этого пользовательского цвета в массив палитры для последующего использования, а затем cell::fillfgcolor(), похоже, не использует эту палитру.

Что мне следует звонить вместо fillfgcolor(), чтобы установить цвет ячейки с помощью моей пользовательской палитры?

ответ

0

Вы можете установить собственный цвет, используя шестнадцатеричное значение и следующий метод, чтобы преобразовать значение шестнадцатеричного цвета в значение RGB и передать его в setupNewColors DHWorkBook, и для этого вам необходимо использовать SDK DHxlsIOS. Для этого я создал один общий метод, в котором я передаю объект DHWorkBook, DHCell, colourID и hex colorstring, например EFEFEF, CACACA. Вы можете передать любое число от 9 до 63 в качестве идентификатора цвета, идентификатор которого для цвета, который вы можете проверить в файле color.h. И тогда вам нужно установить цвет RGB с помощью setupNewColors и заполнить ячейку, используя fillBGcolorUnsigned of DHCell, который я создал для передачи объекта unsigned8_t.

-(void)customColor:(DHWorkBook *)workbook cell:(DHCell *)cell customColorId:(unsigned int)customColorId hexString:(NSString *)hexString 
{ 
unsigned int components[3]; 
[self rgbFromHexString:hexString 
        rgb:components]; 
[workbook setupNewColors:customColorId 
        red:components[0] 
        green:components[1] 
        blue:components[2]]; 
[cell fillBGcolorUnsigned:customColorId]; 
} 

Я использую ниже метод другого метода, чтобы получить значение RGB из шестнадцатеричной строки. Вам не нужно использовать префикс типа «#» или «0X», потому что они уже усечены в этом методе для преобразования в RGB.

-(void)rgbFromHexString:(NSString*)hex rgb:(unsigned int [3])components // New 
{ 
NSString *cString = [[hex stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] uppercaseString]; 

// String should be 6 or 8 characters 
if ([cString length] < 6) 
{ 
    // Gray color 
    components[0] = 128; // r 
    components[1] = 128; // g 
    components[2] = 128; // b 
} 

// Truncate 0X if it appears 
if ([cString hasPrefix:@"0X"]) cString = [cString substringFromIndex:2]; 
if ([cString hasPrefix:@"#"]) cString = [cString substringFromIndex:1]; 

if ([cString length] != 6) 
{ 
    // Gray color 
    components[0] = 128; // r 
    components[1] = 128; // g 
    components[2] = 128; // b 
} 

// Separate into r, g, b substrings 
NSRange range; 
range.location = 0; 
range.length = 2; 
NSString *rString = [cString substringWithRange:range]; 

range.location = 2; 
NSString *gString = [cString substringWithRange:range]; 

range.location = 4; 
NSString *bString = [cString substringWithRange:range]; 

// Scan values 
unsigned int r = 0, g = 0, b = 0; 

[[NSScanner scannerWithString:rString] scanHexInt:&r]; 
[[NSScanner scannerWithString:gString] scanHexInt:&g]; 
[[NSScanner scannerWithString:bString] scanHexInt:&b]; 

components[0] = r; 
components[1] = g; 
components[2] = b; 
NSLog(@"r - %u g - %u b - %u",components[0],components[1],components[2]); 
} 

Я также создал два пользовательских методов в DHCell & cell.cpp пройти unsigned8_t вместо color_name_t.

-(void)fillBGcolorUnsigned:(unsigned8_t)color 
{ 
    CELL(aCell)->fillbgcolor(color); 
} 

void cell_t::fillbgcolor(unsigned8_t color) 
{ 
xf_t * tempXF = xf_t::xfDup(pxf); 

tempXF->SetFillBGColor(color); 

pxf->UnMarkUsed(); 
pxf = m_GlobalRecords.findXF(tempXF); 
pxf->MarkUsed(); 
}