工作簿的Apache POI默认样式
我正在尝试使用Apache POI
更改整个Excel工作簿(XSSF
)的默认单元样式。这应该应用于用户可能创建的新单元格(工作簿已由POI
保存后)。我试图通过调用workbook.getCellStyleAt(0)
来实现 - 我知道这是工作簿的默认样式 - 然后通过将此样式修改为我想要的新默认样式。工作簿的Apache POI默认样式
当我在现有的XSLX
文件(“模板”文件)中读取并修改默认样式时,此功能起作用。但是当我用POI
从零开始创建一个新的XSLX
文件时,它确实不是的工作。
当逐步使用调试器时,我可以看到,使用“模板”文件时,在索引0处分配给单元格样式的“主题”(可能是因为模板文件最初是使用Excel创建的)。但是从头创建文件时(使用POI
),索引0处的单元格样式具有空主题。 (这可能是为什么它使用一种方法而不是其他方式的原因。)
有关如何可靠地更改工作簿(XSSF
)的默认单元格样式的任何建议,无论工作簿最初是如何创建的?谢谢!
有两种可能性来实现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) {
}
}
}
这将改变所有单元格的默认单元格样式在整个工作簿。
的XML在styles.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"
。这意味着数字格式,字体,填充格式和边框的第一个定义在正常单元格样式中使用。
太棒了!非常感谢你的详细帮助。非常感激! – Gurtz