2014-10-31 2 views
2

Я хочу прочитать имя, присвоенное стилю, примененному к ячейке в документе xlsx. Я извлек файл и в styles.xml я могу найти имя в х/стиль:POI Excel: получить имя стиля

<cellStyles count="3"> 
    <cellStyle xfId="2" builtinId="7" name="Currency [0]"/> 
    <cellStyle xfId="0" builtinId="0" name="Normal"/> 
    <cellStyle xfId="1" name="test style"/> 
</cellStyles> 

Имя стиля я хочу «тест стиль». В настоящее время у меня есть следующий код, и я могу получить xfId но не имя:

@Override 
public String getName(Workbook table, XSSFCell cell, String value) { 
    XSSFCellStyle cellStyle = cell.getCellStyle(); 
    CellColor cellColor = new CellColor(cellStyle); 
    int xfId = cellStyle.getCoreXf().getFillId(); 

    //todo: fint name, not xfId 

    return null; 
} 

Кто-нибудь знает, если я могу получить имя стиля с пои, и как я бы о поездке его?

Если это невозможно, я могу получить цвет фона на основе xfId как rgb?

Отношения

+0

Вы попробовали [метод XSSFCellStyle getFillBackgroundColorColor?] (Https://poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFCellStyle.html#getFillBackgroundColorColor%28%29). Не удалось, в быстрый поиск, найти способ получить имя. –

+0

Я пробовал это, но по какой-то причине при использовании пользовательского формата на ячейках цвет имеет значение null, используя этот метод. –

+0

Одна вещь, которая может привести вас к цвету, - это если стиль проиндексирован в книге. Получите 'StylesTable' из' table' с помощью [getStylesSource] (http://poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFWorkbook.html#getStylesSource%28%29) и посмотрите, CellStyle находится там, надеюсь, с цветом фона заливки. –

ответ

2

После многократного поиска я нашел решение. И я думал, что поделюсь им здесь. Я все еще не нашел названия стиля. Но я нашел способ получить цвет.

У CellStyle есть объект объекта xf, содержащий ссылочный индекс для используемой заливки. Вы можете получить заполнение из книги «Стили таблицы».

Цвет заливки по-разному различается в зависимости от того, какой цвет он имеет. Либо у него просто есть строка rgb, которую вы можете проанализировать, либо она имеет идентификатор темы и значение оттенка.

Вы можете получить темы из StylesTable точно так же, как заливки. и тема имеет значение rgb. Я не уверен, как применить оттенок, но в моих тестах это не было необходимо.

private int red; 
private int green; 
private int blue; 

public void loadRgb(XSSFWorkbook table, XSSFCellStyle variableStyle) { 
    long fillId = variableStyle.getCoreXf().getFillId(); 
    StylesTable stylesSource = table.getStylesSource(); 
    XSSFCellFill fill = stylesSource.getFillAt((int) fillId); 
    CTColor fgColor = fill.getCTFill().getPatternFill().getFgColor(); 
    if (fgColor != null) { 
     if (fgColor.xgetRgb() != null) { 
     convert(fgColor.xgetRgb().getStringValue()); 
     } else { 
     convert(stylesSource.getTheme().getThemeColor((int) fgColor.getTheme()).getRgb()); 
     } 
    } 
} 

private void convert(String stringValue) { 
    // the string value contains an alpha value, so we skip the first 2 chars 
    red = Integer.valueOf(stringValue.substring(2, 4), 16).intValue(); 
    green = Integer.valueOf(stringValue.substring(4, 6), 16).intValue(); 
    blue = Integer.valueOf(stringValue.substring(6, 8), 16).intValue(); 
} 

private void convert(byte[] rgb) { 
    if (rgb != null) { 
     // Bytes are signed, so values of 128+ are negative! 
     // 0: red, 1: green, 2: blue 
     red = (rgb[0] < 0) ? (rgb[0] + 256) : rgb[0]; 
     green = (rgb[1] < 0) ? (rgb[1] + 256) : rgb[1]; 
     blue = (rgb[2] < 0) ? (rgb[2] + 256) : rgb[2]; 
    } 
} 
2

Я нашел этот вопрос, глядя на ту часть, которая осталась без ответа: Как найти название стиля?

Прежде всего, кажется, что стили, возвращенные из XSSFCells, не коррелируют с разделом cellStyle в styles.xml. Скорее, это другой раздел под названием cellStyleXfs. Во всяком случае, я попал в стили CT, чтобы найти информацию.

Короче говоря, следующий код работает для меня, чтобы найти имена стилей:

XSSFWorkbook wb = new XSSFWorkbook(...); 
StylesTable stylesTable = wb.getStylesSource(); 
CTStylesheet ct = stylesTable.getCTStylesheet(); 

CTCellStyles cellStyles = ct.getCellStyles(); 

// Prints the count from: <cellStyles count="3516"> 
System.out.println("Number of CT styles: " + cellStyles.getCount()); 

for (CTCellStyle style : cellStyles.getCellStyleList()) { 
    // Prints the name 
    // Example: <cellStyle name="Note 2" xfId="3506"/> 
    // Prints: Note 2 
    System.out.println(style.getName()); 
} 

Однако, чтобы получить эту работу, вы должны использовать ooxml-schemas.jar вместо урезанной версии поставляется с POI (poi-ooxml-schemas.jar). Я нашел его here. В противном случае такие классы, как CTCellStyles и CTCellStyle, не будут найдены (this e-mail thread обсуждает различные варианты).

+0

Кажется, что это может быть решение, отличная работа. Хотя немного поздно для моего крайнего срока;) –

Смежные вопросы