5.POI样式

在Excel应用中,会需要用到各种样式,包括单元格背景色、边框、高度、宽度、内容相对位置、字体格式、字体大小、字体颜色等等。POI提供了一系列的样式,能满足我们一般开发中的需求。

5.1 POI样式相关类

POI设置Excel样式主要通过以下几个相关类:

参数

说明

HSSFCellStyle

POI样式类

HSSFFont

字体样式类

HSSFColor

颜色类

HSSFBorderFormatting

边框样式类

HSSFCellStyle是最基本的样式类。HSSFCellStyle可以直接对上下左右四个边框、内容相对位置、单元格背景色、单元格填充方式、数字格式等进行设置。

HSSFFont是字体样式类,需set到HSSFCellStyle生效。HSSFFont可以设置字体样式、字体大小、字体颜色等。

HSSFColor是颜色类,该类里面有大部分基本颜色属性,提供基本颜色的直接调用。

5.2 单元格边框样式

单元格边框分为上、下、左、右四部分,可以设置其边框的宽度、样式及颜色。边框默认为无边框,若加上边框默认为黑色。

现在为一行10个单元格全部加上边框(细),并设置颜色为红色。

代码片段:

public static HSSFWorkbook write(InputStream inputStream) throws IOException, ClassNotFoundException{

//初始一个workbook

HSSFWorkbook workbook = new HSSFWorkbook(inputStream);

//获取样式

HSSFCellStyle style = createCellStyle(workbook);

//创建一个sheet

HSSFSheet sheet = workbook.getSheetAt(0);

HSSFRow row = sheet.createRow(1);

for(int cellnum = 0; cellnum < 10; cellnum++){

HSSFCell cell = row.createCell(cellnum);

cell.setCellStyle(style);

}

return workbook;

}

/**

* 设置单元格的边框(细)且为红色

* @param workbook

* @param cellnum

* @return

*/

public static HSSFCellStyle createCellStyle(HSSFWorkbook workbook){

HSSFCellStyle style = workbook.createCellStyle();

//设置上下左右四个边框宽度

style.setBorderTop(HSSFBorderFormatting.BORDER_THIN);

style.setBorderBottom(HSSFBorderFormatting.BORDER_THIN);

style.setBorderLeft(HSSFBorderFormatting.BORDER_THIN);

style.setBorderRight(HSSFBorderFormatting.BORDER_THIN);

//设置上下左右四个边框颜色

style.setTopBorderColor(HSSFColor.RED.index);

style.setBottomBorderColor(HSSFColor.RED.index);

style.setLeftBorderColor(HSSFColor.RED.index);

style.setRightBorderColor(HSSFColor.RED.index);

return style;

}

输出结果:

图24

5.3 单元格背景色

单元格背景色填充涉及到填充颜色和填充方式,现以最常用的填充方式填充天蓝色背景。

代码片段:

在上面代码中加入:

//设置单元格背景色

style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);

style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

输出结果:

图25

注:单元格背景色暂不做详解,在附录中我会列出颜色作为开发参考。

5.4 单元格字体格式

字体格式包括书写体、颜色、大小、加粗、斜体、下划线、删除线等。

以下为POI中字体默认属性:

字体属性

Default

书写体

宋体

颜色

黑色

大小

12 有待考证

加粗

斜体

下划线

删除线

现将字体设置为幼圆、9px、颜色黄色、加粗、斜体、下划线、删除线作为示例。

代码片段:

在上面代码中加入:

设置数据到单元格代码片段(略)

//设置字体格式

HSSFFont font = workbook.createFont();

font.setFontName("幼圆");

font.setFontHeightInPoints((short)9);

font.setColor(HSSFColor.YELLOW.index);

font.setBoldweight(font.BOLDWEIGHT_BOLD);

font.setItalic(true);

font.setStrikeout(true);

font.setUnderline((byte)1);

//将字体格式设置到HSSFCellStyle上

style.setFont(font);

输出结果:

图26

5.5 单元格对齐方式

单元格的对齐方式是针对单元格中的内容,单元格中的内容可以靠左、靠右、靠上、靠下、以及垂直居中、水平居中等等。

针对以上各种对齐方式,将目前6.4中输出结果Excel基础上进行微调后操作,将目前基本对齐方式进行展示。

代码片段:

public static HSSFWorkbook write(InputStream inputStream) throws IOException, ClassNotFoundException{

//初始一个workbook

HSSFWorkbook workbook = new HSSFWorkbook(inputStream);

//创建一个sheet

HSSFSheet sheet = workbook.getSheetAt(0);

HSSFRow row = sheet.getRow(1);

for(int cellnum = 0; cellnum < 13; cellnum++){

HSSFCell cell = row.getCell(cellnum);

//获取样式

HSSFCellStyle style = createCellStyle(workbook);

cell.setCellStyle(style);

}

return workbook;

}

/**

* 设置单元格的边框(细)且为红色

* @param workbook

* @param cellnum

* @return

*/

public static HSSFCellStyle createCellStyle(HSSFWorkbook workbook){

HSSFCellStyle style = workbook.createCellStyle();

//设置上下左右四个边框宽度

style.setBorderTop(HSSFBorderFormatting.BORDER_THIN);

style.setBorderBottom(HSSFBorderFormatting.BORDER_THIN);

style.setBorderLeft(HSSFBorderFormatting.BORDER_THIN);

style.setBorderRight(HSSFBorderFormatting.BORDER_THIN);

//设置上下左右四个边框颜色

style.setTopBorderColor(HSSFColor.RED.index);

style.setBottomBorderColor(HSSFColor.RED.index);

style.setLeftBorderColor(HSSFColor.RED.index);

style.setRightBorderColor(HSSFColor.RED.index);

//设置单元格背景色

style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);

style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

//设置字体格式

HSSFFont font = workbook.createFont();

font.setFontName("幼圆");

font.setFontHeightInPoints((short)9);

font.setColor(HSSFColor.YELLOW.index);

font.setBoldweight(font.BOLDWEIGHT_BOLD);

font.setItalic(true);

font.setStrikeout(true);

font.setUnderline((byte)1);

//将字体格式设置到HSSFCellStyle上

style.setFont(font);

//设置单元格居中方式

setCellAlign(style);

return style;

}

private static void setCellAlign(HSSFCellStyle style){

switch (num) {

case 0:

//此单元格格式暂不动,默认进行对照

num++;

break;

case 1:

style.setAlignment(HSSFCellStyle.ALIGN_LEFT);//靠左

num++;

break;

case 2:

style.setAlignment(HSSFCellStyle.ALIGN_RIGHT);//靠右

num++;

break;

case 3:

style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中

num++;

break;

case 4:

style.setVerticalAlignment(HSSFCellStyle.VERTICAL_TOP);//垂直靠上

num++;

break;

case 5:

style.setVerticalAlignment(HSSFCellStyle.VERTICAL_BOTTOM);//垂直靠下

num++;

break;

case 6:

style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中

num++;

break;

case 7:

style.setVerticalAlignment(HSSFCellStyle.VERTICAL_JUSTIFY);//垂直平铺

num++;

break;

case 8:

style.setAlignment(HSSFCellStyle.ALIGN_CENTER_SELECTION);//跨列居中

num++;

break;

case 9:

style.setAlignment(HSSFCellStyle.ALIGN_FILL);//填充

num++;

break;

case 10:

style.setAlignment(HSSFCellStyle.ALIGN_GENERAL);//普通默认

num++;

break;

case 11:

style.setAlignment(HSSFCellStyle.ALIGN_JUSTIFY);//两端对齐

num++;

break;

case 12:

style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//水平居中且垂直居中

style.setAlignment(HSSFCellStyle.ALIGN_CENTER);

num++;

break;

}

}

输出结果:

图27

5.6 单元格数字格式化

实际应用开发中,涉及到大量的数据,而各行、各列数据的格式不尽相同,有要求整数型,有要求精确到小数点两位等。解决此类问题一种方式是我们用 java将数据进行format后输出,但此种情况导致的问题是输出数据格式为String类型。在这里POI为我们提供了单元格数据格式化的方法。

现将Excel中创建4个单元格依上面的样式,并设置每个单元格的值都是double count =666.1415926;然后进行下面的format。

代码片段:

private static void setCellFormat(HSSFWorkbook workbook, HSSFCellStyle style){

HSSFDataFormat format = workbook.createDataFormat();

switch (num) {

case 0:

//此单元格格式暂不动,默认进行对照

num++;

break;

case 1:

style.setDataFormat(format.getFormat("##.00"));

num++;

break;

case 2:

style.setDataFormat(format.getFormat("##.000"));

num++;

break;

case 3:

style.setDataFormat(format.getFormat("###"));

num++;

break;

}

}

输出结果:

图28

注:POI中的数字格式化支持四舍五入。

5.7单元格宽度与高度

Excel默认的单元格宽度与高度有限,如果我们写入的内容比较长或者需要换行等都涉及到调整宽度与高度。所以需要进行单元格的宽度与高度设置。

这个设置很简单,通过HSSFSheet设置整列的宽度,通过HSSFRow设置正行的高度。POI中宽度、高度设置需要换算,换算单位如下:

单位

用法(10px)

高度

15.625

15.625*10

宽度

35.7

35.7*10

现在做一个示范,将Excel的第一、二行设置为高度为40px(两种方法),A列宽度为80px。

代码片段:

public static HSSFWorkbook write(InputStream inputStream) throws IOException, ClassNotFoundException{

//初始一个workbook

HSSFWorkbook workbook = new HSSFWorkbook(inputStream);

//创建一个sheet

HSSFSheet sheet = workbook.getSheetAt(0);

HSSFRow row0 = sheet.createRow(0);

HSSFRow row1 = sheet.createRow(1);

//设置行高40px

row0.setHeight((short)(15.625*40));

row1.setHeightInPoints((float)40);

//设置列宽100px

sheet.setColumnWidth(0, (int)35.7*100);

return workbook;

}

输出结果:

图29

5.8 合并单元格样式

单元格合并后依然是N个单元格,所以目前在设置合并后的单元格样式时需要分解每一个单元格去设置。

如下图,我们将标题行合并单元格加边框、背景色等样式。

图30

代码片段:

public static HSSFWorkbook write(InputStream inputStream) throws IOException, ClassNotFoundException{

//初始一个workbook

HSSFWorkbook workbook = new HSSFWorkbook(inputStream);

//获取第一张sheet

HSSFSheet sheet = workbook.getSheet("合并单元格");

//准备样式

Map<String,HSSFCellStyle> styleMap = createCellStyle(workbook);

//循环所有的合并单元格

for(int numMR = 0; numMR < sheet.getNumMergedRegions(); numMR++){

//获取合并单元格

Region region = sheet.getMergedRegionAt(numMR);

//获取合并单元格每一个单元格

for(int rownum = region.getRowFrom(); rownum <= region.getRowTo(); rownum++){

HSSFRow row = sheet.getRow(rownum);

for(int cellnum = region.getColumnFrom(); cellnum <= region.getColumnTo(); cellnum++){

HSSFCell cell = row.getCell(cellnum);

if(cell == null){

cell = row.createCell(cellnum);

}

cell.setCellStyle(styleMap.get("titleStyle"));

}

}

}

return workbook;

}

输出结果:

图31

5.9 Excel样式实例

根据前面7小节的内容,我们将Excel的样式进行规范下的使用与展示。

将下图中的Excel

1)   标题行(第一、二行)填充为背景天蓝色,标题的字体设置为红色、加粗、12px,标题单元格设置为细边框,垂直且水平居中。

2)   内容数据设置为黑色、9px,内容单元格为细边框

3)   总计行填充为背景黄色,字体9px、黑色加粗,单元格为细边框

图32

代码片段:

public
static
HSSFWorkbook write(InputStream inputStream) throws IOException, ClassNotFoundException{

//初始一个workbook

HSSFWorkbook workbook = new HSSFWorkbook(inputStream);

//获取第一张sheet

HSSFSheet sheet = workbook.getSheet("Sheet1");

//准备样式

Map<String,HSSFCellStyle> styleMap = createCellStyle(workbook);

//设置标题行样式

for(int numMR = 0; numMR < sheet.getNumMergedRegions(); numMR++){

//获取合并单元格

Region region = sheet.getMergedRegionAt(numMR);

//获取合并单元格每一个单元格

for(int rownum = region.getRowFrom(); rownum <= region.getRowTo(); rownum++){

HSSFRow row = sheet.getRow(rownum);

for(int cellnum = region.getColumnFrom(); cellnum <= region.getColumnTo(); cellnum++){

HSSFCell cell = row.getCell(cellnum);

if(cell ==
null){

cell = row.createCell(cellnum);

}

cell.setCellStyle(styleMap.get("titleStyle"));

}

}

}

//设置内容样式

for(int cRowNum = 2; cRowNum < sheet.getLastRowNum(); cRowNum++){

HSSFRow cRow = sheet.getRow(cRowNum);

for(int cCellnum = 0; cCellnum < cRow.getLastCellNum(); cCellnum++){

HSSFCell cell = cRow.getCell(cCellnum);

cell.setCellStyle(styleMap.get("contentStyle"));

}

}

//设置总计样式

HSSFRow cRow = sheet.getRow(sheet.getLastRowNum());

for(int cCellnum = 0; cCellnum < cRow.getLastCellNum(); cCellnum++){

HSSFCell cell = cRow.getCell(cCellnum);

if(cell ==
null){

cell = cRow.createCell(cCellnum);

}

cell.setCellStyle(styleMap.get("totalStyle"));

}

return workbook;

}

public
static
Map<String, HSSFCellStyle> createCellStyle(HSSFWorkbook workbook){

Map<String, HSSFCellStyle> styleMap = new HashMap<String, HSSFCellStyle>();

//标题格式

HSSFCellStyle titleStyle = workbook.createCellStyle();

titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);

titleStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);

setCellBorderStyle(titleStyle);

setBoldCellFontStyle(workbook, titleStyle, (short)10, HSSFColor.RED.index);

setBackgroundStyle(titleStyle, HSSFColor.SKY_BLUE.index);

styleMap.put("titleStyle", titleStyle);

//内容样式

HSSFCellStyle contentStyle = workbook.createCellStyle();

setCellBorderStyle(contentStyle);

setSimpleCellFontStyle(workbook, contentStyle, (short)9, HSSFColor.BLACK.index);

styleMap.put("contentStyle", contentStyle);

//总计样式

HSSFCellStyle totalStyle = workbook.createCellStyle();

setCellBorderStyle(totalStyle);

setBoldCellFontStyle(workbook, totalStyle, (short)9, HSSFColor.BLACK.index);

setBackgroundStyle(totalStyle, HSSFColor.YELLOW.index);

styleMap.put("totalStyle", totalStyle);

return styleMap;

}

private
static
HSSFCellStyle setCellBorderStyle(HSSFCellStyle cellStyle){

cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);

cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);

cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);

cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);

return cellStyle;

}

private
static
HSSFCellStyle setSimpleCellFontStyle(HSSFWorkbook workbook,HSSFCellStyle cellStyle,
short size, short color){

HSSFFont font = workbook.createFont();

font.setFontHeightInPoints(size);

font.setColor(color);

cellStyle.setFont(font);

return cellStyle;

}

private
static
HSSFCellStyle setBoldCellFontStyle(HSSFWorkbook workbook,HSSFCellStyle cellStyle,
short size, short color){

HSSFFont font = workbook.createFont();

font.setBoldweight(font.BOLDWEIGHT_BOLD);

font.setFontHeightInPoints(size);

font.setColor(color);

cellStyle.setFont(font);

return cellStyle;

}

private
static
HSSFCellStyle setBackgroundStyle(HSSFCellStyle cellStyle,
short
color){

cellStyle.setFillForegroundColor(color);

cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

return cellStyle;

}

输出结果:

原博:http://blog.csdn.net/yuzhenling/article/details/48133053

参考资料:

http://blog.csdn.net/sdm_seven/article/details/8348359

POI样式的更多相关文章

  1. POI样式设置详细解析

    ````````由于看到网上对poi做报告合成的内容不是很全面, ````````自己最近又有新的需求, 作为勉励, 会慢慢补充详细的样式设置, 希望也能帮到各位 设置段落方向 (默认是纵向, 这里可 ...

  2. 【POI】对于POI无法处理超大xls等文件,官方解决方法【已解决】【多线程提升速率待定】

    本次使用POI处理xlsx文件,莫名的遇到了一个无法逾越的问题. 总共71个xlsx文件,单个文件最大达到50M以上,71个xls文件摆在那里就有3-4G的大小. 在起始处理的时候,发现原本适用于正常 ...

  3. 报表生成(POI,jquery.table2excel.js,Echarts)

    最近公司要弄个报表相关的功能,话不多说,先上图 前一种是POI 生成的,后一种是Echarts生成的.报表我想大家都不陌生,基本上在公司业务中都会使用到.先说说POI,jquery.table2exc ...

  4. 【POI xlsx】使用POI对xlsx的单元格样式进行设置 / 使用POI对xlsx的字体进行设置

    涉及到的样式都在代码中有说明: package com.it.poiTest; import java.io.FileNotFoundException; import java.io.FileOut ...

  5. [简单]poi word2007表格按模版样式填充行数据

    主要实现了按照模版行的样式填充数据,针对的是动态数据,静态数据可以直接替换变量实现,先说下缺点:1)暂未实现特殊样式填充(如列合并(跨行合并)),只能用于普通样式(如段落间距 缩进 字体 对齐)2)数 ...

  6. POI格式化Cell样式

    通过一个实例演示怎样通过POI设置Excel单元格的边框.字体.颜色.大小.下划线.合并.对齐方式. Excel文件如下: Java代码   package my.excel;       impor ...

  7. POI简易帮助文档系列--给Excel设置样式

    正如Html需要CSS一样,我们的POI生成的Excel同样需要样式才能更完美的表现我们的数据.下面还是从简单的例子出发,学习和了解POI的样式设计. 一.我的位置. package com.myja ...

  8. poi的各种单元格样式以及一些常用的配置

    之前我做过一个poi到处excel数据的博客,但是,后面使用起来发现,导出的数据单元格样式都不对. 很多没有居中对齐,很多单元格的格式不对,还有就是单元格的大小不对,导致数据显示异常,虽然功能可以使用 ...

  9. POI导出复杂的excel;excel公共样式类;excel拼接定制类;数据科学计数法转为普通值

    一.excel公共样式类(包含数据科学计数法转为普通值) package com.thinkgem.jeesite.common.utils.excel; import org.apache.poi. ...

随机推荐

  1. Python笔记(二十三)_魔法方法_字符串的魔法方法

    __str__和__repr__ 如果要把一个类的实例变成字符串,就需要实现魔法方法__str__()和__repr__ >>>class A: def name(self): re ...

  2. js中ajax请求返回的数据处理成数组后,局部变量赋值给全局变量后,为空

    第二步是想把ss的值扔给res_r,两个数组直接相等即可,可谁想到,取出来的值是空. 如图取出来的值是空. 我一脸懵逼,调试了些许时间,最后把ss遍历一下,在重新push进res_r 再来看效果,已经 ...

  3. sql exist 和not exist(转载)

    exists : 强调的是是否返回结果集,不要求知道返回什么, 比如:  select name from student where sex = 'm' and mark exists(select ...

  4. TCP 和 UDP 的区别---还有一个UTP一

    面试的时候会经常问到这些问题,所以要对比了解一下他们之间的差别,能讲出个所以然来.多积累多总结,懵逼中... TCP 和 UDP TCP与UDP基本区别 : 1.基于连接与无连接 2.TCP要求系统资 ...

  5. java视频资源

    1.Java基础阶段 尚学堂_刘凯立_JavaSE基础视频 http://pan.baidu.com/s/1geCoY11 尚学堂_高淇_Java300集视频教程 https://pan.baidu. ...

  6. 计算机体系结构——流水线技术(Pipelining)

    本文导读: 一.并行技术 .并行技术分类 .新技术的设计与实现 .指令周期 二.流水线技术 .什么是流水线 .指令重叠方式 .流水工作设计 .流水线的描述方法(时空图) .流水线特点 三.流水线的分类 ...

  7. 07-Log日志

    # 1. 日志相关概念 - 日志的级别(level) - 不同的用户关注不同的程序信息 - DEBUG - INFO - NOTICE - WARNING - ERROR - CRITICAL - A ...

  8. 读取FTP上的excel文件,并写入数据库

    今天遇到一些问题,需要从ftp上读取一些excel文件,并需要将excel中的数据写入到数据库,这样就可以通过管理页面查看这些数据. 我将相关工作分为三步,1.从ftp上读取相关文件,并将excel文 ...

  9. Firewalld--01 防火墙安全、基本指令、区域配置

    目录 Firewalld防火墙安全.基本指令.区域配置 1. 防火墙安全基本概述 2. 防火墙使用区域管理 3. 防火墙基本指令参数 4.防火墙区域配置策略 Firewalld防火墙安全.基本指令.区 ...

  10. python pip安装模块报错 "Can't connect to HTTPS URL because the SSL module is not available."

    在升级python版本为3.6之后,pip安装模块报错. 报错信息如图: 原因是系统自带的openssl版本与python3的版本不匹配,所以这里只要升级openssl版本就可以解决问题. yum - ...