当前位置: 首页 > 知识库问答 >
问题:

工作簿的Apache POI默认样式

单于庆
2023-03-14

我正在尝试使用Apache POI更改整个Excel工作簿(XSSF)的默认单元格样式。这应该应用于用户可能创建的新单元格(在POI保存工作簿之后)。我试图通过调用workbook.getCellStyleat(0)--我认为这是工作簿的默认样式--来实现这一点,然后将此样式修改为我想要的新默认样式。

当我读入一个现有的xslx文件(一个“模板”文件)并修改默认样式时,这会起作用。但是,当我使用POI从头创建一个新的XSLX文件时,它就不起作用了。

当使用调试器单步执行时,我可以看到,当使用“模板”文件时,有一个“主题”分配给索引0处的单元格样式(可能是因为模板文件最初是使用Excel创建的)。但是在从头创建文件时(使用poi),索引为0的单元格样式具有空主题。(这可能是使用一种方法而不是另一种方法的原因之一。)

对于如何可靠地更改工作簿(XSSF)的默认单元格样式,无论工作簿最初是如何创建的,有什么建议吗?谢谢!

共有1个答案

钮兴安
2023-03-14

使用XSSF实现这一点有两种可能。

首先:如果在Excel中选择XSSF工作表中的所有单元格并对其应用样式,则会将cols元素添加到工作表中,并为所有列提供样式定义:

<cols>
 <col min="1" max="16384" style="1"/>
</cols>

这可以通过apache poi实现,如下所示:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;

import java.io.FileOutputStream;
import java.io.IOException;

class ExcelCellStyleAllColumns
 {

 public static void main(String[] args) {
  try {

    Workbook wb = new XSSFWorkbook();

    Font font = wb.createFont();
    font.setFontHeightInPoints((short)24);
    font.setFontName("Courier New");
    font.setItalic(true);
    font.setBold(true);

    CellStyle style = wb.createCellStyle();
    style.setFont(font);

    Sheet sheet = wb.createSheet();

    org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCol cTCol = 
      ((XSSFSheet)sheet).getCTWorksheet().getColsArray(0).addNewCol();
    cTCol.setMin(1);
    cTCol.setMax(16384);
    cTCol.setWidth(12.7109375);
    cTCol.setStyle(style.getIndex());

    Row row = sheet.createRow(0);
    Cell cell = row.createCell(0);
    cell.setCellValue("test");
    cell.setCellStyle(style);

    FileOutputStream os = new FileOutputStream("ExcelCellStyleAllColumns.xlsx");
    wb.write(os);
    os.close();

  } catch (IOException ioex) {
  }
 }
}
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;

import java.io.FileOutputStream;
import java.io.IOException;

class ExcelDefaultCellStyle {

 public static void main(String[] args) {
  try {

    Workbook wb = new XSSFWorkbook();

    Font font = wb.getFontAt((short)0);
    font.setFontHeightInPoints((short)24);
    font.setFontName("Courier New");
    ((XSSFFont)font).setFamily(3);
    ((XSSFFont)font).setScheme(FontScheme.NONE);
    font.setItalic(true);
    font.setBold(true);

    CellStyle style = wb.getCellStyleAt(0);
    style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
    style.setWrapText(true);

    ((XSSFWorkbook) wb).getStylesSource().getCTStylesheet().addNewCellStyles().addNewCellStyle().setXfId(0);

    ((XSSFCellStyle)style).getStyleXf().addNewAlignment().setVertical(
     org.openxmlformats.schemas.spreadsheetml.x2006.main.STVerticalAlignment.CENTER);
    ((XSSFCellStyle)style).getStyleXf().getAlignment().setWrapText(true);

    Sheet sheet = wb.createSheet();

    Row row = sheet.createRow(0);
    Cell cell = row.createCell(0);
    cell.setCellValue("test");

    FileOutputStream os = new FileOutputStream("ExcelDefaultCellStyle.xlsx");
    wb.write(os);
    os.close();

  } catch (IOException ioex) {
  }
 }
}

styles.XML中的XML显示:

<cellStyleXfs count="1">
 <xf numFmtId="0" fontId="0" fillId="0" borderId="0">
  <alignment vertical="center" wrapText="true"/>
 </xf>
</cellStyleXfs>
<cellXfs count="1">
 <xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0">
  <alignment vertical="center" wrapText="true"/>
 </xf>
</cellXfs>
<cellStyles>
 <cellStyle xfId="0"/>
</cellStyles>

如您所见,普通单元格样式是cellstyles中的第一个。它指的是xfid=“0”,它指的是numfmtid=“0”fontid=“0”fillid=“0”borderid=“0”。这意味着数字格式、字体、填充格式和边框的最早定义是在普通单元格样式中使用的。

 类似资料:
  • 我遇到了奇怪的问题与.NET版本的POI库为Excel电子表格。我正在重写从文本文件到Excel97-2003文档,我想添加一些格式,以编程方式,依赖于一些在程序的乞求下收集的值。 一开始,在我根据给定值创建一个新单元格的方法中,我也创建了一个新的工作簿CellStyle,这是错误的,因为我很快就用完了这些样式(或者我只是认为这是问题的原因)。 负责Excel工作簿的类的构造函数: 长话短说,在F

  • 我想将工作簿的一页(包括样式)复制到新的工作簿。 我尝试对所有单元格进行迭代 抛出java.lang.IllegalStateException:超出了单元格样式的最大数目。在.xls工作簿中最多可以定义4000个样式 抛出java.lang.IllegalArgumentException:此样式不属于提供的工作簿。是否尝试将样式从一个工作簿分配到另一个工作簿的单元格? 正确的样式复制方法是什么

  • 问题内容: 是否可以在Eclipse 3.4.1中设置默认的工作目录?默认情况下是: $ {workspace_loc :(项目名称)} 但我希望它像 $ {custom_var} 对于每个类,我可以将运行配置->参数->工作目录更改为“其他”,但最好更改默认值。我有很多需要从该特定目录运行的类。 问题答案: 您可以做的一件事是设置一个启动配置,然后右键单击它,然后选择“重复”。这将保留所有参数。

  • 这里的术语“工作簿”表示Microsoft Excel文件。 完成本章后,您将能够使用Java程序创建新的工作簿并打开现有的工作簿。 创建空白工作簿 以下简单程序用于创建空白Microsoft Excel工作簿。 import java.io.*; import org.apache.poi.xssf.usermodel.*; public class CreateWorkBook { pu

  • 所以在问这个之前,我搜索并发现了一些与我在这里想要做的相似的事情。 基本上我有工作簿AlphaMaster。这个工作簿是一个模板,我想用它来创建每周的新工作簿。 在本工作簿中,有名为“周一至周六”的工作表,以及带有相应日期的周一、周二等其他工作表。 我创建了一个在打开工作簿时加载的表单。我想要的是当我单击表单运行时,它将: > 将代码保存模板作为新工作簿运行 根据userform1的输入重命名工作

  • 当将许多Excel文件与aspose组合在一起时,我得到的是单个工作簿(包含许多工作表的Excel文件)。但问题是我没有得到HTML样式(颜色,字体,大小背景颜色...)合并前的每个工作表中都有。 下面是我的java代码: 我不知道是否有一个选项使aspose在组合工作簿时考虑到样式?