我的POI代码库(持续更新)
添加的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代码库(持续更新)的更多相关文章
- [转]git提交代码时遇到代码库有更新以及本地有更新的解决方法
本文转自:https://blog.csdn.net/myphp2012/article/details/80519156 在多人协作开发时,经常碰到同事把最新修改推送到远程库,你在本地也做了修改,这 ...
- 基于opencv和QT的摄像头采集代码( GoQTtemplate3持续更新)
在Linux操作系统上,编写带界面的图像处理程序,选择opencv+QT是一种很好的选择.GoQTtemplate3是我为编写Linux下图像处理程序实现的框架,希望能够为大家解决Linux环境下桌面 ...
- 基于opencv和mfc的摄像头采集代码(GOMFCTemplate2)持续更新
编写带界面的图像处理程序,选择opencv+mfc是一种很好的选择:在读取摄像头数据方面,网上的方法很多,其中shiqiyu的camerads的方法是较好的. 基于现有资料 ...
- 【从0開始Tornado建站】0.9版本号python站点代码开源--持续更新中
从5月份開始[从0開始Tornado建站]这个专栏,開始一点一点把这个分类兴趣站点弄起来,从无到有的过程也是令人兴奋的:-) 国庆的时候等待备案然后上线,如今站点域名为ustchack ...
- Phantomjs实用代码段(持续更新中……)
一.下载 下载链接二.解压安装包 直接解压即可三.配置环境变量 找到高级系统设置,打开它,出现以下图.点击环境变量. 分别点击编辑按钮 分别新建添加当初的解压路径,到bin文件夹.点击确定. 这样,环 ...
- 编写高性能的javascript代码(持续更新)
参考资料: Vanilla JS——世界上最轻量的JavaScript框架(没有之一) http://segmentfault.com/a/1190000000355277 探索高效jQuery的奥秘 ...
- C++入职学习篇--代码规范(持续更新)
C++入职学习篇--代码规范(持续更新) 一.头文件规范 在头文件中大家一般会定义宏.引入库函数.声明.定义全局变量等,在设计时最后进行分类,代码示范(自己瞎琢磨的,请多多指点): #ifndef T ...
- Android 常用开源库总结(持续更新)
前言 收集了一些比较常见的开源库,特此记录(已收录350+).另外,本文将持续更新,大家有关于Android 优秀的开源库,也可以在下面留言. 一 .基本控件 TextView HTextView 一 ...
- 知道创宇爬虫题--代码持续更新中 - littlethunder的专栏 - 博客频道 - CSDN.NET
知道创宇爬虫题--代码持续更新中 - littlethunder的专栏 - 博客频道 - CSDN.NET undefined 公司介绍 - 数人科技 undefined
随机推荐
- 单链表的基本操作--c++
#include <iostream> //实现单链表的建立,测长和打印 #include <string> using namespace std; struct node ...
- Linux—vim常用命令
vim常用命令: 1. 键入i进入编辑模式2. esc进入命令模式3. a,进入编辑模式3. b,光标移动到单词前,end,光标移动到行尾4. home光标移动到行首5. cc,删除当前行,并进入编辑 ...
- P66 整环的零元
R/I=0的零因子是0+I吗? 如果不是,那请问R/I的零因子是什么呢? R/I没有零因子 R/I的零元 是I中的元素定义的等价类 么 a是理想I的元素,自然也是R的元素
- 网络七层模型及TCP、UDP,一次HTTP请求都发生了什么
一.七层网络模型 http协议运行在应用层 二.TCP-UDP TCP.UDP协议的区别 一次Http 请求,这个过程都发生了什么 TCP 协议如何保证可靠传输 HTTP和HTTPS的区别 TCP ...
- 【转】安装ambari的时候遇到的ambari和hadoop问题集
5.在安装的时候遇到的问题 5.1使用ambari-server start的时候出现ERROR: Exiting with exit code -1. 5.1.1REASON: Ambari Ser ...
- Docker存储驱动Device Mapper,Overlay,AUFS
Docker存储驱动之Device Mapper简介 - BookShu - 博客园https://www.cnblogs.com/styshoo/p/6528762.html Docker存储驱动之 ...
- 通过arcmap发布缓存服务,无法选择自定义方案
出现该问题是因为缓存目录有该缓存信息,清楚掉之后就可以选择自定义方案了
- babel (二) update to v7
一.rootmode In 7.1, we've introduced a rootMode option for further lookup if necessary. 二.Remove prop ...
- [转帖]Docker save and load镜像保存
Docker save and load镜像保存 https://www.cnblogs.com/zhuochong/p/10064350.html docker save 和 load 以及 imp ...
- C# Note30: 网络爬虫
用C#实现网络爬虫(一) 用C#实现网络爬虫(二) 基于C#.NET的高端智能化网络爬虫(一)(反爬虫哥必看) 基于C#.NET的高端智能化网络爬虫(二)(攻破携程网) C#获取网页内容的三种方式