2016-09-25 141 views
2

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

当我在现有的XSLX文件(“模板”文件)中读取并修改默认样式时,此功能起作用。但是当我用POI从零开始创建一个新的XSLX文件时,它确实不是的工作。

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

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

回答

9

有两种可能性来实现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"。这意味着数字格式,字体,填充格式和边框的第一个定义在正常单元格样式中使用。

+0

太棒了!非常感谢你的详细帮助。非常感激! – Gurtz