Настройка пользовательского шрифта JXL
Как добавить пользовательские шрифты в JXL? Помимо того, что доступно по умолчанию?
public static final FontName ARIAL = new FontName("Arial");
public static final FontName TIMES = new FontName("Times New Roman");
public static final FontName COURIER = new FontName("Courier New");
public static final FontName TAHOMA = new FontName("Tahoma");
FontName
класс представляется private
static
внутренний класс внутри WritableFont
учебный класс. Как я могу добавить шрифты помимо того, что там упоминается?
С уважением, А.Ю.
2 ответа
WritableFont(WritableFont.FontName fn, int ps)
Constructs of font of the specified face and of size given by the specified point size
смотрите здесь
Поскольку конструктор FontName является закрытым, мы не можем создать экземпляр нового FontName
непосредственно. Вместо этого мы должны использовать WritableFont.createFont
, Это фабричный метод для создания шрифта, указанного в указанном имени шрифта.
Пожалуйста, имейте в виду следующее:
Этот метод следует использовать с осторожностью, поскольку строка, используемая для создания имени шрифта, должна распознаваться внутренней обработкой Excel.
Чтобы создать шрифт Trebuchet MS, нужно просто вызвать метод статической фабрики.
public static final FontName TREBUCHET_MS = WritableFont.createFont("Trebuchet MS");
У меня есть простой API фабрики шрифтов для создания WritableFont
объекты ниже:
FontCreator.java
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.json.excel.parse.PathResolver;
import jxl.Workbook;
import jxl.format.Colour;
import jxl.format.RGB;
import jxl.format.UnderlineStyle;
import jxl.write.Label;
import jxl.write.WritableCell;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableFont.FontName;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;
public class FontCreator {
// ========================================================================
// Private Utilities
// ========================================================================
private static final Map<Integer, Colour> colorValueMap;
private static final Map<String, Colour> colorNameMap;
static {
colorValueMap = new HashMap<Integer, Colour>();
colorNameMap = new HashMap<String, Colour>();
for (Colour color : Colour.getAllColours()) {
RGB rgb = color.getDefaultRGB();
int valueKey = (rgb.getRed() << 16) + (rgb.getGreen() << 8) + rgb.getBlue();
String nameKey = color.getDescription();
colorValueMap.put(valueKey, color);
colorNameMap.put(nameKey, color);
}
}
// ========================================================================
// Global Values
// ========================================================================
public static final WritableFont TREBUCHET_MS = create("Trebuchet MS");
public static final WritableFont CONSOLAS = create("Consolas", 9, "ocean blue", true, false, 0);
public static final int NO_UNDERLINE = 0x0;
public static final int SINGLE = 0x1;
public static final int DOUBLE = 0x2;
public static final int SINGLE_ACCOUNTING = 0x21;
public static final int DOUBLE_ACCOUNTING = 0x22;
public static void main(String[] args) {
try {
File exlFile = new File(PathResolver.resolve("${userprofile}/documents/excel-font-test.xls"));
WritableWorkbook writableWorkbook = Workbook.createWorkbook(exlFile);
WritableSheet writableSheet = writableWorkbook.createSheet("Sheet1", 0);
WritableCellFormat cellFormat = new WritableCellFormat(FontCreator.CONSOLAS);
WritableCell label = new Label(0, 0, "This is a test.", cellFormat);
writableSheet.addCell(label);
writableWorkbook.write();
writableWorkbook.close();
} catch (IOException e) {
e.printStackTrace();
} catch (RowsExceededException e) {
e.printStackTrace();
} catch (WriteException e) {
e.printStackTrace();
}
}
public static WritableFont create(String name, int size, Colour color, boolean bold, boolean italic,
int underline) {
UnderlineStyle underlineStyle = UnderlineStyle.getStyle(underline);
FontName font = WritableFont.createFont(name);
if (bold) {
return new WritableFont(font, size, WritableFont.BOLD, italic, underlineStyle, color);
} else {
return new WritableFont(font, size, WritableFont.NO_BOLD, italic, underlineStyle, color);
}
}
public static WritableFont create(String name, int size, int color, boolean bold, boolean italic, int underline) {
return create(name, size, lookupColor(color), bold, italic, underline);
}
public static WritableFont create(String name, int size, String color, boolean bold, boolean italic,
int underline) {
return create(name, size, lookupColor(color.toLowerCase()), bold, italic, underline);
}
public static WritableFont create(String fontName, int size, int color) {
return create(fontName, size, color, false, false, NO_UNDERLINE);
}
public static WritableFont create(String fontName, int size, String color) {
return create(fontName, size, color, false, false, NO_UNDERLINE);
}
public static WritableFont create(String fontName, int size) {
return create(fontName, size, 0x000000);
}
public static WritableFont create(String fontName) {
return create(fontName, WritableFont.DEFAULT_POINT_SIZE);
}
public static Colour lookupColor(int value) {
return colorValueMap.containsKey(value) ? colorValueMap.get(value) : Colour.AUTOMATIC;
}
public static Colour lookupColor(String value) {
return colorNameMap.containsKey(value) ? colorNameMap.get(value) : Colour.AUTOMATIC;
}
}
PathResolver.java
Вы можете игнорировать этот файл, он используется только для разрешения пути ("$ {userprofile} /documents/excel-font-test.xls") в примере выше.
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class PathResolver {
private static final Pattern envVarRegex;
static {
String envVar = "[\\w\\(\\)]+";
String expression = "\\$\\{(" + envVar + "+)\\}|\\$(" + envVar + ")";
envVarRegex = Pattern.compile(expression);
}
public static String resolve(String path) {
if (path == null) {
return null;
}
Matcher m = envVarRegex.matcher(path);
StringBuffer sb = new StringBuffer();
while (m.find()) {
String envVar = m.group(0);
String envVarName = null == m.group(1) ? m.group(2) : m.group(1);
m.appendReplacement(sb, resolveEnvVar(envVar, envVarName));
}
return m.appendTail(sb).toString();
}
private static String resolveEnvVar(String envVar, String name) {
try {
return Matcher.quoteReplacement(System.getenv(name));
} catch (NullPointerException e) {
System.err.println("Warning: Environment variable does no exist: " + name);
}
return Matcher.quoteReplacement(envVar);
}
}