我目前正在使用Apache POI库生成Java中的excel文件。
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();
}
}
我使用Mocha作为测试框架来测试我的Node.js项目。我希望遵循BDD风格来组织我的测试/规范。 我曾经使用cucumber编写一些测试,cucumber使用BDD样式,比如givity-when-then子句。但对于摩卡来说,它使用了不同的语言来“描述”规范。您可以使用嵌套的Description语句来描述规范。我想知道命名摩卡测试的最佳做法是什么。谢了。
命名 程序设计的真正难题是替事物命名及使缓存失效。 ——Phil Karlton 标识符使用英文命名。 # 差 - 标识符使用非 ASCII 字符 заплата = 1_000 # 差 - 标识符使用拉丁文写法的保加利亚单词 zaplata = 1_000 # 好 salary = 1_000 符号、方法、变量使用蛇底式小写(snake_case)。 # 差 :'some symbol' :So
Names 命名 Names are as important in Go as in any other language. They even have semantic effect: the visibility of a name outside a package is determined by whether its first character is upper case. I
通用的约定 尽可能遵守 Apple 的命名约定,尤其是和 内存管理规则 (NARC) 相关的地方。 推荐使用长的、描述性的方法和变量名。 推荐: UIButton *settingsButton; 不推荐: UIButton *setBut;
2.1. 命名 Go语言中的函数名、变量名、常量名、类型名、语句标号和包名等所有的命名,都遵循一个简单的命名规则:一个名字必须以一个字母(Unicode字母)或下划线开头,后面可以跟任意数量的字母、数字或下划线。大写字母和小写字母是不同的:heapSort和Heapsort是两个不同的名字。 Go语言中类似if和switch的关键字有25个;关键字不能用于自定义名字,只能在特定语法结构中使用。 b