POI样式
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++){ //获取合并单元格
//获取合并单元格每一个单元格 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 //初始一个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++){ //获取合并单元格
//获取合并单元格每一个单元格 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 == 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 == cell = cRow.createCell(cCellnum); } cell.setCellStyle(styleMap.get("totalStyle")); } return workbook; } public 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 cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN); cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN); cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN); cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); return cellStyle; } private HSSFFont font = workbook.createFont(); font.setFontHeightInPoints(size); font.setColor(color); cellStyle.setFont(font); return cellStyle; } private HSSFFont font = workbook.createFont(); font.setBoldweight(font.BOLDWEIGHT_BOLD); font.setFontHeightInPoints(size); font.setColor(color); cellStyle.setFont(font); return cellStyle; } private 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样式的更多相关文章
- POI样式设置详细解析
````````由于看到网上对poi做报告合成的内容不是很全面, ````````自己最近又有新的需求, 作为勉励, 会慢慢补充详细的样式设置, 希望也能帮到各位 设置段落方向 (默认是纵向, 这里可 ...
- 【POI】对于POI无法处理超大xls等文件,官方解决方法【已解决】【多线程提升速率待定】
本次使用POI处理xlsx文件,莫名的遇到了一个无法逾越的问题. 总共71个xlsx文件,单个文件最大达到50M以上,71个xls文件摆在那里就有3-4G的大小. 在起始处理的时候,发现原本适用于正常 ...
- 报表生成(POI,jquery.table2excel.js,Echarts)
最近公司要弄个报表相关的功能,话不多说,先上图 前一种是POI 生成的,后一种是Echarts生成的.报表我想大家都不陌生,基本上在公司业务中都会使用到.先说说POI,jquery.table2exc ...
- 【POI xlsx】使用POI对xlsx的单元格样式进行设置 / 使用POI对xlsx的字体进行设置
涉及到的样式都在代码中有说明: package com.it.poiTest; import java.io.FileNotFoundException; import java.io.FileOut ...
- [简单]poi word2007表格按模版样式填充行数据
主要实现了按照模版行的样式填充数据,针对的是动态数据,静态数据可以直接替换变量实现,先说下缺点:1)暂未实现特殊样式填充(如列合并(跨行合并)),只能用于普通样式(如段落间距 缩进 字体 对齐)2)数 ...
- POI格式化Cell样式
通过一个实例演示怎样通过POI设置Excel单元格的边框.字体.颜色.大小.下划线.合并.对齐方式. Excel文件如下: Java代码 package my.excel; impor ...
- POI简易帮助文档系列--给Excel设置样式
正如Html需要CSS一样,我们的POI生成的Excel同样需要样式才能更完美的表现我们的数据.下面还是从简单的例子出发,学习和了解POI的样式设计. 一.我的位置. package com.myja ...
- poi的各种单元格样式以及一些常用的配置
之前我做过一个poi到处excel数据的博客,但是,后面使用起来发现,导出的数据单元格样式都不对. 很多没有居中对齐,很多单元格的格式不对,还有就是单元格的大小不对,导致数据显示异常,虽然功能可以使用 ...
- POI导出复杂的excel;excel公共样式类;excel拼接定制类;数据科学计数法转为普通值
一.excel公共样式类(包含数据科学计数法转为普通值) package com.thinkgem.jeesite.common.utils.excel; import org.apache.poi. ...
随机推荐
- hacker101----XSS Review
所有你见过XSS行动在这一点上,但我们来回顾一下今天我们要讨论的XSS类型: 反射型XSS -- 来自用户的输入将直接返回到浏览器,从而允许注入任意内容 [浏览器输入,马上到服务器上,再反射回来直 ...
- C# 保留N位小数
1.只要求保留N位不四舍五入 float f = 0.55555f; int i =(int)(f * 100); f = (float)(i*1.0) ...
- linux--常用工具软件
三大远程连接工具 crt notepad++ filezilla
- [Web 前端] 008 css 颜色表示方法
css 颜色表示法 颜色名表示 如 red 红色 green 绿色 blue 蓝色 16 进制数值表示 常见颜色 正常表示 缩写表示 红色 #ff0000 #f00 绿色 #00ff0 #0f0 蓝色 ...
- linux 阿里云 centos7 环境下安装easymock(一)
一.说一说Easy-mock的使用场景和优点:1.Easy Mock 是一个可视化,并且能快速生成 模拟数据 的持久化服务,2.基于 Swagger 创建项目,以节省手动创建接口的时间,这点也是我搭建 ...
- 漫漫人生路,我们该何去何从! Python让我找到了方向
互联网寒冬 2017年冬天,是我人生中最难熬的一个冬天,其实2017年的冬天并不算太冷,比这冬日的寒风还要严寒的要属这所谓的"互联网寒冬"吧!各大厂裁员的消息充斥着互联网,互联网表 ...
- mysql索引与补充
一, 什么是索引 为什么要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此 ...
- 【摘】sizeof实现
注意sizeof是运算符,而非函数 关于sizeof的两个精巧的宏实现. 非数组的sizeof: #defne _sizeof(T) ( (size_t)((T*)0 + 1)) 数组的sizeof: ...
- ][mybatis]MyBatis mapper文件中的变量引用方式#{}与${}的差别
转自https://blog.csdn.net/szwangdf/article/details/26714603 MyBatis mapper文件中的变量引用方式#{}与${}的差别 默认情况下,使 ...
- MongoDB的使用学习之(一)开篇
本人是菜鸟-1级,整理这个系列,之所以用整理,而不是写,是因为本人不是从头自己读源码,一个一个字母翻译过来的,而是记录整个学习过程,查看别人好的文章,收集好的资料,并有自己的一些项目代码,并从中得到点 ...