java-POI处理excel文件方法
处理excel文件的开源库有很多,常见的POI、jxls。。。。。
重点分析下POI处理excel的方法:
1、写文件
// 按照行优先进行数据表格的初始化
public static void createRows() throws IOException { Workbook wb = new HSSFWorkbook();
// 创建表格
Sheet sheet = wb.createSheet("测试Sheet_01");
List<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
int rowCount = list.size(); // 根据数据集设置行数
for (int i = 0; i < rowCount; i++) {
Row row = sheet.createRow(i);// 创建行,表头是第0行
for (int j = 0; j < list.size(); j++) {
// 为第一个单元格赋值
Cell cell = row.createCell(0);
cell.setCellValue("测试数据");
// 为第二个单元格赋值
Cell cell_1 = row.createCell(1);
cell_1.setCellValue("test"); } } FileOutputStream fos = new FileOutputStream("/Users/file/测试的Excel.xls");
wb.write(fos);
if (null != fos) {
fos.close();
}
System.out.println("测试数据完成输出。。");
}
2、读文件
// 将文件内容转换为二维数组
@SuppressWarnings("resource")
private static String[][] getData(FileItem fileItem, int ignoreRows) throws FileNotFoundException, IOException { List<String[]> result = new ArrayList<String[]>();
int rowSize = 0;
BufferedInputStream in = new BufferedInputStream(fileItem.getInputStream()); Workbook wb;
if (fileItem.getName().indexOf(".xlsx") > -1) {
wb = new XSSFWorkbook(in);
} else {
wb = new HSSFWorkbook(in);
}
Cell cell = null;
for (int sheetIndex = 0; sheetIndex < wb.getNumberOfSheets(); sheetIndex++) { Sheet st = wb.getSheetAt(sheetIndex);
// 第一行为标题,不取
for (int rowIndex = ignoreRows; rowIndex <= st.getLastRowNum(); rowIndex++) {
Row row = st.getRow(rowIndex);
if (row == null) {
continue;
} int tempRowSize = row.getLastCellNum() + 1;
if (tempRowSize > rowSize) {
rowSize = tempRowSize;
} String[] values = new String[rowSize];
Arrays.fill(values, "");
boolean hasValue = false;
for (int columnIndex = 0; columnIndex <= row.getLastCellNum(); columnIndex++) { String value = "";
cell = row.getCell(columnIndex);
if (cell != null) {
//按照单元格数据类型进行数据处理
switch (cell.getCellType()) {
case HSSFCell.CELL_TYPE_STRING:
value = cell.getStringCellValue();
break;
case HSSFCell.CELL_TYPE_NUMERIC:
if (HSSFDateUtil.isCellDateFormatted(cell)) {
Date date = cell.getDateCellValue();
if (date != null) {
value = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
} else {
value = "";
} } else {
value = new DecimalFormat("0").format(cell.getNumericCellValue()); }
break;
case HSSFCell.CELL_TYPE_FORMULA:
// 导入时如果为公式生成的数据则无值
if (!cell.getStringCellValue().equals("")) {
value = cell.getStringCellValue();
} else {
value = cell.getNumericCellValue() + "";
}
break;
case HSSFCell.CELL_TYPE_BLANK:
break;
case HSSFCell.CELL_TYPE_ERROR:
value = "";
break;
case HSSFCell.CELL_TYPE_BOOLEAN:
value = (cell.getBooleanCellValue() == true ? "Y" : "N");
break;
default:
value = "";
} } if (columnIndex == 0 && value.trim().equals("")) {
break;
} values[columnIndex] = rightTrim(value);
hasValue = true;
} if (hasValue) {
result.add(values);
} } } in.close();
String[][] returnArray = new String[result.size()][rowSize];
for (int i = 0; i < returnArray.length; i++) {
returnArray[i] = (String[]) result.get(i);
}
return returnArray;
}
上述文件处理的过程能够判断单元格的数据类型,判断逻辑较为繁琐,如果是自行定义模板文件可以直接将文件模板中的单元格数据类型全部处理成文本类型;
这样后台程序全部按照字符串数据类型处理即可,相对容易,而且不易出错。
3、容易出现的错误
对office2003和office2007的处理异常,异常如下
org.apache.poi.poifs.filesystem.OfficeXmlFileException: The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different part of POI to process this data (eg XSSF instead of HSSF)
解决方法是按照上面的
fileItem.getName().indexOf(".xlsx")文件后缀的判断逻辑进行分类处理即可。
java-POI处理excel文件方法的更多相关文章
- Java——poi读取Excel文件
1.创建文件流,打开EXCEL文件 FileInputStream excelFile = new FileInputStream(excelPath); XSSFWorkbook workbook ...
- Java POI导入Excel文件
今天在公司需要做个导入Excel文件的功能,所以研究了一下,参考网上的一些资料总算是做出来了,在此记录一下防止以后忘记怎么弄. 本人用的是poi3.8,所以需要的JAR包如下: poi-3.8.jar ...
- java POI导出Excel文件数据库的数据
在web开发中,有一个经典的功能,就是数据的导入导出.特别是数据的导出,在生产管理或者财务系统中用的非常普遍,因为这些系统经常要做一些报表打印的工作.这里我简单实现导出Excel文件. POI jar ...
- java poi 导出Excel文件
1,导包 poi-3.9-XXX.JAR 2, 创建一个实体对象 public class Student implements Serializable { /** * */ private st ...
- java使用POI实现excel文件的读取,兼容后缀名xls和xlsx
需要用的jar包如下: 如果是maven管理的项目,添加依赖如下: <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --&g ...
- java使用POI操作excel文件,实现批量导出,和导入
一.POI的定义 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 97, 2000也即以.xls为后缀的excel.而poi可以操作Exc ...
- Java Struts2 POI创建Excel文件并实现文件下载
Java Struts2 POI创建Excel文件并实现文件下载2013-09-04 18:53 6059人阅读 评论(1) 收藏 举报 分类: Java EE(49) Struts(6) 版权声明: ...
- JAVA使用POI读取EXCEL文件的简单model
一.JAVA使用POI读取EXCEL文件的简单model 1.所需要的jar commons-codec-1.10.jarcommons-logging-1.2.jarjunit-4.12.jarlo ...
- java使用jxl,poi解析excel文件
public interface JavaExcel { /** * 使用jxl写excel文件 */ public void writeJxlExcel(); /** * 使用jxl读excel文件 ...
- java通过poi编写excel文件
public String writeExcel(List<MedicalWhiteList> MedicalWhiteList) { if(MedicalWhiteList == nul ...
随机推荐
- 关于Golang中database/sql包的学习
go-sql-driver 请求一个连接的函数有好几种,执行完毕处理连接的方式稍有差别,大致如下: db.Ping() 调用完毕后会马上把连接返回给连接池. db.Exec() 调用完毕后会马上把连接 ...
- elasticsearch5.5安装
beat -------- kafka -------- logstash---------------elasticsearch--------------kibana beat配置文件 [roo ...
- ES6新特性1:let和const
本文摘自ECMAScript6入门,转载请注明出处. 一.let 1. ES6增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. { let a ...
- node.js学习之post文件上传 (multer中间件)
express为了性能考虑,采用按需加载的方式,引入各种中间件来完成需求, 平时解析post上传的数据时,是用body-parser. 但这个中间件有缺点,只能解析post的文本内容,(applica ...
- 测试html报告 github python3版本
github源码下载地址:https://github.com/huilansame/HTMLTestRunner_PY3/archive/master.zip 解压后进入文件找到文件:HTMLTes ...
- 用kubeadm 搭建 高可用集群问题记录和复盘整个过程 - 通过journalctl -u kubelet.service命令来查看kubelet服务的日志
1.根据 https://github.com/cookeem/kubeadm-ha/blob/master/README_CN.md 去搭建ha集群,遇到几个问题: runtime networ ...
- 一个考验c语言和数据结构功底的小项目
想测一下自己c语言学习水平的朋友可以做一下这个项目试试,能做出来说明c语言已经入门了 #include<stdio.h> #include<stdlib.h> #inclu ...
- 【vue】本地开发mock数据支持
项目离不开数据渲染的支持,为本地开发配置 数据 支持. (一)方式一:安装JSON Server搭建mock数据的服务器 json Server 是一个创建 伪RESTful服务器的工具. 配置流程 ...
- vue+vux-ui+axios+mock搭建一个简单vue框架
1.首先感谢同事 2.之前一直在做angularjs的项目,目前vue火热,所以自己搭建了一个的vue框架,在此作为记录 vue+vux-ui这里就不介绍了,有很多博客都写的很详细了. 下面简单记录下 ...
- Linux基础-6.系统的启动过程
Linux启动时我们会看到许多启动信息 Linux系统的启动过程并不是大家想象中的那么复杂,其过程可以分为5个阶段: 内核的引导 运行init 系统初始化 建立终端 用户登录系统 init程序的类型: ...