英文:
How can I get a CTColor from a Hex color code?
问题
我正在使用Apache POI来修改pptx文件。我试图更改XSLFTheme类的主题颜色。
我想要更改所有可以在PowerPoint GUI中更改的颜色,就像在这里所描述的那样(“创建自己的颜色主题”):https://support.office.com/en-us/article/change-a-theme-and-make-it-the-default-in-word-or-excel-c846f997-968e-4daa-b2d4-42bd2afef904
我通过以下代码获取主题的颜色方案:
CTOfficeStyleSheet styleSheet = xslfTheme.getXmlObject();
CTBaseStyles themeElements = styleSheet.getThemeElements();
CTColorScheme colorscheme = themeElements.getClrScheme();
要更改CTColorScheme中的颜色,我需要一个CTColor作为输入。我如何从十六进制颜色代码获取CTColor?
谢谢您的帮助!
英文:
I am using Apache POI to modify a pptx. I am trying to change the theme colors of the XSLFTheme class.
I would like to change all the colors that one can change in the PowerPoint GUI as described here ("Create my own color theme"): https://support.office.com/en-us/article/change-a-theme-and-make-it-the-default-in-word-or-excel-c846f997-968e-4daa-b2d4-42bd2afef904
The color scheme of the theme I get with the following code:
CTOfficeStyleSheet styleSheet = xslfTheme.getXmlObject();
CTBaseStyles themeElements = styleSheet.getThemeElements();
CTColorScheme colorscheme = themeElements.getClrScheme();
For changing the colors in the CTColorScheme, I need a CTColor as input. How can I get a CTColor from a Hex color code?
Thanks for your help!
答案1
得分: 1
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();
}
}
英文:
The CTColorScheme
defines different CTColors
: dk1
, lt1
, dk2
, lt2
, accent1
to accent6
, hlink
and folHlink
. So at first you need to decide what color needs to be set.
I suspect you have a PowerPoint
presentation using a theme already and wants changing some of the theme colors. If that shall be RGB
colors then, you need overwriting them using CTColors
containing CTSRgbColors
. And CTSRgbColor
has a method setVal(byte[] val)
where byte[] val
is a byte array containing three bytes for RGB
.
If the need is using a hex-string like "FF00FF" to define the color instead of using the byte array directly, then org.apache.commons.codec.binary.Hex
could be used. That provides a method Hex.decodeHex
which takes a string and decodes it into a byte array. The commons-codec
library is a apache poi
prerequisite anyway.
Example:
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();
}
}
This gets a PPTX.pptx
, gets it's theme and changes the theme colors dk1
(dark1), which is the default dark color used as font color for example, and accent1
, which is the first accent color, into user defined RGB
colors.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论