我的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
随机推荐
- 使用VBA进行JS加密的反混淆,还原JS代码。
本文地址:http://www.cnblogs.com/Charltsing/p/JSEval.html 联系QQ:564955427 类似下面的代码是登陆 全国企业信用信息公示系统(安徽)(网址:h ...
- DelegatingFilterProxy作用浅析
<filter> <filter-name>secondDomainFilter</filter-name> <filter-class>org.spr ...
- 【学习总结】GirlsInAI ML-diary day-3-数据类型
[学习总结]GirlsInAI ML-diary 总 原博github链接-day3 数据类型 熟悉一下计算时可能碰到的数据类型.(计算时...) 1-打开jupyter,new一个新python文件 ...
- winform自定义控件开发
1.添加控件属性 //添加私有的控件属性 private string djm;//单据名 //添加属性描述 [Browsable(true)] [Description("djm" ...
- react的项目坑
首先在构造页面时 应该将页面的结构分析好. 在处理数据异步时 将数据结构进行完全的简单结构化. 使用redux时 注意返回的数据是深拷贝还是浅拷贝 否则会产生 数组不为空但是没有值的问题 使用自制数据 ...
- C#设计模式之10:状态模式
状态模式 状态模式将合适的Context(上下文)模拟成一个状态机,在这个状态机的内部,由Context来决定整个状态机的状态,再根据不同的状态执行不同的方法.在C#编译器的帮助下,很多语法糖的背后都 ...
- Oracle 强制中止正在执行的SQL语句
-- 1 查询正在执行的sql语句 select b.sid, b.username, b.serial#, a.spid, b.paddr, c.sql_text, b.machine from v ...
- 逻辑斯特回归tensorflow实现
calss #!/usr/bin/python2.7 #coding:utf-8 from __future__ import print_function import tensorflow as ...
- 网络编程--使用UDP发送接收数据
package com.zhangxueliang.udp; import java.io.IOException; import java.net.DatagramPacket; import ja ...
- transform: translate(-50%, -50%) 实现块元素百分比下居中
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...