CTColorScheme
определяет различные CTColors
: dk1
, lt1
, dk2
, lt2
, accent1
до accent6
, hlink
и folHlink
. Поэтому сначала вам нужно решить, какой цвет нужно установить.
Я подозреваю, что у вас есть презентация PowerPoint
, в которой уже используется тема, и вы хотите изменить некоторые цвета темы. Если это будет RGB
цветов, вам нужно перезаписать их, используя CTColors
, содержащий CTSRgbColors
. И CTSRgbColor
имеет метод setVal(byte[] val)
, где byte[] val
- это байтовый массив, содержащий три байта для RGB
.
Если необходимо использовать шестнадцатеричную строку, например "FF00FF", для определения цвета вместо непосредственного использования байтового массива, тогда можно использовать org.apache.commons.codec.binary.Hex
. Это обеспечивает метод Hex.decodeHex
, который берет строку и декодирует ее в байтовый массив. Библиотека commons-codec
является обязательным условием apache poi
.
Пример:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import org.apache.poi.xslf.usermodel.*;
import org.openxmlformats.schemas.drawingml.x2006.main.*;
import org.apache.commons.codec.binary.Hex;
public class PowerPointChangeThemeColors {
enum ThemeColor {
DK1, //Dark1
LT1, //Light1
DK2, //Dark2
LT2, //Light2
ACCENT1, //Accent1
ACCENT2, //Accent2
ACCENT3, //Accent3
ACCENT4, //Accent4
ACCENT5, //Accent5
ACCENT6, //Accent6
HLINK, //Hyperlink
FOLHLINK //FollowedHyperlink
}
static void setThemeColor(XSLFTheme theme, ThemeColor color, String rgbS) throws Exception {
CTOfficeStyleSheet styleSheet = theme.getXmlObject();
CTBaseStyles themeElements = styleSheet.getThemeElements();
CTColorScheme colorScheme = themeElements.getClrScheme();
CTColor ctColor = CTColor.Factory.newInstance();
CTSRgbColor sRgbColor = ctColor.addNewSrgbClr();
byte[] rgbB = Hex.decodeHex(rgbS);
sRgbColor.setVal(rgbB);
if (color == ThemeColor.DK1) {
colorScheme.setDk1(ctColor);
} else if (color == ThemeColor.LT1) {
colorScheme.setLt1(ctColor);
} else if (color == ThemeColor.DK2) {
colorScheme.setDk2(ctColor);
} else if (color == ThemeColor.LT2) {
colorScheme.setLt2(ctColor);
} else if (color == ThemeColor.ACCENT1) {
colorScheme.setAccent1(ctColor);
} else if (color == ThemeColor.ACCENT2) {
colorScheme.setAccent2(ctColor);
} else if (color == ThemeColor.ACCENT3) {
colorScheme.setAccent3(ctColor);
} else if (color == ThemeColor.ACCENT4) {
colorScheme.setAccent4(ctColor);
} else if (color == ThemeColor.ACCENT5) {
colorScheme.setAccent5(ctColor);
} else if (color == ThemeColor.ACCENT6) {
colorScheme.setAccent6(ctColor);
} else if (color == ThemeColor.HLINK) {
colorScheme.setHlink(ctColor);
} else if (color == ThemeColor.FOLHLINK) {
colorScheme.setFolHlink(ctColor);
}
}
public static void main(String args[]) throws Exception {
XMLSlideShow slideShow = new XMLSlideShow(new FileInputStream("./PPTX.pptx"));
if (slideShow.getSlideMasters().size() > 0) {
XSLFSlideMaster master = slideShow.getSlideMasters().get(0);
XSLFTheme theme = master.getTheme();
setThemeColor(theme, ThemeColor.DK1, "0000FF");
setThemeColor(theme, ThemeColor.ACCENT1, "FF0000");
}
FileOutputStream out = new FileOutputStream("./PPTXNew.pptx");
slideShow.write(out);
out.close();
slideShow.close();
}
}
Получает PPTX.pptx
, получает свою тему и меняет цвета темы dk1
(dark1) ), который является темным цветом по умолчанию, используемым в качестве цвета шрифта, например, и accent1
, который является первым акцентным цветом, в определенные пользователем цвета RGB
.