处理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文件方法的更多相关文章

  1. Java——poi读取Excel文件

    1.创建文件流,打开EXCEL文件 FileInputStream excelFile = new FileInputStream(excelPath); XSSFWorkbook workbook ...

  2. Java POI导入Excel文件

    今天在公司需要做个导入Excel文件的功能,所以研究了一下,参考网上的一些资料总算是做出来了,在此记录一下防止以后忘记怎么弄. 本人用的是poi3.8,所以需要的JAR包如下: poi-3.8.jar ...

  3. java POI导出Excel文件数据库的数据

    在web开发中,有一个经典的功能,就是数据的导入导出.特别是数据的导出,在生产管理或者财务系统中用的非常普遍,因为这些系统经常要做一些报表打印的工作.这里我简单实现导出Excel文件. POI jar ...

  4. java poi 导出Excel文件

    1,导包  poi-3.9-XXX.JAR 2, 创建一个实体对象 public class Student implements Serializable { /** * */ private st ...

  5. java使用POI实现excel文件的读取,兼容后缀名xls和xlsx

    需要用的jar包如下: 如果是maven管理的项目,添加依赖如下: <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --&g ...

  6. java使用POI操作excel文件,实现批量导出,和导入

    一.POI的定义 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 97, 2000也即以.xls为后缀的excel.而poi可以操作Exc ...

  7. Java Struts2 POI创建Excel文件并实现文件下载

    Java Struts2 POI创建Excel文件并实现文件下载2013-09-04 18:53 6059人阅读 评论(1) 收藏 举报 分类: Java EE(49) Struts(6) 版权声明: ...

  8. JAVA使用POI读取EXCEL文件的简单model

    一.JAVA使用POI读取EXCEL文件的简单model 1.所需要的jar commons-codec-1.10.jarcommons-logging-1.2.jarjunit-4.12.jarlo ...

  9. java使用jxl,poi解析excel文件

    public interface JavaExcel { /** * 使用jxl写excel文件 */ public void writeJxlExcel(); /** * 使用jxl读excel文件 ...

  10. java通过poi编写excel文件

    public String writeExcel(List<MedicalWhiteList> MedicalWhiteList) { if(MedicalWhiteList == nul ...

随机推荐

  1. vue部署到tomcat

    # vue打包到tomcat部署步骤a.进入项目目录运行npm run devb.将dist目录复制到远程服务器下的tomcat/webapps下c.重启tomcatd.浏览器中访问 http:本机i ...

  2. HDU4513:完美队形II(Manacher)

    Description Input Output Sample Input   Sample Output   Solution 才发现我之前不会证$Manacher$复杂度……QAQ 题意是求最长向 ...

  3. BZOJ4180:字符串计数(SAM,二分,矩阵乘法)

    Description SD有一名神犇叫做Oxer,他觉得字符串的题目都太水了,于是便出了一道题来虐蒟蒻yts1999. 他给出了一个字符串T,字符串T中有且仅有4种字符 'A', 'B', 'C', ...

  4. 真机测试出现INSTALL_FAILED_USER_RESTRICTED安装错误

    之前用小米测试的时候遇到一个问题,两个一样型号的手机一个能直接用Android Studio安装公司的项目一个却不可以,总是报INSTALL_FAILED_USER_RESTRICTED错误,具体见下 ...

  5. python matplotlib quiver——画箭头、风场

    理解参考:https://blog.csdn.net/liuchengzimozigreat/article/details/84566650 以下实例 import numpy as np impo ...

  6. mapent

    package test12; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import ja ...

  7. 在handlebars.js {{#if}}条件下的逻辑运算符解决方案

    解决方案.这增加了比较运算符. Handlebars.registerHelper('ifCond', function (v1, operator, v2, options) { switch (o ...

  8. .Net实现表达式计算(公式) 表达式字符串

    文档原址:http://blog.csdn.net/fangxing80/article/details/5992661 实现复杂公式计算,比如含IF分支判断等,可考虑通过调用EXCEL公式获取值. ...

  9. 如何接好CAN的“地”

    [导读]CAN总线以其高可靠性.实时性.灵活性以及严谨的数据处理机制等特点,在工业现场和汽车行业得到广泛应用,但随着环境干扰以及节点数目的增加等对CAN总线的稳定性提出更高的要求,而面对电源地.信号地 ...

  10. ra寄存器定位core

    $ra寄存器中存入的是pc的值(程序运行处的地址),调用函数时,在跳转前,必须保存当前地址(pc的值),以便后来返回.jal $ra 保存后跳转,jr $ra,返回到跳转前,通过$ra保存进入上层栈地 ...