一、设置单元格格式。

设置单元格边框、单元格背景颜色、单元格对齐方式、单元格字体,设置自动换行。

/** Description: 设置单元格格式.

* @author : ys.

* @date : 20-3-31 上午11:09

* @param workbook :

* @return: org.apache.poi.ss.usermodel.CellStyle

**/

publicCellStyle setCellStyle(Workbook workbook) {

CellStyle cellStyle=workbook.createCellStyle();//设置边框

cellStyle.setBorderTop(BorderStyle.THIN);

cellStyle.setBorderBottom(BorderStyle.THIN);

cellStyle.setBorderLeft(BorderStyle.THIN);

cellStyle.setBorderRight(BorderStyle.THIN);//设置背景颜色

cellStyle.setFillForegroundColor(IndexedColors.LIGHT_CORNFLOWER_BLUE.getIndex());

cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);//设置对齐方式

cellStyle.setAlignment(HorizontalAlignment.CENTER);

cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//字体设置

Font font =workbook.createFont();

font.setFontName("黑体");

font.setFontHeightInPoints((short) 13);

cellStyle.setFont(font);//内容自动换行

cellStyle.setWrapText(true);returncellStyle;

}

二、获取单元格中的值。

/** Description: 读取单元格的值.

* @author : ys.

* @param cell :单元格对象

* @return: java.lang.String

**/

public staticString getCellValue(Cell cell) {

String cellValue;if (cell == null) {return "";

}switch(cell.getCellType()) {caseNUMERIC:

cellValue=String.valueOf(cell.getNumericCellValue());break;caseSTRING:

cellValue=String.valueOf(cell.getStringCellValue());break;caseBOOLEAN:

cellValue=String.valueOf(cell.getBooleanCellValue());break;caseBLANK:

cellValue= "";break;default:

cellValue= "error";break;

}returncellValue;

}

三、合并单元格的方法。

可使用sheet.addMergedRegion(newCellRangeAddress(firstrow, lastrown, firstcolu, lastcolu)); 直接把指定的区域合并为一个合并单元格。

下列方法是一个简单的运用示例,作用是基于列检验指定区域的值,并把值重复的单元格合并。

/** Description: 指定区域合并单元格.(左闭右开,上闭下开)

* @author : ys.

* @param sheet : 表格

* @param startcolu : 开始列

* @param stopcolu : 结束列

* @param startrow : 开始行

* @param stoprow : 结束行

* @return: void

**/

public void setMergedSomeRegion(Sheet sheet, int startCol, int stopCol, int startRow, intstopRow) {int lastrow =sheet.getPhysicalNumberOfRows();if (stopRow >lastrow) {

stopRow=lastrow;

}for (int colIndex = startCol; colIndex < stopCol; colIndex++) {//合并单元格开始行

int begin =startRow;//记录重复个数

int count = 0;for (int rowIndex = startRow; rowIndex < stopRow - 1; rowIndex++) {

Cell cell1=sheet.getRow(rowIndex).getCell(colIndex);

Cell cell2= sheet.getRow(rowIndex + 1).getCell(colIndex);if(cell1.getStringCellValue().equals(cell2.getStringCellValue())) {

count++;//遇到重复数据时,更新起点

if (count == 1) {

begin=rowIndex;

}

}else if (count > 0) {//值不再重复时合并单元格

startMerge(sheet, begin, begin +count, colIndex, colIndex);

count= 0;

}//处理最后一组数据

if (rowIndex == lastrow - 2 && count > 0) {

startMerge(sheet, begin, begin+count, colIndex, colIndex);

begin= begin + count + 1;

count= 0;

}

}

}

}private void startMerge(Sheet sheet, int firstrow, int lastrow, int firstcol, intlastcol) {//合并指定单元格

sheet.addMergedRegion(newCellRangeAddress(firstrow, lastrow, firstcol, lastcol));//设置合并后单元格的边框

CellRangeAddress region = newCellRangeAddress(firstrow, lastrow, firstcol, lastcol);

RegionUtil.setBorderTop(BorderStyle.THIN, region, sheet);

RegionUtil.setBorderBottom(BorderStyle.THIN, region, sheet);

RegionUtil.setBorderLeft(BorderStyle.THIN, region, sheet);

RegionUtil.setBorderRight(BorderStyle.THIN, region, sheet);

}

四、获取Excel中所有的合并单元格。

合并单元格后只会保留左上角第一个单元格的值,当表格中既有合并单元格,又存在值为空的单元格时,就需要区分这两种单元格。使用sheet的以下方法可以获取到Excel中的所有合并单元格信息,读取到的单元格值为空时,可以通过判断它是否在合并单元格的范围内区分。

public voidgetExcelMergedRegins(Sheet sheet) {//获取合并单元格的范围

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

CellRangeAddress rangeAddress=sheet.getMergedRegion(i);int rowStart =rangeAddress.getFirstRow();int rowEnd =rangeAddress.getLastRow();int columnStart =rangeAddress.getFirstColumn();int columnEnd =rangeAddress.getLastColumn();

}

}

五、导出Excel到指定地址。

此处filename是带有绝对路径的文件名。

关闭流的时候在finally中需要套try catch(关闭两个流的情况需要按顺序写两个try catch),不然coverity扫描会报错...0o0别问我怎么知道的。

public classExcelSummarize {private static final Logger LOG = LoggerBuilder.getLogger(ExcelSummarize.class);/** Description: 导出Excel至指定地址.

* @author : ys.

* @param workbook :

* @param filename :

* @return: void

**/

public voidexportExcelOverwriteLocal(Workbook workbook, String filename) {int count = filename.lastIndexOf("/");

String path= filename.substring(0, count + 1);

FileOutputStream fileOutputStream= null;if (filename.endsWith(".xls") || filename.endsWith(".xlsx")) {try{

File file= newFile(path);if (!file.exists()) {try{

file.mkdirs();

}catch(Exception ex) {

LOG.info("Create path failed!", ex);

}

}

fileOutputStream= newFileOutputStream(filename);

workbook.write(fileOutputStream);

LOG.info("Output excel success!");

}catch(IOException ex) {

LOG.info("Output excel error!", ex);

}finally{try{

workbook.close();if (fileOutputStream != null) {

fileOutputStream.close();

}

}catch(IOException ex) {

LOG.error("Close stream error!", ex);

}

}

}else{

LOG.error("Input excel filename format error!");

}

}

}

java读取合并单元格_Java POI常用方法,读取单元格的值,设置单元格格式,合并单元格,获取已合并的单元格,导出至本地等...相关推荐

  1. java poi读取word中附件_java poi word读取

    用 poi 读取word文件 . 老是报错 org.apache.poi.poifs.filesystem.NotOLE2FileException: Invalid header signature ...

  2. java excel row遍历空_Java poi读取,写入Excel,处理row和cell可能为空的情况

    首先需要导入包 import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.poifs.filesystem.NP ...

  3. java excel 多列排序_java poi处理excel多sheet并实现排序

    需求:有一个数据字典全量汇总表,其中第一个sheet为目录,包括编号和表名,第二个以后为表的明细.其中sheet名就是表名但无序,sheet内字段序号无序有空行 现在要求将其中101,104,107, ...

  4. java删除word中批注_Java 添加、读取和删除 Excel 批注的操作代码

    批注是一种富文本注释,常用于为指定的Excel单元格添加提示或附加信息. Free Spire.XLS for Java为开发人员免费提供了在Java应用程序中对Excel文件添加和操作批注的功能. ...

  5. java heap space 什么意思_java heap space解决方法和JVM参数设置

    因为程序要从数据读取近10W行记录处理,当读到9W的时候就出现 java.lang.OutOfMemoryError: Java heap space 这样的错误. 在网上一查可能是JAVA的堆栈设置 ...

  6. java tr合并单元格_java poi合并单元格问题

    使用poi导出的execl合并单元格,会出现下图问题 整个单元格看似合并了,但是文字没有垂直居中,而且execl中所有的合并都会在第三行开始出现灰色分层样式 合并单元格伪代码 String upCom ...

  7. java合并sheet行_java poi Excel循环合并行

    //Java poi 实现循环合并行,还是第一次遇到这种问题 //在网上查了很多资料,都不是自己想要的 //以下为自己研究后,写的一点东西,给大家分享,希望对大家能有思路上的启发,也希望大家能提出宝贵 ...

  8. java poi读取word中附件_Java POI导入word, 带图片

    1.导入文件示例,word中简历表格模板 2.代码示例分两部分,一部分读取图片 /** * 导入word(基本信息,word格式) * @param staffId * @param baseInfo ...

  9. java如何解析word大纲_Java POI 解析word文档

    实现步骤: 1.poi实现word转html 2.模型化解析html 3.html转Map数组 Map数组(数组的操作处理不做说明) 1.导jar包. 2.代码实现 package com.web.o ...

最新文章

  1. 《大型网站技术架构》《K8S进阶实战》等书籍!送45本!读完工资多个0!
  2. 无需服务器的个人博客 (2018.5.22更新)
  3. 分治法的关键特征_你真的读懂《OKR工作法》了吗?
  4. JVM内存状况查看方法和分析工具
  5. C#者重建C++之路 - 运行机制的差异
  6. spring 发送html邮件,Springboot2.0 发送HTML 格式的邮件。
  7. 您对光纤损耗了解多少?知道如何计算吗?
  8. 04.并发和互斥.md
  9. 前端学习(2655):vue2中用ref实现计算器
  10. scala的map映射问题
  11. 问题三十六:ray tracing中的Inverse Mapping(0)——概要
  12. 夏令营讲课内容整理 Day 6 Part 3.
  13. 2022-04-08美团笔试练题
  14. Android手机写Java代码的软件
  15. 用V实现电脑给手机开热点快乐上网
  16. 花花世界迷人眼,没有实力别赛脸,做Python实力派(万字精华,初学者,收藏必备!!!)
  17. c++实现推箱子游戏(带链表)
  18. 教师是唯一无法被人工智能取代的职业
  19. CVE-2017-8464震网3.0漏洞分析与复现
  20. 选择大于努力,但是你不知道后半句

热门文章

  1. 任何人都可以胜任全栈开发?
  2. 程序员过关斩将:小小的分页引发的加班血案
  3. 12 月 Web 服务器调查:“王者” nginx 增长最快!
  4. 马云:CFO 不能做 CEO;腾讯推短视频“哈皮”;三星中国份额跌至 2% | 极客头条...
  5. 华米OV坐不住了!九大手机厂商围剿微信小程序
  6. 华强北突围:比特币挖矿机成了最赚钱的生意
  7. 北京java培训机构收费,Java开发者必看
  8. python中字典的用法_Python字典操作用法总结
  9. mysql索引如何分裂节点_从MySQL Bug#67718浅谈B+树索引的分裂优化(转)
  10. linux系统 看com口,Linux如何设置com1口,让超级终端通过com1口进行登录