如何使用xlslib自定义颜色

时间:2014-06-05 18:48:22

标签: xlslib

我使用xlsLib根据专有格式的数据构建Excel电子表格。数据包含用于着色某些单元格的RGB信息,我希望生成的Excel文件能够反映这些自定义颜色。

xlsLib提供了一种设置单元格颜色的方法,如下所示:

myCell->fillfgcolor(color_name_t);

,适用于color_name_t中定义的预定义颜色。但是,如何告诉它使用我的自定义颜色而不是预定义颜色?

看起来我可以创建自定义颜色:

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

其中idx是介于8和64之间的值。看来setColor()会将此自定义颜色隐藏到调色板数组中供以后使用,但cell::fillfgcolor()似乎没有使用该调色板。

我应该使用自定义调色板来调用而不是fillfgcolor()来设置单元格的颜色?

1 个答案:

答案 0 :(得分:0)

您可以使用十六进制值和以下方法设置自定义颜色,将十六进制颜色值转换为RGB值并将其传递到DHWorkBook的setupNewColors中,您必须使用DHxlsIOS SDK。为此,我创建了一个通用方法,其中我传递DHWorkBook,DHCell,colourID和十六进制颜色字符串的对象,例如EFEFEF,CACACA。你可以传递9到63之间的任何数字作为颜色id,你可以在“color.h”文件中查看颜色的id。然后你需要使用setupNewColors设置RGB颜色并使用我创建的DHCell的fillBGcolorUnsigned填充到单元格中,以传递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&amp ;;中创建了两个自定义方法。 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();
}