一:HSSFCellStyle字体
// 生成一个样式
HSSFCellStyle style = workbook.createCellStyle();
// 设置这些样式
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中.net
// 背景色
style.setFillForegroundColor(HSSFColor.YELLOW.index);
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
style.setFillBackgroundColor(HSSFColor.YELLOW.index); 字符串
// 设置边框
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style.setBorderRight(HSSFCellStyle.BORDER_THIN);
style.setBorderTop(HSSFCellStyle.BORDER_THIN);
// 自动换行 这种换行的样式是这样的:get
style.setWrapText(true); string
// 生成一个字体
HSSFFont font = workbook.createFont();
font.setFontHeightInPoints((short) 10);
font.setColor(HSSFColor.RED.index);
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
font.setFontName("宋体");it
// 把字体 应用到当前样式
style.setFont(font);io
//style设置好后,为cell设置样式
cell.setCellStyle(style)//cell为已有的单元格ast
二:class
在Excel处理的过程当中,可能有须要用到行高自适应的时候。
下面贴出用POI实现Excel行高自适应的代码。
该代码能够处理一行Excel按内容自适应高度。能够处理一行内的合并单元格。
可是该代码不支持涉及多行合并单元的计算,之后有空再补上。多行合并单元格的高度获取比较容易,可是其高度自适应就比较麻烦了。
上代码:List
/**
* 根据行内容从新计算行高
* @param row
*/
public static void calcAndSetRowHeigt(HSSFRow sourceRow) {
//原行高
short height = sourceRow.getHeight();
//计算后的行高
double maxHeight = height;
for (int cellIndex = sourceRow.getFirstCellNum(); cellIndex <= sourceRow.getPhysicalNumberOfCells(); cellIndex++) {
HSSFCell sourceCell = sourceRow.getCell(cellIndex);
//单元格的内容
String cellContent = getCellContentAsString(sourceCell);
if(null == cellContent || "".equals(cellContent)){
continue;
}
//单元格的宽度
int columnWidth = getCellWidth(sourceCell);
System.out.println("单元格的宽度 : " + columnWidth + " 单元格的高度 : " + maxHeight + ", 单元格的内容 : " + cellContent);
HSSFCellStyle cellStyle = sourceCell.getCellStyle();
HSSFFont font = cellStyle.getFont(sourceRow.getSheet().getWorkbook());
//字体的高度
short fontHeight = font.getFontHeight();
//cell内容字符串总宽度
double cellContentWidth = cellContent.getBytes().length * 2 * 256;
//字符串须要的行数 不作四舍五入之类的操做
double stringNeedsRows =(double)cellContentWidth / columnWidth;
//小于一行补足一行
if(stringNeedsRows < 1.0){
stringNeedsRows = 1.0;
}
//须要的高度 (Math.floor(stringNeedsRows) - 1) * 40 为两行之间空白高度
double stringNeedsHeight = (double)fontHeight * stringNeedsRows;
if(stringNeedsHeight > maxHeight){
maxHeight = stringNeedsHeight;
}
System.out.println("字体高度 : " + fontHeight + ", 字符串宽度 : " + cellContentWidth + ", 字符串须要的行数 : " + stringNeedsRows + ", 须要的高度 : " + stringNeedsHeight);
System.out.println();
}
//超过原行高三倍 则为3倍 实际应用中可
if(maxHeight/height > 5){
maxHeight = 5 * height;
}
//最后取天花板防止高度不够
maxHeight = Math.ceil(maxHeight);
sourceRow.setHeight((short)maxHeight);
}
/**
* 解析一个单元格获得数据
* @param columnNameList
* @param row
* @param ext2
* @param ext1
* @return
*/
private static String getCellContentAsString(HSSFCell cell) {
if(null == cell){
return "";
}
String result = "";
switch (cell.getCellType()) {
case Cell.CELL_TYPE_NUMERIC:
String s = String.valueOf(cell.getNumericCellValue());
if (s != null) {
if (s.endsWith(".0")) {
s = s.substring(0, s.length() - 2);
}
}
result = s;
break;
case Cell.CELL_TYPE_STRING:
result = ToolKits.nulltoempty(String.valueOf(cell.getStringCellValue())).trim();
break;
case Cell.CELL_TYPE_BLANK:
break;
case Cell.CELL_TYPE_BOOLEAN:
result = String.valueOf(cell.getBooleanCellValue());
break;
case Cell.CELL_TYPE_ERROR:
break;
default:
break;
}
return result;
}
/**
* 获取单元格及合并单元格的宽度
* @param sheet
* @param row
* @param column
* @return
*/
private static int getCellWidth(HSSFCell cell) {
int result = 0;
HSSFSheet sheet = cell.getSheet();
int rowIndex = cell.getRowIndex();
int columnIndex = cell.getColumnIndex();
boolean isPartOfRegion = false;
int firstColumn = 0;
int lastColumn = 0;
int firstRow = 0;
int lastRow = 0;
int sheetMergeCount = sheet.getNumMergedRegions();
for (int i = 0; i < sheetMergeCount; i++) {
Region ca = sheet.getMergedRegionAt(i);
firstColumn = ca.getColumnFrom();
lastColumn = ca.getColumnTo();
firstRow = ca.getRowFrom();
lastRow = ca.getRowTo();
if (rowIndex >= firstRow && rowIndex <= lastRow) {
if (columnIndex >= firstColumn && columnIndex <= lastColumn) {
isPartOfRegion = true;
break;
}
}
}
if(isPartOfRegion){
for (int i = firstColumn; i <= lastColumn; i++) {
result += sheet.getColumnWidth(i);
}
}else{
result = sheet.getColumnWidth(columnIndex);
}
return result;
}
通过上面的方法计算,这种更符合个人需求,貌似格式也没有损坏: