添加的maven依赖是

<poi.version>3.15</poi.version>

...

<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>${poi.version}</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>${poi.version}</version>
</dependency>

读取excel中数据的简单写法

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook; import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream; public class Test81 { public static void main(String[] args) { try (InputStream is = new FileInputStream("C:\\Users\\jiashubing\\Desktop\\aaaa.xls");
Workbook book = new HSSFWorkbook(is);) {
Sheet sheet = book.getSheetAt(0); for (int i = 1; i <= sheet.getLastRowNum(); i++) {
for (int j = 0; j < 5; j++) {
Cell cell = sheet.getRow(i).getCell(j);
if (cell != null) {
System.out.println(cell.getStringCellValue());
}
}
}
} catch (IOException e) {
//return;
}
} }

这样读取的是xls 格式的文件

把 Workbook 改成用WorkbookFactory 实现,那么就必须是读xlsx文件: Workbook book = WorkbookFactory.create(is);

  POI的操作中大量使用了坐标,于是新建了一个类,包含四个参数,代表起始坐标 (firstRow,lastRow) 和结束坐标 (firstCol,lastRow) ,在下面的例子中凡是计算合并单元格的时候都会用到

public class ExcelPositionRange {
private int firstRow;
private int firstCol;
private int lastRow;
private int lastCol; public ExcelPositionRange(int firstRow, int firstCol, int lastRow, int lastCol) {
this.firstRow = firstRow;
this.firstCol = firstCol;
this.lastRow = lastRow;
this.lastCol = lastCol;
} public ExcelPositionRange() {
} //... get/set方法
}

获取合并单元格

/**
* 获取合并的单元格
*/
private static ExcelPositionRange getMergedRegionPositionRange(Cell cell) {
Sheet sheet = cell.getSheet();
int row = cell.getRowIndex();
int column = cell.getColumnIndex();
int sheetMergeCount = sheet.getNumMergedRegions(); for (int i = 0; i < sheetMergeCount; ++i) {
CellRangeAddress ca = sheet.getMergedRegion(i);
int firstColumn = ca.getFirstColumn();
int lastColumn = ca.getLastColumn();
int firstRow = ca.getFirstRow();
int lastRow = ca.getLastRow();
if (row >= firstRow && row <= lastRow && column >= firstColumn && column <= lastColumn) {
sheet.getRow(firstRow);
return new ExcelPositionRange(firstRow, firstColumn, lastRow, lastColumn);
}
} return new ExcelPositionRange(row, column, row, column);
}

读取单元格数据内容

/**
* 读取数据内容(参数可以改为Cell)
*
* @param sheet Sheet页面
* @param row 行数
* @param column 列数
* @return 读取的内容
*/
public static String getMergedRegionValue(Sheet sheet, int row, int column) {
int sheetMergeCount = sheet.getNumMergedRegions(); //判断该单元格是否是合并区域的内容
for (int i = 0; i < sheetMergeCount; i++) {
CellRangeAddress ca = sheet.getMergedRegion(i);
int firstColumn = ca.getFirstColumn();
int lastColumn = ca.getLastColumn();
int firstRow = ca.getFirstRow();
int lastRow = ca.getLastRow(); if (row >= firstRow && row <= lastRow) {
if (column >= firstColumn && column <= lastColumn) {
Row fRow = sheet.getRow(firstRow);
return getStringValue(fRow.getCell(firstColumn));
}
}
} return getStringValue(sheet.getRow(row).getCell(column));
} /**
* 获取单元格中的值,转为String类型
*/
private static String getStringValue(Cell cell) {
if (cell == null)
return ""; //其他数据类型当成字符串读取
cell.setCellType(CellType.STRING);
return cell.getStringCellValue();
}

获取单元格的总高、宽度

使用到了“获取合并单元格”那个方法

/**
* 获取单元格的总高度(单位:坐标点)
*/
private static double getTotalHeight(Cell cell) {
ExcelPositionRange tmpRange = getMergedRegionPositionRange(cell);
double totalHeight = 0;
for (int i = tmpRange.getFirstRow(); i <= tmpRange.getLastRow(); i++) {
totalHeight += cell.getSheet().getRow(i).getHeightInPoints();
}
return totalHeight;
} /**
* 获取单元格的总宽度(单位:像素)
*/
private static double getTotalWidth(Cell cell) {
ExcelPositionRange tmpRange = getMergedRegionPositionRange(cell);
double totalWidthInPixels = 0;
for (int i = tmpRange.getFirstCol(); i <= tmpRange.getLastCol(); i++) {
totalWidthInPixels += cell.getSheet().getColumnWidthInPixels(i);
}
return totalWidthInPixels;
}

原创文章,欢迎转载,转载请注明出处!

我的POI代码库(持续更新)的更多相关文章

  1. [转]git提交代码时遇到代码库有更新以及本地有更新的解决方法

    本文转自:https://blog.csdn.net/myphp2012/article/details/80519156 在多人协作开发时,经常碰到同事把最新修改推送到远程库,你在本地也做了修改,这 ...

  2. 基于opencv和QT的摄像头采集代码( GoQTtemplate3持续更新)

    在Linux操作系统上,编写带界面的图像处理程序,选择opencv+QT是一种很好的选择.GoQTtemplate3是我为编写Linux下图像处理程序实现的框架,希望能够为大家解决Linux环境下桌面 ...

  3. 基于opencv和mfc的摄像头采集代码(GOMFCTemplate2)持续更新

            编写带界面的图像处理程序,选择opencv+mfc是一种很好的选择:在读取摄像头数据方面,网上的方法很多,其中shiqiyu的camerads的方法是较好的.       基于现有资料 ...

  4. 【从0開始Tornado建站】0.9版本号python站点代码开源--持续更新中

            从5月份開始[从0開始Tornado建站]这个专栏,開始一点一点把这个分类兴趣站点弄起来,从无到有的过程也是令人兴奋的:-) 国庆的时候等待备案然后上线,如今站点域名为ustchack ...

  5. Phantomjs实用代码段(持续更新中……)

    一.下载 下载链接二.解压安装包 直接解压即可三.配置环境变量 找到高级系统设置,打开它,出现以下图.点击环境变量. 分别点击编辑按钮 分别新建添加当初的解压路径,到bin文件夹.点击确定. 这样,环 ...

  6. 编写高性能的javascript代码(持续更新)

    参考资料: Vanilla JS——世界上最轻量的JavaScript框架(没有之一) http://segmentfault.com/a/1190000000355277 探索高效jQuery的奥秘 ...

  7. C++入职学习篇--代码规范(持续更新)

    C++入职学习篇--代码规范(持续更新) 一.头文件规范 在头文件中大家一般会定义宏.引入库函数.声明.定义全局变量等,在设计时最后进行分类,代码示范(自己瞎琢磨的,请多多指点): #ifndef T ...

  8. Android 常用开源库总结(持续更新)

    前言 收集了一些比较常见的开源库,特此记录(已收录350+).另外,本文将持续更新,大家有关于Android 优秀的开源库,也可以在下面留言. 一 .基本控件 TextView HTextView 一 ...

  9. 知道创宇爬虫题--代码持续更新中 - littlethunder的专栏 - 博客频道 - CSDN.NET

    知道创宇爬虫题--代码持续更新中 - littlethunder的专栏 - 博客频道 - CSDN.NET undefined 公司介绍 - 数人科技 undefined

随机推荐

  1. Oja’s rule

    目录 Oja's rule 背景 Hebbian learning 主要的一些理论 论文里面一些主要的假设 引理1 引理2 引理3 定理1 LEMMA 3(ALL) 引理 4 定理 2 定理 3(关于 ...

  2. 1060E Sergey and Subway(思维题,dfs)

    题意:给出一颗树,现在,给哪些距离为2的点对,加上一条边,问所有点对的距离和 题解:如果没有加入新的边,距离和就会等于每条边的贡献,由于是树,我们用点来代表点上面的边,对于每条边,它的贡献将是(子树大 ...

  3. 关于对于system函数和c++标准下的新的变量定义方式{}

  4. sql中return和returns的区别

    用户定义函数中,用RETURNS 子句指定该函数返回值的数据类型 return用于返回具体的值/值变量

  5. html中怎么设置性别默认选择

    <html><body> <form action="/example/html/form_action.asp" method="get& ...

  6. maven用框架编写网页运行出现HTTP Status 500 - Unable to compile class for JSP

    利用maven整合框架的时候,通过浏览器访问时,如果出现  HTTP 500-Unable to compile class for JSP 的错误,应该怎么解决呢? 之前在网上看了好多人的解决方案. ...

  7. [转帖] 百度知道: KMS 和OSPP

    https://zhidao.baidu.com/question/1819332749671662308.html Key Management Service (KMS).目前Windows Se ...

  8. select into赋值方式

    declare v_price ,);--单价 v_usenum number;--水费字数 v_usenum2 number;--使用吨数 begin v_price:=2.45;--每吨单价 -- ...

  9. MyBatis映射文件2(不支持自增的数据库解决方案/参数处理[单参、多参、命名参数])

    针对Oracle不支持自增的解决方案 Oracle不支持自增,但是它使用序列来模拟自增,每次插入数据的主键是从序列中拿到的值,那么如何获取这个值呢? <insert id="addEm ...

  10. ajax获取值的两种方法

    详细连接https://blog.csdn.net/a1102325298/article/details/80785143 ajax获得表单值的俩种方法 2018年06月23日 17:12:02 延 ...