2016-09-25 38 views
2

Apache POIを使用して、Excelワークブック全体(XSSF)のデフォルトのセルスタイルを変更しようとしています。これは、ユーザーが作成できる新しいセル(ブックがPOIで保存された後)に適用する必要があります。私はworkbook.getCellStyleAt(0) - 私はブックのデフォルトのスタイルであると理解して - このスタイルを新しいデフォルトにしたいものに変更することでこれを行うようにしています。Apache POIブックのデフォルトスタイル

これは、既存のXSLXファイル(「テンプレート」ファイル)を読み込んでデフォルトのスタイルを変更したときに機能します。しかし、POIを使用して新しいXSLXファイルを最初から作成すると、ではなく、の作業が行われます。

「テンプレート」ファイルを使用すると、テンプレートファイルが元々Excelを使用して作成されたため、インデックス0のセルスタイルに「テーマ」が割り当てられていることがわかります。しかし、ゼロからファイルを作成する場合(POIを使用)、インデックス0のセルスタイルはヌルテーマを持ちます。

ブックが最初に作成された方法に関係なく、ブックのデフォルトのセルスタイルを確実に変更する方法についてのご意見はありますか(XSSF)?ありがとう!

答えて

9

XSSFでこれを実現するには、2つの可能性があります。

まず: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"を指す。つまり、数値書式、フォント、塗りの書式、枠線の最初の定義は、通常のセルスタイルで使用されます。

+0

素晴らしい!詳細なヘルプをありがとうございました。とても有難い! – Gurtz