2017-09-26 13 views
1

현재 Apache POI 라이브러리를 사용하여 Java에서 Excel 파일을 생성하고 있습니다.XSSF Excel 명명 된 스타일

다음은 궁금한 점입니다. Excel에서 통합 문서에 추가 할 새 셀 스타일을 만들 수 있습니다. 이러한 스타일은 재사용 가능하며 스타일 테이블에서 선택할 수 있습니다.

Apache POI를 사용하면 통합 문서를 구성 할 때 비슷한 기능을 사용할 수 있습니다. 통합 문서에 첨부 된 새로운 XSSFCellstyle을 만들 수 있으며 원하는만큼 많은 셀에 적용 할 수 있습니다. 그러나 이러한 스타일은 재사용 할 수 없습니다. Excel에서 결과 통합 문서를 열고 셀 스타일 중 하나를 변경하면 XSSF에서 생성 한 이름없는 스타일로 다시 변경할 수 없습니다. 이러한 스타일은 통합 문서의 스타일 테이블에 추가되지 않습니다.

으로 작성하고 문서를 Excel에서 열어 본 후 다시 볼 수있는 apache POI 통합 문서에 어떤 방법이 있습니까?

편집이 : 추가 조사에이 사용 HSSF를 할 수있는 방법이있을 나타납니다, 우리가 사용할 수 있습니다

cellStyle.setUserStyleName("Header") 

나는 불구하고 XSSF 동등한에 어떤 정보를 찾을 수 없습니다. 가능하면 누구나 알 수 있습니까?

답변

2

Office OpenXML 파일 형식 *.xlsx을 사용하면 쉽지 않습니다. 그러나 다음은 나를 위해 일한다.

apache poi FAQ-N10025에서 언급 한 것처럼 스키마 ooxml-schemas-1.3.jar의 전체 병이 필요합니다.

import java.io.FileOutputStream; 
import java.io.FileInputStream; 

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

import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTXf; 
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTStylesheet; 
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCellStyles; 
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCellStyle; 
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCellStyleXfs; 

import java.lang.reflect.Field; 

public class CreateExcelNamedXSSFCellStyle { 

static void setNamedCellStyle(XSSFCellStyle style, String name) throws Exception { 

    Field _stylesSource = XSSFCellStyle.class.getDeclaredField("_stylesSource"); 
    _stylesSource.setAccessible(true); 
    StylesTable stylestable = (StylesTable)_stylesSource.get(style); 
    CTStylesheet ctstylesheet = stylestable.getCTStylesheet(); 

    CTCellStyles ctcellstyles = ctstylesheet.getCellStyles(); 

    CTXf ctxfcore = style.getCoreXf(); 

    if (ctcellstyles == null) { 
    ctcellstyles = ctstylesheet.addNewCellStyles(); 
    ctcellstyles.setCount(2); 

    CTCellStyle ctcellstyle = ctcellstyles.addNewCellStyle(); //CellStyle for default built-in cell style 
    ctcellstyle.setXfId(0); 
    ctcellstyle.setBuiltinId(0); 

    ctcellstyle = ctcellstyles.addNewCellStyle(); 
    ctcellstyle.setXfId(1); 
    ctcellstyle.setName(name); 

    ctxfcore.setXfId(1); 
    } else { 
    long stylescount = ctcellstyles.getCount(); 
    ctcellstyles.setCount(stylescount+1); 

    CTCellStyle ctcellstyle = ctcellstyles.addNewCellStyle(); 
    ctcellstyle.setXfId(stylescount); 
    ctcellstyle.setName(name); 

    ctxfcore.setXfId(stylescount); 
    } 

    CTXf ctxfstyle = CTXf.Factory.newInstance(); 
    ctxfstyle.setNumFmtId(ctxfcore.getNumFmtId()); 
    ctxfstyle.setFontId(ctxfcore.getFontId()); 
    ctxfstyle.setFillId(ctxfcore.getFillId()); 
    ctxfstyle.setBorderId(ctxfcore.getBorderId()); 

    stylestable.putCellStyleXf(ctxfstyle); 

} 

static XSSFCellStyle getNamedCellStyle(XSSFWorkbook workbook, String name) { 
    StylesTable stylestable = workbook.getStylesSource(); 
    CTStylesheet ctstylesheet = stylestable.getCTStylesheet(); 
    CTCellStyles ctcellstyles = ctstylesheet.getCellStyles(); 
    if (ctcellstyles != null) { 
    int i = 0; 
    XSSFCellStyle style = null; 
    while((style = stylestable.getStyleAt(i++)) != null) { 
    CTXf ctxfcore = style.getCoreXf(); 
    long xfid = ctxfcore.getXfId(); 
    for (CTCellStyle ctcellstyle : ctcellstyles.getCellStyleList()) { 
    if (ctcellstyle.getXfId() == xfid && name.equals(ctcellstyle.getName())) { 
     return style; 
    } 
    } 
    } 
    } 
    return workbook.getCellStyleAt(0); //if nothing found return default cell style 
} 

public static void main(String[] args) throws Exception { 

    XSSFWorkbook workbook = new XSSFWorkbook(); 
    //XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream("Mappe1.xlsx")); 

    XSSFCellStyle style = workbook.createCellStyle(); 
    style.setFillForegroundColor(new XSSFColor(new java.awt.Color(255, 0, 0))); 
    style.setFillPattern(FillPatternType.SOLID_FOREGROUND); 
    setNamedCellStyle(style, "My Custom Style 1"); 

    style = workbook.createCellStyle(); 
    style.setFillForegroundColor(new XSSFColor(new java.awt.Color(0, 255, 0))); 
    style.setFillPattern(FillPatternType.SOLID_FOREGROUND); 
    setNamedCellStyle(style, "My Custom Style 2"); 

    style = workbook.createCellStyle(); 
    style.setFillForegroundColor(new XSSFColor(new java.awt.Color(0, 0, 255))); 
    style.setFillPattern(FillPatternType.SOLID_FOREGROUND); 
    setNamedCellStyle(style, "My Custom Style 3"); 

    XSSFSheet sheet = workbook.createSheet("TestSheet"); 
    XSSFRow row = sheet.createRow(0); 
    for (int i = 0; i < 3; i++) { 
    XSSFCell cell = row.createCell(i); 
    style = getNamedCellStyle(workbook, "My Custom Style " + (i+1)); 
    cell.setCellStyle(style); 
    } 

    row = sheet.createRow(2); 
    XSSFCell cell = row.createCell(0); 
    style = getNamedCellStyle(workbook, "not found"); 
    cell.setCellStyle(style); 

    workbook.write(new FileOutputStream("CreateExcelNamedXSSFCellStyle.xlsx")); 
    workbook.close(); 

} 
} 
+0

감사합니다. 나는 CTStyleSheet를 사용하여이 문제를 해결하려고 시도 했었지만 몇 가지 매우 중요한 단계가 빠져있었습니다. 다시 한번 감사드립니다. – DoonStar