前段时间帮朋友弄一个对excel文件操作的方法,大功告成后特此分享出来,以便后面用到后可以直接CTRL+C&CTRL+V。
这里一是读取excel表格中的数据(包含表格中的公式及各种复杂数据类型),二是修改excel表格中某一个单元格中的数据(并且保证修改后表格中的公式计算得到的数能够实时刷新)。
其实像这种工具类网上搜一下全是,但是大部分都是非常混乱的有头没尾的对自己的业务无法应用的或者根本就是看不懂,下面这些方法是我结合网上某些例子及参考其他资料整理出的一款非常使用且简单易懂的excel工具类,欢迎欣赏和借鉴。
废话不多话直接上代码。
注:以下通过Java对excel操作采用的是apache下的poi来完成。
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>3.17-beta1</version>
</dependency>
根据不同的excel表格类型创建对应的工作簿Workbook:
/**
* 根据文件格式创建Workbook
* @param filePath
* @return
*/
private static Workbook createWorkbook(String filePath) {
//文件后缀名
String extString = filePath.substring(filePath.lastIndexOf("."));
try {
InputStream is = new FileInputStream(filePath);
//如果文件后缀名为xls
if (".xls".equals(extString)) {
this.wb = new HSSFWorkbook(is);
}//如果文件后缀名为xlsx
else if (".xlsx".equals(extString)) {
this.wb = new XSSFWorkbook(is);
} else {
this.wb = null;
}
}catch (Exception e) {
e.printStackTrace();
}
return wb;
}
解析单元格中的数据:
/**
* 解析单元格中的内容
* @param cell 单元格
* @return 单元格中的数据
*/
private static Object getCellFormatValue(Cell cell){
Object cellValue = null;
if(cell!=null){
if (0 == cell.getCellType()) {
//判断cell是否为日期格式
if(DateUtil.isCellDateFormatted(cell)){
cellValue = cell.getDateCellValue();
}else {
//处理整型
cellValue = cell.getNumericCellValue();
//百分比数值
String showValue= CellFormat.getInstance(cell.getCellStyle().getDataFormatString()).apply(cell).text;
if (showValue.indexOf("%") != -1) {
cellValue = showValue;
}
}
}else if(1 == cell.getCellType()){
//字符串类型
cellValue = cell.getRichStringCellValue().getString();
}else if(2 == cell.getCellType()) {
//表达式
cellValue = CellFormat.getInstance(cell.getCellStyle().getDataFormatString()).apply(cell).text;
}else if (4 == cell.getCellType()) {
//boolean类型
cellValue = cell.getBooleanCellValue();
}
}
return cellValue;
}
读取excel表格中的数据:
public static List<Map<Object,Object>> readExcelData(File file) {
//用来存放表中数据
List<Map<Object,Object>> mapList = null;
Workbook wb =null;
String filePath = "E:\\电价简化.xlsx";
//创建Workbook对象
wb = createWorkbook(filePath,wb);
//如果文件不为空
if(wb != null){
mapList = new ArrayList<>();
//获取第一个sheet
Sheet sheet = wb.getSheetAt(0);
//获取最大行数
int rownum = sheet.getPhysicalNumberOfRows();
//获取第一行
Row row = sheet.getRow(0);
//获取最大列数
int colnum = row.getPhysicalNumberOfCells();
//循环行
Object cellData = null;
Map<Object,Object> data = null;
for (int i = 0; i< rownum; i++) {
//从第一行开始,获取每一行的数据
row = sheet.getRow(i);
if(row !=null){
data = new LinkedHashMap<>();
//循环列,拿到这一行中每一列的内容
for (int j=0;j<colnum;j++){
//获取对应行的列的内容
cellData = getCellFormatValue(row.getCell(j));
//将这一列的名称作为key,内容作为value,放到map中
data.put((i+1)+"行"+(j+1)+"列",cellData);
}
mapList.add(data);
}else{
break;
}
}
}
return mapList;
}
这样就可以完成对规范的excel表格读取数据了,但是有些时候业务中使用的excel表格比较复杂就可以直接在这个方法上做出相应的改进以完成对自己的业务应用。
修改excel单元格中的内容:
public static void updateCell() {
Workbook wb =null;
String filePath = "E:\\电价简化.xlsx";
//创建Workbook对象
wb = createWorkbook(filePath,wb);
//如果文件不为空
if(wb != null){
Sheet sheetAt = wb.getSheetAt(0);
//修改第8行第7列单元格中的内容
Row row = sheetAt.getRow(7);
Cell cell = row.getCell(6);
cell.setCellValue(0.2);
//修改后让表格中所有公式重新计算
wb.getCreationHelper().createFormulaEvaluator().evaluateAll();
try {
FileOutputStream fileOutputStream = new FileOutputStream(new File(filePath));
wb.write(fileOutputStream);
fileOutputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
附:poi中单元格中的数据类型对应关系
别走,还有彩蛋…
内存泄漏(Memory Leak):一个对象所要做的事情做完了,正常的话这个对象是要被回收掉,但是如果还有对这个对象的其他引用,那么它是不会被回收的,还会继续占用内存。这样持续累加内存很快就会被耗尽。
内存溢出(out of Memory):是指程序在申请内存时,没有足够的内存供申请者使用。
–
内存泄漏:就好比是租了个带钥匙的柜子,存完东西把柜子锁上之后,钥匙丢了或者找不到了,那么这个柜子就无法再继续给下个人使用。
内存溢出:就好比是柜子少使用的人多,柜子都被占用了没有多余的柜子(可能是有效占用也可能是内存泄漏那样非法占用,反正就是没有柜子了)。
公众号:沉默木头人
优快云:沉默木头人(ID:qq_44322555)
喜欢感兴趣长按下面二维码关注吧!
原创不易,不喜勿喷,如果能够帮助到你或对你有所启发欢迎下方留言。
喜欢就开始你无情的三连击:点赞、分享、关注。这将是我写作更多有趣有益有知的好文章的动力;