How to add custom fonts in JXL? Apart from the one's available by default?

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");

The FontName class appears to be a private static internal class inside of the WritableFont class. How can I add fonts apart from the one mentioned there?

Regards, A Y.

有帮助吗?

解决方案 2

 WritableFont(WritableFont.FontName fn, int ps)
      Constructs of font of the specified face and of size given by the specified point size

see here

其他提示

Since the FontName constructor is private, we cannot instantiate a new FontName directly. Instead we must use WritableFont.createFont. This is a factory method to create a font specified by the provided font name.

Please be aware of the following:

This method should be used with care, since the string used to create the font name must be recognized by Excel's internal processing


To create a Trebuchet MS font, you would simply call the static factory method.

public static final FontName TREBUCHET_MS = WritableFont.createFont("Trebuchet MS");

I have create a simple font factory API for creating WritableFont objects below:

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

You can ignore this file, it is only used to resolve the path ("${userprofile}/documents/excel-font-test.xls") in the example above.

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);
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top