XSSF Excel 命名样式
XSSF Excel Named Styles
我目前正在使用 Apache POI 库在 Java 中生成 excel 个文件。
我想知道的是:在 excel 中,可以创建将添加到工作簿的新单元格样式。这些样式是可重复使用的,可以从样式 table.
中选择
使用 Apache POI,您可以在构建工作簿时执行类似的操作。您可以创建一个新的 XSSFCellstyle,它附加到工作簿,并且可以根据需要应用于任意数量的单元格。但是,这些样式不可重复使用。如果我在 excel 中打开生成的工作簿并更改其中一个单元格样式,我将永远无法将其更改回我在 XSSF 中生成的未命名样式。这些样式未添加到工作簿的样式 table。
我只是想知道,是否有任何方法可以在 apache POI 工作簿中创建 named 样式,然后在 [= 中打开文档后可以看到并重新使用这些样式27=]?
编辑:经过进一步调查,似乎有一种方法可以使用 HSSF 执行此操作,我们可以使用:
cellStyle.setUserStyleName("Header")
不过我找不到任何关于 XSSF 等价物的信息。有人知道这是否可能吗?
如果使用 Office OpenXML 文件格式 *.xlsx
,这并不容易。但以下对我有用。
如 apache poi FAQ-N10025 中所述,需要所有模式 ooxml-schemas-1.3.jar
的完整 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();
}
}
代码适应当前 apache poi 5.2.2
:
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 byte[]{(byte)255, 0, 0}, null));
style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
setNamedCellStyle(style, "My Custom Style 1");
style = workbook.createCellStyle();
style.setFillForegroundColor(new XSSFColor(new byte[]{0, (byte)255, 0}, null));
style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
setNamedCellStyle(style, "My Custom Style 2");
style = workbook.createCellStyle();
style.setFillForegroundColor(new XSSFColor(new byte[]{0, 0, (byte)255}, null));
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);
FileOutputStream out = new FileOutputStream("CreateExcelNamedXSSFCellStyle.xlsx");
workbook.write(out);
out.close();
workbook.close();
}
}
我目前正在使用 Apache POI 库在 Java 中生成 excel 个文件。
我想知道的是:在 excel 中,可以创建将添加到工作簿的新单元格样式。这些样式是可重复使用的,可以从样式 table.
中选择使用 Apache POI,您可以在构建工作簿时执行类似的操作。您可以创建一个新的 XSSFCellstyle,它附加到工作簿,并且可以根据需要应用于任意数量的单元格。但是,这些样式不可重复使用。如果我在 excel 中打开生成的工作簿并更改其中一个单元格样式,我将永远无法将其更改回我在 XSSF 中生成的未命名样式。这些样式未添加到工作簿的样式 table。
我只是想知道,是否有任何方法可以在 apache POI 工作簿中创建 named 样式,然后在 [= 中打开文档后可以看到并重新使用这些样式27=]?
编辑:经过进一步调查,似乎有一种方法可以使用 HSSF 执行此操作,我们可以使用:
cellStyle.setUserStyleName("Header")
不过我找不到任何关于 XSSF 等价物的信息。有人知道这是否可能吗?
如果使用 Office OpenXML 文件格式 *.xlsx
,这并不容易。但以下对我有用。
如 apache poi FAQ-N10025 中所述,需要所有模式 ooxml-schemas-1.3.jar
的完整 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();
}
}
代码适应当前 apache poi 5.2.2
:
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 byte[]{(byte)255, 0, 0}, null));
style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
setNamedCellStyle(style, "My Custom Style 1");
style = workbook.createCellStyle();
style.setFillForegroundColor(new XSSFColor(new byte[]{0, (byte)255, 0}, null));
style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
setNamedCellStyle(style, "My Custom Style 2");
style = workbook.createCellStyle();
style.setFillForegroundColor(new XSSFColor(new byte[]{0, 0, (byte)255}, null));
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);
FileOutputStream out = new FileOutputStream("CreateExcelNamedXSSFCellStyle.xlsx");
workbook.write(out);
out.close();
workbook.close();
}
}