Java操作EXCEL的利器一般都是POI和JXL,鄙人只是POI的忠实粉丝。(其实我是没有用过JXL)。

现在大多数的excel都是07以上的版本,所以我一般是用07的基础上使用POI。

  1. 一、读取单元格

单元格有样式和值,以及值得类型。

样式复制封装成一个函数:

public XSSFCellStyle cloneAllCellStyle(XSSFCell sourceCell, XSSFWorkbook targetWb){

        //创建一个样式
XSSFCellStyle tempStyle = targetWb.createCellStyle(); //样式
//数值格式,创建字符及数字格式
DataFormat format= targetWb.createDataFormat();
//字体
XSSFFont font= targetWb.createFont();
try{
tempStyle.setDataFormat(format.getFormat( sourceCell.getCellStyle().getDataFormatString()));
}catch(NullPointerException e){
tempStyle.setDataFormat((short)0);
}
font.setColor(sourceCell.getCellStyle().getFont().getXSSFColor());
font.setBold(sourceCell.getCellStyle().getFont().getBold());
font.setBoldweight(sourceCell.getCellStyle().getFont().getBoldweight());
try{
font.setCharSet(sourceCell.getCellStyle().getFont().getCharSet());
}catch(POIXMLException e){
font.setCharSet(0);
}
// font.setCharSet(sourceCell.getCellStyle().getFont().getCharSet()); font.setFamily(sourceCell.getCellStyle().getFont().getFamily());
font.setFontHeight(sourceCell.getCellStyle().getFont().getFontHeight());
font.setFontHeightInPoints(sourceCell.getCellStyle().getFont().getFontHeightInPoints());
font.setFontName(sourceCell.getCellStyle().getFont().getFontName());
font.setItalic(sourceCell.getCellStyle().getFont().getItalic());
font.setStrikeout(sourceCell.getCellStyle().getFont().getStrikeout());
// font.setThemeColor(sourceCell.getCellStyle().getFont().getThemeColor());
font.setTypeOffset(sourceCell.getCellStyle().getFont().getTypeOffset());
font.setUnderline(sourceCell.getCellStyle().getFont().getUnderline()); tempStyle.setAlignment( sourceCell.getCellStyle().getAlignment());
tempStyle.setVerticalAlignment(sourceCell.getCellStyle().getVerticalAlignment());
tempStyle.setBorderBottom(sourceCell.getCellStyle().getBorderBottom());
tempStyle.setBorderLeft(sourceCell.getCellStyle().getBorderLeft());
tempStyle.setBorderRight(sourceCell.getCellStyle().getBorderRight());
tempStyle.setBorderTop(sourceCell.getCellStyle().getBorderTop());
tempStyle.setBottomBorderColor(sourceCell.getCellStyle().getBottomBorderXSSFColor());
tempStyle.setLeftBorderColor(sourceCell.getCellStyle().getLeftBorderXSSFColor());
tempStyle.setRightBorderColor(sourceCell.getCellStyle().getRightBorderXSSFColor());
tempStyle.setTopBorderColor(sourceCell.getCellStyle().getTopBorderXSSFColor());
tempStyle.setFillBackgroundColor(sourceCell.getCellStyle().getFillBackgroundColorColor());
tempStyle.setFont(font);
try{
tempStyle.setFillForegroundColor(sourceCell.getCellStyle().getFillForegroundColorColor());
}catch(NullPointerException e){
tempStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());
}
tempStyle.setFillPattern(sourceCell.getCellStyle().getFillPattern());
tempStyle.setRotation(sourceCell.getCellStyle().getRotation());
tempStyle.setHidden(sourceCell.getCellStyle().getHidden());
tempStyle.setWrapText(sourceCell.getCellStyle().getWrapText());
tempStyle.setIndention(sourceCell.getCellStyle().getIndention());
tempStyle.setLocked(sourceCell.getCellStyle().getLocked()); return tempStyle; }

调用直接获取单元格的样式内容。

获取单元格值的类型:cell.getCellType()

根据值类型不同获取不同的值:

    switch (cell.getCellType()) {
case Cell.CELL_TYPE_BLANK:
tempValue.add("");
break;
case Cell.CELL_TYPE_BOOLEAN:
tempValue.add(cell.getBooleanCellValue());
break;
case Cell.CELL_TYPE_ERROR:
tempValue.add(cell.getErrorCellString());
break;
case Cell.CELL_TYPE_FORMULA:
tempValue.add(cell.getCellFormula());
map.put("formulaFlag", true);
break;
case Cell.CELL_TYPE_NUMERIC:
tempValue.add(cell.getNumericCellValue());
break;
case Cell.CELL_TYPE_STRING:
tempValue.add(cell.getStringCellValue());
break;
default:
break;
}

创建内容

//工作空间
XSSFWorkbook targetWb = new XSSFWorkbook();
//sheet
XSSFSheet targetSheet = targetWb.createSheet("行汇总");
// 删除sheet
targetWb.removeSheetAt(index); //index表示第几个sheet,从0开始计数
//row
XSSFRow row=targetSheet.createRow(i+num1-startRow+1);
//cell
XSSFCell cell=row.createCell(j); //j 行
二、 操作单元格函数

POI能够读取函数,然后再把函数写入到单元格中,excel自己计算函数。而函数操作单元格的位置,一般是固定的,所以操作的单元格无法改变。

1、读取函数和写入函数

cell.getCellFormula()

上面的代码中,获取函数的内容,类型为string。

写入函数:

cell.setCellFormula((String)cellValues.get(j));

2、获取函数计算之后的值:

有的地方直接写:

cell.getNumberValue();这样有时候会报错,当cell的内容不是值得时候。

最后做一个异常抛出。

当然有时候也读不出值,读出的值是0.0(double)

读取函数值得另一种方法:

  XSSFFormulaEvaluator evaluator=new XSSFFormulaEvaluator(targetWb);

                                CellValue tempCellValue = evaluator.evaluate(cell); 

                                double cellValue1 =

tempCellValue.getNumberValue(); 

如何你是获取excel的值之后,再写入另一个单元格,建议写入值之前,先改变单元的值类型,变成数值型:

   cell.set(XSSFCell.CELL_TYPE_NUMERIC);

POI读取单元格信息及单元格公式的更多相关文章

  1. poi 读取word 遍历表格和单元格中的图片

    背景 项目需要解析word表格 需要批量导入系统,并保存每行信息到数据库 并且要保存word中的图片, 并保持每条信息和图片的对应关系 一行数据可能有多条图片 解决办法 没有找到现成的代码,怎么办呐? ...

  2. poi读取合并单元格

    poi读取合并单元格 学习了:http://blog.csdn.net/ycb1689/article/details/9764191 进行了列合并单元格的修正:原来是我自己找错了地方: import ...

  3. 无法读取Excel中的数据单元格。有数据,但是读出来全是空值

    C#读取Excel,取值为空的解决办法! C#读取Excel遇到无法读取的解决方法是什么呢?这样在C#读取Excel的过程中有很多问题,那么本文就向你介绍如何解决C#读取Excel遇到无法读取的解决方 ...

  4. POI按照源单元格设置目标单元格格式

    原文:http://jjw198874.blog.163.com/blog/static/1889845522011102401854234/ POI按照源单元格设置目标单元格格式 poi按照一个源单 ...

  5. 读取Excel文件中的单元格的内容和颜色

    怎样读取Excel文件中的单元格的内容和颜色 先创建一个Excel文件,在A1和A2中随意输入内容,设置A1的字体颜色为红色,A2的背景为黄色.需要 using Excel = Microsoft.O ...

  6. .net读取Excel转datatable、.net读取的Excel存在合并单元格并且转成datatable

    项目中经常会遇到Excel导入数据,Excel的模板会可能是存在合并单元格的,模板如下图所示 读取时需要填充合并单元格的值,转成datatable单元格值时,填充合并单元格的值,如下图所示: 合并单元 ...

  7. 使用poi调整字体格式、添加单元格注释、自动调整列宽

    1 创建新的工作铺 import java.io.FileOutputStream; import org.apache.poi.hssf.usermodel.HSSFCell; import org ...

  8. excel小技巧-用于测试用例的编号栏:“获取当前单元格的上一格的值+1”=INDIRECT(ADDRESS(ROW()-1,COLUMN()))+1

    编写用例的时候使用,经常修改用例的时候会需要增加.删除.修改条目,如果用下拉更新数值的方式会很麻烦. 1.使用ctrl下拉,增删移动用例的时候,需要每次都去拉,万一列表比较长,会很麻烦 2.使用ROW ...

  9. 用NPOI创建Excel、合并单元格、设置单元格样式、边框的方法

    本篇文章小编为大家介绍,用NPOI创建Excel.合并单元格.设置单元格样式.边框的方法.需要的朋友参考下 今天在做项目中,遇到使用代码生成具有一定样式的Excel,找了很多资料,最后终于解决了,Ex ...

随机推荐

  1. 使用javascript获取wx.config内部字段解决微信分享

    背景 在微信分享开发的时候我们通常的流程是 <?php require_once "jssdk.php"; $jssdk = new JSSDK("yourAppI ...

  2. js文件加载太慢,JavaScript文件加载加速

    原文出自:https://blog.csdn.net/seesun2012 js脚本加载太慢,JavaScript脚本加载加速(亲测有效) 测试背景: JS文件大小:6.1kB 传统形式加载js文件: ...

  3. MySQL---7、常用操作

    1.表列的添加.修改和删除 2.视图 3.字符集和校对集 4.触发器相关知识

  4. MongoDB的基本使用及java对MongoDB的基本增删改查

    MongoDB的特点 MongoDB 是文档存储数据库,存储结构灵活 MongoDB 支持复杂查询操作.支持序列 MongoDB 采用C++开发,可以做分布式扩展 MongoDB 采用BSON格式存储 ...

  5. [javaSE] GUI(菜单)

    菜单MenuBar Menu  MenuItem 调用Frame对象的setMenuBar()方法,设置菜单,参数:MenuBar对象 import java.awt.FlowLayout; impo ...

  6. 01 使用Git基本方法

    什么是Git? Git是目前世界上最先进的分布式版本控制系统(没有之一). 你得先有一个Git仓库,才能进行操作.创库就是Git存放你要保存的快照的数据的地方. 拥有一个Git仓库,有两种方法. 创建 ...

  7. 系统分析与设计 homework2

    1. 简述瀑布模型.增量模型.螺旋模型(含原型方法)的优缺点. 瀑布模型 优点: 降低了软件开发的复杂度,提高软件开发过程中的透明性,提高软件开发的可管理性. 为项目提供了按阶段划分的检查点. 当前一 ...

  8. [LeetCode]Letter Combinations of a Phone Number题解

    Letter Combinations of a Phone Number: Given a digit string, return all possible letter combinations ...

  9. Oracle数据库基本操作(一) —— Oracle数据库体系结构介绍、DDL、DCL、DML

    一.Oracle数据库介绍 1.基本介绍 Oracle数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/ ...

  10. Tinymce 编辑器添加自定义图片管理插件

    在使用Tinymce的过程中需要用到图片上传功能,而提供的上传插件在上传文件后是给了一个连接地址,就想用户需要什么图片,不能用最直观的方式表现出来么! 虽然官网上也有一个文件管理的插件moxieman ...