Java 如何更改XSSFTextBox上的字体 XSSFTextBox和XSSFRichTextField的

Java 如何更改XSSFTextBox上的字体 XSSFTextBox和XSSFRichTextField的,java,apache-poi,xssf,Java,Apache Poi,Xssf,编辑查看评论;Apache POI似乎是种族主义者,黑人不受支持?红色是? 编辑2:字体中不使用XSSFColor use常量,而是使用红色和黑色;查看默认字体(只是为了澄清代码现在正确显示颜色和大小,但字体名称/实际字体仍然错误。因此Font.color\u NORMAL适用于dat black) 出于某种原因,我无法让我的XSSFTextBoxs“文本”字体和字体颜色从其(我假设)默认的Calibri白色更改(为什么白色是默认值?!?)。我更改了它们的大小,但它们的字体和字体颜色保持默认值。

编辑查看评论;Apache POI似乎是种族主义者,黑人不受支持?红色是?

编辑2:字体中不使用XSSFColor use常量,而是使用红色和黑色;查看默认字体(只是为了澄清代码现在正确显示颜色和大小,但字体名称/实际字体仍然错误。因此Font.color\u NORMAL适用于dat black)

出于某种原因,我无法让我的XSSFTextBoxs“文本”字体和字体颜色从其(我假设)默认的Calibri白色更改(为什么白色是默认值?!?)。我更改了它们的大小,但它们的字体和字体颜色保持默认值。我发现这是以前的一个bug,应该修复

我一直在研究如何更改字体的基准参考,看起来就是这样做的,但它似乎不起作用;我希望能有更多的人关注这一点,还有其他一些小问题我还在处理,但是字体的实现是目前最大的问题;欢迎您提出任何批评

真正让我恼火的是,我以前在XSSFCellStlyes中使用过xssfont,非常广泛,而且在更改字体或颜色时从未遇到任何问题,更不用说其他任何问题了,所以我不知道这是我没有看到的奇怪行为,还是我在这里做了一些错误的事情

代码
包装处理;
导入java.awt.Desktop;
导入java.io.*;
导入javax.swing.JOptionPane;
导入org.apache.poi.ss.usermodel.*;
导入org.apache.poi.xssf.usermodel.*;
/**单元测试
来测试随机的东西,找出它们,这样我就可以实现它们了 *在以后的真实代码中;理想的方法是在这里测试扭结,这样整个应用程序 *不必反复加载来解决小问题(实现梦想) * *@作者肖恩·纽厄尔 */ 公共类单元测试 { 静态字符串fileName=“TestWorkbook.xlsx”; 公共静态void main(字符串[]args) { XSSF工作簿wb=新XSSF工作簿(); XSSFSheet sht=wb.createSheet(); 文件=新文件(文件名); int colStart=5; XSSFDrawing-draw=sht.createDrawingParhical(); XSSFShapeGroup group=draw.createGroup(draw.createAnchor(0,0,0,0,colStart,11,colStart+6,11+7)); 组设置坐标(colStart,11,colStart+6,11+7); xssftextb1=group.createTextbox(新的XSSFChildAnchor(0,0,6,7)); tb1.setShapeType(shapeType.RECT); tb1.设置填充(假); tb1.setFillColor(255,255,255);//这会导致excel修复xml-不知道为什么; //来自Excel的以下消息: //修复记录:从/xl/drawings/drawing1.xml零件绘制(图纸形状) //日志: // // - //error094800_07.xml //在文件“H:\My Documents\NetBeansProjects\TemplateBuilder\TestWorkbook.xlsx”中检测到错误 // - //修复记录:从/xl/drawings/drawing1.xml零件绘制(图纸形状) // // XSSFRichTextString地址=新XSSFRichTextString(“文本框字符串1\n有三行”); XSSFFont arial10=wb.createFont(); arial10.setFontName(“Arial”);//似乎不起作用 arial10.设置字体高度(10); arial10.setColor(新的XSSFColor(java.awt.Color.BLACK));//似乎不起作用 address.applyFont(arial10);//可能的问题? tb1.setText(地址); tb1.setLineStyleColor(0,0,0); tb1.设置线宽(2); xssftextb2=group.createTextbox(新的XSSFChildAnchor(0,7,10,13)); tb2.setShapeType(shapeType.RECT); tb2.设置填充(假); tb2.setFillColor(254,254,254);//这会导致excel修复xml-不知道为什么 XSSFRichTextString secret=new XSSFRichTextString(“一个单行的东西,它有很多类似的文本,但可以包装并更小,完全类似。”); xssfont arial8=wb.createFont(); arial8.setFontName(“Arial”);//似乎不起作用 阿里亚尔8。设置字体高度(8); arial8.setColor(新的XSSFColor(java.awt.Color.BLACK));//似乎不起作用 secret.applyFont(arial8);//可能的问题? tb2.setText(机密); tb2.setLineStyleColor(0,0,0); tb2.设置线宽(2); 试一试{ FileOutputStream-fout; fout=新文件输出流(文件); wb.write(fout); fout.close(); JOptionPane.showConfirmDialog(null,“Excel工作表已写入”); Desktop.getDesktop().open(文件); }捕获(IOException){ showInputDialog(“请关闭具有“+fileName+”打开状态的其他excel实例”); } } }
这相当粗糙,但在poi 3.9中,似乎只有字体系列而不是字体名称是从
XSSFSimpleShape.applyAttributes
中的
xssfont
对象复制的。 此外,我只能通过
XSSFColor.setColor(HSSFColor..index)
设置索引颜色-可能有XSSF挂件,但我认为下面的方法更直接

(使用Libre Office 4.0、MS Excel Viewer、MS Excel 2003及兼容包进行测试…)


我将颜色更改为红色,文本更改为红色:|似乎不支持黑色。新种族主义?大概我将尝试检查并查看哪些字体受支持,哪些颜色受支持。我使用poi已有一段时间了。至少对于旧的.xls格式,颜色被约束到文档的调色板。使用其中一个常量(例如黑色)并不总是指黑色,而是指调色板中默认调色板中为黑色的插槽。如果你改变了调色板,黑色指的是插槽中的任何颜色;您看到的是我在这个测试类中使用的全部内容——因此我没有显式地更改它;你认为调色板就像你得到的样式表吗
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");
        }
    }
}
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();
    }
}