Как изменить шрифт в XSSFTextBox

XSSFTextBox и XSSFrichTextField

Изменить см. комментарий; Apache POI кажется расистским, черный не поддерживается? Красный?

Редактировать 2: вместо использования XSSFColor используйте константы в шрифте, они имеют красный и черный цвета; просмотр шрифтов по умолчанию (для ясности код теперь правильно отображает цвет и размер, но имя шрифта / фактический шрифт по-прежнему неправильный. Таким образом, Font.COLOR_NORMAL работает для этого черного)

По какой-то причине я не могу изменить шрифты и цвета шрифтов текстов XSSFTextBox с их (я полагаю) белого цвета Calibri по умолчанию (почему белый цвет по умолчанию?!?). Я меняю их размеры, но их шрифт и цвет шрифта остаются по умолчанию. Я обнаружил, что это была предыдущая ошибка, которую следует исправить здесь.

Я просматривал эту ссылку на основе того, как я меняю шрифт, и кажется, что это делается так, но это просто не работает; Я хотел бы еще раз взглянуть на это, есть и другие мелкие проблемы, с которыми я все еще возюсь, но реализация шрифта — самая большая проблема сейчас; любая критика приветствуется и приветствуется!

Что меня действительно раздражает, так это то, что я использовал XSSFFont с XSSFCellStlyes раньше, довольно широко, и у меня никогда не было проблем с изменением шрифтов или цветов, не говоря уже о чем-либо еще, поэтому я не знаю, является ли это каким-то странным поведением, которое я не знаю. видя или если я сделал что-то неправильно здесь.

Код

package excelhandling;

import java.awt.Desktop;
import java.io.*;
import javax.swing.JOptionPane;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;

/**Unit Tests<br>To test random things to figure them out so I can implement them
 * in the real code later; ideal is to test kinks here so whole application
 * doesn't have to be loaded over and over to figure small issues out (living the dream)
 * 
 * @author Sean Newell
 */
public class UnitTests
{

    static String fileName = "TestWorkbook.xlsx";

    public static void main(String[] args)
    {
        XSSFWorkbook wb = new XSSFWorkbook();
        XSSFSheet sht = wb.createSheet();
        File file = new File(fileName);
        int colStart = 5;

        XSSFDrawing draw = sht.createDrawingPatriarch();

        XSSFShapeGroup group = draw.createGroup(draw.createAnchor(0, 0, 0, 0, colStart, 11, colStart + 6, 11+7));
        group.setCoordinates(colStart, 11, colStart + 6, 11+7);

        XSSFTextBox tb1 = group.createTextbox(new XSSFChildAnchor(0, 0, 6, 7));
        tb1.setShapeType(ShapeTypes.RECT);
        tb1.setNoFill(false);
        tb1.setFillColor(255, 255, 255); //This causes excel to repair xml - don't know why;
        //following message from Excel:
        //Repaired Records: Drawing from /xl/drawings/drawing1.xml part (Drawing shape)
        //Log:

//      <?xml version="1.0" encoding="UTF-8" standalone="true"?>
//      -<recoveryLog xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
//          <logFileName>error094800_07.xml</logFileName>
//          <summary>Errors were detected in file 'H:\My Documents\NetBeansProjects\TemplateBuilder\TestWorkbook.xlsx'</summary>
//              -<repairedRecords summary="Following is a list of repairs:">
//      <repairedRecord>Repaired Records: Drawing from /xl/drawings/drawing1.xml part (Drawing shape)</repairedRecord>
//          </repairedRecords>
//      </recoveryLog>

        XSSFRichTextString address = new XSSFRichTextString("TextBox string 1\nHas three\nLines to it");

        XSSFFont arial10 = wb.createFont();
        arial10.setFontName("Arial"); // Doesn't seem to work
        arial10.setFontHeight(10);
        arial10.setColor(new XSSFColor(java.awt.Color.BLACK)); // Doesn't seem to work
        address.applyFont(arial10); // Possible problem?

        tb1.setText(address);
        tb1.setLineStyleColor(0, 0, 0);
        tb1.setLineWidth(2);


        XSSFTextBox tb2 = group.createTextbox(new XSSFChildAnchor(0, 7, 10, 13));
        tb2.setShapeType(ShapeTypes.RECT);
        tb2.setNoFill(false);
        tb2.setFillColor(254, 254, 254); //This causes excel to repair xml - don't know why
        XSSFRichTextString secret = new XSSFRichTextString("A single-line thing that has like, a lot of text, but can wrap and be smaller, like, totally.");

        XSSFFont arial8 = wb.createFont();
        arial8.setFontName("Arial"); // Doesn't seem to work
        arial8.setFontHeight(8);
        arial8.setColor(new XSSFColor(java.awt.Color.BLACK)); // Doesn't seem to work
        secret.applyFont(arial8); // Possible problem?

        tb2.setText(secret);
        tb2.setLineStyleColor(0, 0, 0);
        tb2.setLineWidth(2);

        try {
            FileOutputStream fout;
            fout = new FileOutputStream(file);

            wb.write(fout);
            fout.close();

            JOptionPane.showConfirmDialog(null, "Excel sheet written");
            Desktop.getDesktop().open(file);

        } catch (IOException exc) {
            JOptionPane.showInputDialog("Please close other instances of excel that have " + fileName + " open");
        }
    }
}

person Sean Newell    schedule 13.05.2013    source источник
comment
Я изменил цвет на красный, и текст стал красным :| Кажется, черный не поддерживается. Новый расизм? Может быть. Собираюсь попробовать и посмотреть, какие шрифты поддерживаются и какие цвета поддерживаются.   -  person Sean Newell    schedule 14.05.2013
comment
Прошло некоторое время с тех пор, как я использовал пои. По крайней мере, в старом формате .xls цвета ограничивались палитрой документа. Использование одной из констант, например BLACK, не всегда относилось к черному цвету, а скорее к ячейке в палитре, которая была черной в палитре по умолчанию. Если вы меняли палитру, ЧЕРНЫЙ относился к любому цвету, который был в этом слоте.   -  person James Montagne    schedule 14.05.2013
comment
Думаю, имеет смысл; то, что вы видите, это все, с чем я работаю в этом тестовом классе, поэтому я не стал его явно менять; как вы думаете, палитра похожа на таблицу стилей, которую вы получаете из getStylesSource()? Ссылка   -  person Sean Newell    schedule 14.05.2013


Ответы (1)


Это довольно грубо, но в poi 3.9 кажется, что только семейство шрифтов, но не имя шрифта, копируется из объекта XSSFFont в XSSFSimpleShape.applyAttributes. Кроме того, я мог установить индексированные цвета только через XSSFColor.setColor(HSSFColor.<color>.index) - возможно, есть подвеска XSSF к HSSF пользовательская цветовая палитра, но я думаю, что приведенный ниже подход более прямолинеен...

(Протестировано с Libre Office 4.0, MS Excel Viewer, MS Excel 2003 с пакетом совместимости...)

import java.awt.Color;
import java.io.*;
import org.apache.poi.xssf.usermodel.*;
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextCharacterProperties;

public class XlsColors {

    static String fileName = "TestWorkbook.xlsx";

    public static void main(String[] args) throws Exception {
        XSSFWorkbook wb = new XSSFWorkbook();
        XSSFSheet sht = wb.createSheet();
        File file = new File(fileName);
        int colStart = 5;

        XSSFDrawing draw = sht.createDrawingPatriarch();

        XSSFShapeGroup group = draw.createGroup(draw.createAnchor(0, 0, 0, 0, colStart, 11, colStart + 6, 11+7));
        group.setCoordinates(colStart, 11, colStart + 6, 11+7);

        XSSFTextBox tb1 = group.createTextbox(new XSSFChildAnchor(0, 0, 6, 7));
        tb1.setLineStyleColor(0, 0, 0);
        tb1.setLineWidth(2);
        Color col = Color.orange;
        tb1.setFillColor(col.getRed(), col.getGreen(), col.getBlue());

        XSSFRichTextString address = new XSSFRichTextString("TextBox string 1\nHas three\nLines to it");
        tb1.setText(address);        
        CTTextCharacterProperties rpr = tb1.getCTShape().getTxBody().getPArray(0).getRArray(0).getRPr();
        rpr.addNewLatin().setTypeface("Trebuchet MS");
        rpr.setSz(900); // 9 pt
        col = Color.pink;
        rpr.addNewSolidFill().addNewSrgbClr().setVal(new byte[]{(byte)col.getRed(),(byte)col.getGreen(),(byte)col.getBlue()});

        FileOutputStream fout = new FileOutputStream(file);
        wb.write(fout);
        fout.close();
    }
}
person kiwiwings    schedule 13.05.2013
comment
Я не знаю, получаете ли вы те же сообщения в программе просмотра libre office/Excel, но в Microsoft Excel 2010 при вызове rpr.addNewSolidFill()... при открытии файла в excel Excel снова выполняет восстановление xml; и, похоже, он также не добавляет заливку фона текстового поля. Протестировано Color.Pink и Color.White, и ни одно из них не сработало, поэтому я вернулся к использованию setFillColor для объекта XSSFTextBox; все еще делает excel repair xml. - person Sean Newell; 14.05.2013
comment
Цвет был для самого текста, а не для фона. Надеюсь завтра на работе успею проверить с Excel 2003... - person kiwiwings; 15.05.2013
comment
Тест под MS Excel 2003 с пакетом совместимости прошел нормально, т.е. никаких предупреждений. Кроме того, я добавил цвет фона ... не приятно для глаз, но это работает ;) - person kiwiwings; 15.05.2013