2016-09-25 140 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